Google 某些流的播放速度较慢

Google Cast slow for some streams

我有一个 Android 应用程序,它通过 Google Cast 从网络(主要是 icecast)播放直播流。一切都运行良好且快速,但现在某些流开始(发出声音)需要更长的时间。这可能与 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);

奇怪的是,有些流非常快,而有些则不是:

  1. http://stream.funradio.sk:8000/dance128.mp3 - 这会在超过 20 秒后发出声音
  2. http://stream.expres.sk:8000/128.mp3 - 这会在 1 秒内发出声音

我还注意到 load() 函数的 ResultCallback 对于第二个流几乎是立即触发的,而第一个大约需要 3 秒。

感谢任何帮助或解决此问题的想法。

第二个 link 有更大的缓冲区要刷新给你。

此图显示吞吐量。第一个曲线是我在 stream.funradio.sk:8000 上测试第一个 URL 时。第二个曲线是当我在 stream.expres.sk:8000.

上测试第二个 URL 时

您会注意到,在两者中,连接开始时都会出现大量数据。这些旨在尽快填充播放器缓冲区,以立即开始播放。您还会注意到第二个流在连接开始时有更多这样的内容。这是因为它有一个音频数据缓冲区可以使用。

每个流的缓冲区大小是可配置的。配置第二个流的人们认为可以增加此缓冲区,从而使听众能够快速启动,这已被发现对于留住听众至关重要。这里唯一真正的权衡是延迟。第二个流有效地预先录制了几秒钟的音频以发送给新客户。对于大多数互联网广播电台来说,这种延迟根本不是问题。最好让该流快速启动,并且对于连接不稳定的听众来说更可靠。

I appreciate any help or idea how to fix this.

除了代理流之外,您无能为力。 Android 设备和 Chromecast 对 MP3 流特别挑剔,需要大量数据才能与它们同步。

此外,算法 Chrome 用于确定缓冲区是否足够满以在不停止播放的情况下不知道您正在为其提供无线电流,并看到速率下降和缓冲区在开始之前多一点。这个问题可以通过完全编写你自己的播放器来解决,它可以缓冲数据,然后将其传递给解码器,而不是仅仅给底层系统一个 URL。在网络上,这可以通过媒体源扩展来完成。对于Android,我没有太多经验。