我正在使用的视频流应用程序遇到一个奇怪的问题。视频/音频的实际流在我所有的测试设备上都运行良好。但是,在看似任何 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);
}
};