Android 4.0.4 MediaPlayer使用RTSP网址准备问题

时间:2012-09-21 20:52:16

标签: android media-player rtsp android-4.0-ice-cream-sandwich

我正在处理我正在处理的视频流应用程序的奇怪问题。实际的视频/音频流在我的所有测试设备上都能正常工作。但是,在看似任何设备4.0+时,当使用RTSP URL时,prepare()会立即返回(这会导致在视频加载时向用户提供适当反馈的问题,并干扰我现有的其他一些系统)。 / p>

以下是我初始化和设置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);
        }
    };

1 个答案:

答案 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);
    }