某些流的 Google Cast 速度较慢

Mar*_*kan 4 android audio-streaming internet-radio google-cast chromecast

我有一个 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

我感谢任何帮助或想法如何解决这个问题。

Bra*_*rad 5

第二个链接有一个更大的缓冲区可以刷新给你。

吞吐量分析

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

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

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

我感谢任何帮助或想法如何解决这个问题。

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

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