Android MediaPlayer.prepare()需要很长时间才能使用API​​> 2.3(是因为StageFright?)

时间:2012-06-28 13:44:50

标签: android audio-streaming stagefright

(此问题部分与Why does it take so long for Android's MediaPlayer to prepare some live streams for playback?

有关

我尝试在Android MediaPlayer的不同设备上播放以下音频流:http://newsstream1.publicradio.org

我终于注意到设备之间的prepare()方法的持续时间差异很大(= 1秒)(设备不到1秒),设备> 2.2(最多可能需要30秒......)

它与底层音频框架有关吗? (OpenCore VS StageFright)

有人已经体验过吗?您是否知道使用StageFright媒体播放器读取mp3流的更好解决方案?

3 个答案:

答案 0 :(得分:4)

好吧,经过挖掘后,我得出的结论是,加载时间取决于MediaPlayer的缓冲区大小(在固件中以某种方式硬编码),并且没有任何可以做的改变它。

答案 1 :(得分:1)

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

MPR新闻流:27秒(http://newsstream1.publicradio.org:80/),64 kbps MPR古典音乐流:15秒(http://classicalstream1.publicradio.org:80/),128 kbps MPR当前流:7秒(http://currentstream1.publicradio.org:80/),128 kbps PRI流:52秒(http://pri-ice.streamguys.biz/pri1),32 kbps 除了两个128 kbps流之间的差异外,比特率和缓冲持续时间之间存在非常好的相关性。

在任何情况下,Android都是开源的,因此您可以随时查看它正在做什么。不幸的是,prepareAsync()prepare()是本机方法,并且似乎也会从本机进程调度与缓冲区相关的事件。

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

派生自here.

答案 2 :(得分:0)

它不应该花那么长时间,但MediaPlayer API有一个asyncPrepare()方法,建议您使用它来保持应用程序平稳运行。