我有一个Android应用,可通过Google Cast播放来自网络的实时流(主要是冰播)。一切正常且快速,但是现在某些流开始(发出声音)需要更长的时间。这可能与Chromecast固件升级有关,因为我的Chromecast设备最近更新到了最新版本(1.32.124602)。
这就是我通过Cast播放流的方式:
MediaMetadata metadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_GENERIC);
metadata.putString(MediaMetadata.KEY_TITLE, "My title");
metadata.putString(MediaMetadata.KEY_SUBTITLE, "My subtitle");
metadata.addImage(new WebImage(myImageUri);
MediaInfo mediaInfo = new MediaInfo.Builder(streamUrl)
.setStreamType(MediaInfo.STREAM_TYPE_LIVE)
.setContentType("audio/mpeg")
.setMetadata(metadata)
.build();
MediaLoadOptions options = new MediaLoadOptions.Builder()
.setAutoplay(true)
.setPlayPosition(0)
.build();
sessionManager.getCurrentCastSession().getRemoteMediaClient().load(mediaInfo, options);
奇怪的是,有些流非常快,而另一些却没有:
我还注意到,load()函数的ResultCallback几乎立即触发了第二个流,而第一个流大约需要3秒。
我非常感谢您提供任何帮助或想法,以解决此问题。
答案 0 :(得分:3)
第二个链接具有更大的缓冲区可以刷新给您。
此图显示吞吐量。第一个弯曲是当我在stream.funradio.sk:8000
上测试第一个URL时。第二种形式是我在stream.expres.sk:8000
上测试了第二个URL。
您会注意到,在这两种连接的开头都有大量的数据。它们旨在尽快填充播放器缓冲区,以立即开始播放。您还将注意到,在连接开始时,第二个流具有更多的功能。这是因为它准备好了音频数据的缓冲区。
每个流的缓冲区大小是可配置的。配置第二个流的人们认为可以增加此缓冲区,从而可以使侦听器快速启动,这对于保留侦听器至关重要。唯一真正的权衡是延迟。第二个流已经有效地预先录制了几秒钟的音频,以发送给新客户。对于大多数互联网广播电台而言,此延迟根本不是问题。最好让该流快速启动,并且 对于具有斑点连接的听众来说更可靠。
我非常感谢您提供任何帮助或想法,以解决此问题。
代理流的简短内容,您无能为力。 Android设备和Chromecast对MP3流特别挑剔,并且需要大量数据才能与其同步。
此外,Chrome正在使用该算法来确定缓冲区是否足够满,可以播放而不会停顿,这并不知道您正在向其发送广播流,并且看到速率下降并在开始播放前缓冲了更多缓冲区。可以通过完全编码自己的播放器来解决此问题,该播放器可以缓冲数据,然后将其传递给解码器,而不仅仅是给底层系统提供URL。在网络上,这可以通过Media Source Extensions完成。对于Android,我在那儿没有太多经验。