我的应用程序需要很长时间来准备和缓冲音频流.我已经读过这个问题为什么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倍.
注意:当我发布这个问题时,我不在我工作的公司工作,因此,即使可能会有一些很好的答案,我实际上也不会测试它们,因为我没有理由 (除了促进社区;这可能导致我有一天这样做).
但是,如果一些解决问题的办法是由许多其他comunity成员提拔,我可能会选择选择它作为问题正确答案经历了这么多年我最初发布这个问题之后.
与此同时,我希望有些答案可能会帮助你们中的一些人遇到这个问题.堆栈溢出!
我们的应用程序必须从在线资源中传播音乐(我不能自由地披露该来源).
为什么在S3上开始流式传输需要2分钟?
由于MEDIA_ERROR_UNKOWN,我已经能够弄清楚Media Player对象进入错误状态 - 很棒.对我帮助不大.因此,在使用OnErrorListener处理onError时,我重置了Media Player对象,然后调用startPlaying来完成剩下的工作 - 设置数据源等.
成员:
private ProgressBar playSeekBar;
private ImageView ivPlay;
private ImageView ivPause;
private ImageView ivBuffer;
private MediaPlayer mPlayer;
private ImageView ivInfo;
private AudioManager audio;
Run Code Online (Sandbox Code Playgroud)
初始化媒体播放器(和Visualizer - 这不是问题的目的)
private void initialMediaPlayerAndVisualizer() {
Log.d(TAG, "Initial Media Player and Visualizer");
playSeekBar = (ProgressBar) findViewById(R.id.progressBar1);
playSeekBar.setMax(100);
playSeekBar.setVisibility(View.GONE);
mPlayer = new MediaPlayer();
Log.d(TAG, "Create onErrorListener");
MediaPlayer.OnErrorListener errorListener = new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int …Run Code Online (Sandbox Code Playgroud) 嘿,我正在使用MediaPlayer播放常规的ShoutCast流.使用prepareAsync()和开始播放的处理程序,代码很简单.虽然它与DI.FM或ETN.FM(http://u10.di.fm:80/di_progressive)等一些流程完美无瑕,但与其他人(http://mp3.wpsu.org:8000/)一起赢得了超过准备状态.也没有其他听众.
//Uri streamUri = Uri.parse("http://u10.di.fm:80/di_progressive"); /* works */
Uri streamUri = Uri.parse("http://mp3.wpsu.org:8000/"); /* stuck on prepare state */
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(this.getBaseContext(), streamUri);
mediaPlayer.prepareAsync();
Run Code Online (Sandbox Code Playgroud)
任何反馈表示赞赏!