Android MediaPlayer需要很长时间来准备和缓冲

时间:2012-10-10 14:01:52

标签: java android buffer audio-streaming android-mediaplayer

我的应用程序需要很长时间来准备和缓冲音频流。我已经阅读了这个问题Why does it take so long for Android's MediaPlayer to prepare some live streams for playback?,但它只是说人们遇到了这个问题,但没有说明如何改善这个问题。

我在Android的所有版本中都遇到过这种情况,从2.2 - 4.1.2开始测试。

流量适合移动和3G连接的比特率。在相同的iOS应用程序中,相同的流只需不到一秒钟即可开始缓冲。

有没有办法指定应该缓冲的时间量?我知道Tune In广播应用程序提供此功能(https://play.google.com/store/apps/details?id=tunein.player)。

感谢。

编辑:我再次测试,发现它只发生在运行Gingerbread及以上的设备上(> = 2.3)。我知道Android将底层框架从OpenCore改为StageFright。那么我该如何优化媒体框架呢?旧的HTC Wildfire可以准备,流式传输和播放,这比全新的HTC One X和Nexus 7快10倍。

3 个答案:

答案 0 :(得分:13)

几个月来,我一直在努力解决这个问题。最后我找到了解决方案。

真正的问题在于MediaPlayer类的实现。特别是MediaPlayer缓冲数据的方式。这就是为什么解决方案是创建自己的缓冲,将其保存到临时文件并将其提供给MediaPlayer。

本教程和源代码完全解释了如何操作。 http://androidstreamingtut.blogspot.nl/2012/08/custom-progressive-audio-streaming-with.html

通过调整此代码,可以轻松创建更好的流媒体播放器。

谷歌开发人员真的搞砸了。

编辑:这个答案相当陈旧。现在我建议不要使用MediaPlayer并使用ExoPlayer代替。它可扩展,稳定,可以播放许多不同类型的媒体。您可以在此处找到它:https://github.com/google/ExoPlayer/

答案 1 :(得分:9)

由于Android MediaPlayer类无法访问较低级别的设置(如缓冲区大小),因此您无能为力。唯一的选择是让自己的播放器使用AudioTrack和像FFmpeg这样的库进行解码。

答案 2 :(得分:0)

我建议的一件事就是使用编码。例如,对于MP4,确保MOOV Atom位于文件的开头(关于如何使用ffmpeg执行此操作的S / O有足够的问题,等等)。使用MP3,您可以查看不同的编解码器或比特率。

例如,您可以尝试在线找到的大量音频文件,如果您看到一个不需要很长时间缓冲的文件,请尝试以相同的方式对文件进行编码。