我在处理一个视频流应用程序时遇到了一个奇怪的问题。实际上,在所有测试设备上,视频/音频的流式传输都很好。然而,在任何使用RTSP URL的4.0+设备上,prepare()会立即返回(这会导致在视频加载时无法向用户提供适当的反馈,并干扰我已经放置的一些其他系统)。
下面是我初始化和设置MediaPlayer的代码块,但请记住以下几点:
- 我的initPlayer方法是从AsyncTask中调用的。 - 视频最终会正确播放,但prepare()立即返回会导致在视频加载期间无法向用户提供反馈。 - 整个过程中没有发生任何错误。 - 在我的OnPreparedListener中,通过start()调用MediaPlayer,当prepare()返回时尚未准备好播放时,这显然会成为一个问题。 - HTTP流似乎正常工作,并且在所有4.0以下的测试设备上不会发生此问题。
我已经花了很长时间来尝试解决这个问题,但没有找到其他遇到此问题的人。非常感谢您能提供任何想法。
下面是我初始化和设置MediaPlayer的代码块,但请记住以下几点:
- 我的initPlayer方法是从AsyncTask中调用的。 - 视频最终会正确播放,但prepare()立即返回会导致在视频加载期间无法向用户提供反馈。 - 整个过程中没有发生任何错误。 - 在我的OnPreparedListener中,通过start()调用MediaPlayer,当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);
}
};