3

を使用して rtsp ビデオ ストリームを再生MediaPlayerし、SurfaceView. で MediaPlayer の初期作業をActivity.onResume()行い、 でリリースしActivity.onPause()ます。通常のアクティビティにジャンプして( と呼ばれるonPause)、戻る(と呼ばれる)と正常に動作しonResumeます。

問題は、ビデオの再生中に、ダイアログのようなアクティビティにジャンプして戻ると、ビデオを更新できず (ビデオ フレームがフリーズする)、オーディオは問題ないことです。この状況でビデオ ストリームを正常に再生するにはどうすればよいですか? SurfaceView を更新するには?

皆さん、ありがとうございました。

ps: 上記のように、通常の Activityはウィンドウ全体を埋める Activity であり、ダイアログのような Activityは AlertDialog のように見える Activity であり、通常はandroid:theme="@android:style/Theme.Dialog"GoogleVoice アプリのようにテーマを持つ Activity です。この種類のアクティビティがフォアグラウンドの場合、バックグラウンド アクティビティの一部を見ることができます。

編集:私のコードは少し複雑で、キーのスニペットを貼り付けます:

@Override
protected void onCreate(Bundle savedInstanceState) {
    //....
    mPreview = (SurfaceView) this.findViewById(R.id.playerView);
    mHolder = mPreview.getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

@Override
protected void onResume() {
    mPath = "rtsp://10.10.20.42/Viral.mp4";
    // Create a new media player and set the listeners
    mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setDataSource(mPath);
    // mMediaPlayer.setDisplay(holder);
    mMediaPlayer.setScreenOnWhilePlaying(true);
    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mMediaPlayer.prepareAsync();
    mMediaPlayer.setOnBufferingUpdateListener(this);
    mMediaPlayer.setOnCompletionListener(this);
    mMediaPlayer.setOnPreparedListener(this);
    mMediaPlayer.setOnVideoSizeChangedListener(this);
    mMediaPlayer.setOnErrorListener(this);

    super.onResume();
}

@Override
protected void onPause() {
    if (mMediaPlayer != null) {

        mMediaPlayer.release();
        mMediaPlayer = null;
    }
    super.onPause();
}
4

1 に答える 1

2

さて、私はついにこの問題を解決しました。SurfaceHolderMediaPlayer(call ) をリセットしませんでしたmMediaPlayer.setDisplay(SurfaceHolder holder)

これが私のコードです:

@Override
protected void onResume() {
    mPath = "rtsp://10.10.20.42/Viral.mp4";
    // Create a new media player and set the listeners
    mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setDataSource(mPath);
    // mMediaPlayer.setDisplay(holder);
    mMediaPlayer.setScreenOnWhilePlaying(true);
    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mMediaPlayer.prepareAsync();
    mMediaPlayer.setOnBufferingUpdateListener(this);
    mMediaPlayer.setOnCompletionListener(this);
    mMediaPlayer.setOnPreparedListener(this);
    mMediaPlayer.setOnVideoSizeChangedListener(this);
    mMediaPlayer.setOnErrorListener(this);

    if (mHolder != null) {
        mMediaPlayer.setDisplay(mHolder);
    }
    super.onResume();
}

@Override
public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
    Log.d(TAG, "surfaceChanged called");
    this.mHolder = surfaceholder;
    if (mMediaPlayer != null) {
        mMediaPlayer.setDisplay(surfaceholder);
    }
}
于 2013-03-28T08:58:18.200 に答える