我正在遇到一个我正在处理的视频流应用程序的奇怪问题.实际的视频/音频流在我的所有测试设备上都能正常工作.然而,在看似任何设备4.0上,当使用RTSP URL时,prepare()立即返回(这会导致在视频加载时向用户提供适当反馈的问题并干扰我现有的其他一些系统).
下面是我初始化和设置MediaPlayer的代码块,但请记住以下几点:
>我的initPlayer方法是从AsyncTask调用的.
>视频最终会正常播放,但准备返回会在视频加载过程中立即导致用户缺乏反馈.
>在整个过程中不会发生任何错误
>通过我的OnPreparedListener中的onPrepared方法在MediaPlayer上调用start(),这在prepare()实际准备好播放之前返回时显然会成为一个问题.
> HTTP流似乎工作正常,并且在4.0以下的每个测试设备上都不会出现问题.
我一直试图解决这个荒谬的时间,并且无法找到遇到此问题的其他任何人.任何想法将不胜感激.
public void initPlayer() { //We first need to make sure the MediaPlayer isn't null if(mMediaPlayer==null){ mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnPreparedListener(mediaPlayerPreparedListener); mMediaPlayer.setOnCompletionListener(mediaPlayerCompletionListener); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } //If a video/stream has been chosen while another is already playing else if(mMediaPlayer.isPlaying()){ mMediaPlayer.reset(); } //Video is not in full screen mode second = false; try { mMediaPlayer.setDataSource(videoString); holder = mPreview.getHolder(); mMediaPlayer.setDisplay(holder); mMediaPlayer.prepare(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //onPreparedListener private OnPreparedListener mediaPlayerPreparedListener = new OnPreparedListener(){ public void onPrepared(MediaPlayer mp) { mp.start(); vidPb.setVisibility(View.INVISIBLE); } };
解决方法
使用
mp.prepareAsync()
,因为它更适合流媒体.使用prepare()块直到MediaPlayer准备好播放或发生IllegalStateException.此外,在android 4(ICS)中,任何UI线程上的阻塞都更加严格,并且可能导致出现ANR(活动未响应)对话框.
最后一个想法,尽量避免使用e.printStackTrace();在Android应用程序中.
相反,使用Log.e(“TAG_STRING”,e.getMessage(),e);将错误打印到您可以从logcat访问的Android日志记录系统.
总而言之,它应该看起来像这样:
try { mMediaPlayer.setDataSource(videoString); holder = mPreview.getHolder(); mMediaPlayer.setDisplay(holder); mMediaPlayer.prepareAsync(); } catch (IllegalArgumentException e) { Log.e("TAG_STRING",e); } catch (SecurityException e) { Log.e("TAG_STRING",e); } catch (IllegalStateException e) { Log.e("TAG_STRING",e); } catch (IOException e) { Log.e("TAG_STRING",e); }