Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android MediaPlayer需要很长时间来准备和缓冲_Java_Android_Buffer_Audio Streaming_Android Mediaplayer - Fatal编程技术网

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

Java Android MediaPlayer需要很长时间来准备和缓冲,java,android,buffer,audio-streaming,android-mediaplayer,Java,Android,Buffer,Audio Streaming,Android Mediaplayer,我的应用程序需要很长时间来准备和缓冲音频流。我读过这个问题,但它只是说人们经历过这个问题,它没有说明如何改善这个问题 我在2.2-4.1.2版本的Android系统中都体验到了这一点 流的比特率适合移动和3G连接。相同的流在同等的iOS应用程序中开始缓冲不到一秒钟 有没有办法指定应该缓冲的时间量?我知道调频收音机应用程序提供了此功能() 谢谢 编辑:我再次测试,发现它只发生在运行姜饼和更高版本(>=2.3)的设备上。我知道Android将底层框架从OpenCore更改为StageFright。那

我的应用程序需要很长时间来准备和缓冲音频流。我读过这个问题,但它只是说人们经历过这个问题,它没有说明如何改善这个问题

我在2.2-4.1.2版本的Android系统中都体验到了这一点

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

有没有办法指定应该缓冲的时间量?我知道调频收音机应用程序提供了此功能()

谢谢


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

由于Android MediaPlayer类不提供对低级别设置(如缓冲区大小)的访问,您真的没有什么可做的。唯一的选择是使用AudioTrack和FFmpeg之类的库制作自己的播放器来进行解码。

我推荐的一件事是使用编码。例如,对于MP4s,确保MOOV原子位于文件的开头(关于如何使用ffmpeg实现这一点,在S/O方面有足够多的问题,等等)。例如,对于MP3,您可以查看不同的编解码器或比特率


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

我已经为这个问题挣扎了几个月。最后我找到了解决办法

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

本教程和源代码详细解释了如何使用

通过修改此代码,很容易创建更好的流媒体播放器

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


编辑:这个答案相当古老。现在我建议不要使用
MediaPlayer
,而是使用
ExoPlayer
。它是可扩展的,稳定的,可以播放多种不同类型的媒体。您可以在这里找到它:

感谢您的建议,不幸的是,在这种情况下,它不是一个合适的选项,因为提供了流,并且我无法控制。如果我能控制溪流的话,这可能会起作用。是的,我正试着按照NDK的食谱做指导。如果你有任何好的教程,实际上得到你的设置做链接到他们。我不敢相信Android平台不足以完成这么一项看似琐碎的任务,以至于你不得不像从另一个平台移植代码一样付出巨大的努力。谢谢,自从问了这个问题后,我得出结论,我需要使用FFMpeg库。不过,我还没有听说过AudioTrack,所以我将对此进行研究。我正在努力弄清楚如何在我的应用程序中实现FFMpeg,但我想这是另一个问题。Steve,我开发了一个开源Android应用程序,它可能实现了您想要实现的目标。我还添加了FFmpeg支持,这样我就可以传输mms:///之类的协议。请参见此处的代码:。如果您有任何问题,请随时通过SourceForge与我联系。我希望这会有所帮助。需要注意的一点是,如果您使用FFMPEG,您可能需要打开项目的源代码(取决于您使用的是GPL还是LGPL许可证)。阅读此处了解更多信息:嗨,威廉,我在我的Note 3(Android版本4.3)上尝试了你的媒体播放器,但仍然得到相同的行为,播放音乐大约一秒钟,然后等待7*8秒,然后继续。。。这与普通MediaPlayer实现的行为相同。如何通过修改缓冲区大小来修复它?在DownloadTask类(DownloadPlayer.java)中,我得到了与burakk完全相同的东西。我越是使用Android,我就越失望。注意:这个解决方案并不适用于所有场景,因为有时候MediaPlayer在暂停、加载新缓冲区和重新启动时会“结巴”。MediaPlayer只是一个写得不好的类。谢谢,这听起来可能是一个合适的替代方案,但是,我现在已经开始在我的应用程序中使用FFMpeg。嗨,史蒂文森,你在使用William Seemann的ServeStream中的代码吗?你为什么不选择流代理解决方案?是的,我是。我的应用程序需要能够播放多种不同的编解码器和格式,并且能够高效地流式传输,因此Williams示例似乎是一种明智的方法。对此我没有真正的答案,但这将帮助您的应用程序减少用户的沮丧()