我一直在尝试使用Android内置的MediaPlayer类来流式传输mp3.文档会告诉我,这应该像以下一样简单:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(URL_OF_FILE);
mp.prepare();
mp.start();
Run Code Online (Sandbox Code Playgroud)
但是我反复得到以下内容.我也尝试过不同的URL.请不要告诉我流式传输不适用于mp3.
E/PlayerDriver( 31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
W/PlayerDriver( 31): PVMFInfoErrorHandlingComplete
E/MediaPlayer( 198): error (1, -4)
E/MediaPlayer( 198): start called in state 0
E/MediaPlayer( 198): error (-38, 0)
E/MediaPlayer( 198): Error (1,-4)
E/MediaPlayer( 198): Error (-38,0)
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢,谢谢S
我发现Android MediaPlayer准备使用不同的流进行实时流播放所花费的时间差异很大.
硬数据
我在prepareAsync()和onPrepared(MediaPlayer mp)回调之间添加了日志记录,并且每次都测试了几个流.每个流的时间非常一致(+/- 1秒),结果如下:
测试是在带有Android 2.3.4的Nexus S上进行的3G连接(~1100 Kbps).
播放非流式MP3音频文件不是问题.
以下是我如何播放流的片段:
准备MediaPlayer:
...
mediaPlayer.setDataSource(playUrl);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();
...
Run Code Online (Sandbox Code Playgroud)
然后在onPrepared(MediaPlayer mp):
mediaPlayer.start();
Run Code Online (Sandbox Code Playgroud)
为什么要准备一些流而不是其他流需要这么长时间?上述数据似乎表明它可能基于已缓冲的数据量而不是缓冲的音频内容的持续时间.真的可以吗?
更新:我已经使用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秒内开始播放.
我的应用程序需要很长时间来准备和缓冲音频流.我已经读过这个问题为什么Android的MediaPlayer需要这么长的时间来准备一些直播的流媒体?然而,它只是说人们已经遇到过这个问题,它没有说明如何改善这个问题.
我在所有版本的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倍.