27

我的应用程序需要很长时间来准备和缓冲音频流。我已经阅读了这个问题为什么 Android 的 MediaPlayer 需要这么长时间才能准备一些直播流进行播放?,但是它只是说人们遇到了这个问题,它没有说明如何改进这个问题。

我在从 2.2 到 4.1.2 测试的所有版本的 Android 中都遇到了这种情况。

这些流具有适合移动和 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 倍。

4

3 回答 3

15

几个月来我一直在为这个问题苦苦挣扎。最后我找到了解决方案。

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

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

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

谷歌开发者在这里真的搞砸了。

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

于 2014-02-07T09:33:29.287 回答
9

由于 Android MediaPlayer 类不提供对缓冲区大小等较低级别设置的访问,因此您确实无能为力。唯一的选择是使用 AudioTrack 和 FFmpeg 之类的库来制作自己的播放器来进行解码。

于 2012-12-02T07:30:31.077 回答
0

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

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

于 2012-12-02T07:36:31.097 回答