gpt4 book ai didi

android - 为什么 Android 的 MediaPlayer 需要这么长时间才能准备一些直播流进行播放?

转载 作者:IT王子 更新时间:2023-10-28 23:47:33 27 4
gpt4 key购买 nike

我发现 Android MediaPlayer 准备使用不同流进行实时流播放所需的时间存在很大差异。

硬数据

我在 prepareAsync() 和 onPrepared(MediaPlayer mp) 回调之间添加了日志记录,并分别测试了几个流。每个流的时间非常一致(+/- 1 秒),结果如下:

  1. MPR 新闻流:27 秒 (http://newsstream1.publicradio.org:80/)
  2. MPR 古典音乐流:15 秒 (http://classicalstream1.publicradio.org:80/)
  3. MPR 当前流:7 秒 (http://currentstream1.publicradio.org:80/)
  4. PRI 流:52 秒 (http://pri-ice.streamguys.biz/pri1)

测试是在 Nexus S 上执行的,搭载 Android 2.3.4,3G 连接 (~1100 Kbps)。

播放非流式 MP3 音频文件不是问题。

以下是我如何播放流的 fragment :

准备媒体播放器:

...
mediaPlayer.setDataSource(playUrl);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();
...

然后在onPrepared(MediaPlayer mp):

mediaPlayer.start();

为什么准备一些流需要这么长时间而不准备其他流?上述数据似乎表明它可能基于已缓冲的数据数量,而不是缓冲音频内容的持续时间 .真的可以吗?

更新:我已经在具有 Android 1.6、2.2 和 2.3.4 的物理设备以及具有 1.6、2.1、2.2、2.3.1 和 2.3.3 的模拟器上测试了直播。我只看到 2.3.3 和 2.3.4 的长时间延迟。旧版本会在 5 秒内开始播放。

最佳答案

似乎它正在缓冲固定数量的数据,而不是固定的时间。对于任何不知道各种类型 NPR 流的比特率的人来说,数据看起来像:

  1. MPR 新闻流:27 秒 (http://newsstream1.publicradio.org:80/),64 kbps
  2. MPR 古典音乐流:15 秒 (http://classicalstream1.publicradio.org:80/),128 kbps
  3. MPR 当前流:7 秒 (http://currentstream1.publicradio.org:80/),128 kbps
  4. PRI 流:52 秒 (http://pri-ice.streamguys.biz/pri1),32 kbps

除了两个 128 kbps 流之间的差异之外,比特率和缓冲持续时间之间存在非常好的相关性。

无论如何,Android 是开源的,所以您可以随时look at what it's doing .不幸的是,prepareAsync()prepare() 是 native 方法,而且似乎与缓冲区相关的事件也是从 native 进程分派(dispatch)的。

您是否尝试将 OnBufferingUpdateListener 附加到 MediaPlayer 以获取有关缓冲区状态的更细粒度的更新?比较事件传递的速率以及缓冲区在不同流中每个事件的填充百分比可能会很有趣。您可以将其与流比特率进行交叉引用,如果 4 秒的 32 kbps 缓冲填充缓冲区的百分比与 1 秒 128 kbps 的缓冲相同,那么我认为您会找到答案。

关于android - 为什么 Android 的 MediaPlayer 需要这么长时间才能准备一些直播流进行播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6582908/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com