我正在处理我正在处理的视频流应用程序的奇怪问题。实际的视频/音频流在我的所有测试设备上都能正常工作。但是,在看似任何设备4.0+时,当使用RTSP URL时,prepare()会立即返回(这会导致在视频加载时向用户提供适当反馈的问题,并干扰我现有的其他一些系统)。 / p>
以下是我初始化和设置MediaPlayer的代码块,但请记住以下几点:
我一直试图解决这个荒谬的时间,并且找不到其他遇到此问题的人。任何想法都将不胜感激。
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);
}
};
答案 0 :(得分:0)
使用mp.prepareAsync()
,因为它更适合流媒体。使用prepare()
阻止,直到MediaPlayer准备好播放或发生IllegalStateException。此外,在android 4(ICS)中,任何UI线程上的阻塞都更加严格,可能会导致出现ANR(活动无响应)对话框。
最后一个想法,尽量避免在Android应用中使用e.printStackTrace();
。
相反,使用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.getMessage(), e);
} catch (SecurityException e) {
Log.e("TAG_STRING", e.getMessage(), e);
} catch (IllegalStateException e) {
Log.e("TAG_STRING", e.getMessage(), e);
} catch (IOException e) {
Log.e("TAG_STRING", e.getMessage(), e);
}