0

我尝试使用 MediaPlayer (Android ICS) 循环播放 2 个视频并每次交换它们。

它工作得很好,但在随机时间后应用程序冻结并且我收到错误:

[SurfaceView] connect : already connected (cur=3, req=3)
setVideoSurfaceTexture failed : -22

这是我的代码:

public void onCreate(Bundle savedInstanceState) {

        ...
        mMediaPlayer = new MediaPlayer();

        try {

            mMediaPlayer.setDataSource( currentPath );

            mMediaPlayer.setDisplay(mPreview.getHolder());

            mMediaPlayer.setOnBufferingUpdateListener(this);
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.setOnVideoSizeChangedListener(this);
            mMediaPlayer.setOnErrorListener(this);

            mMediaPlayer.prepare();


        } catch (Exception e) {
    }

    public void onPrepared(MediaPlayer mp) {

       mp.start();
    }


    public void onCompletion(MediaPlayer mp) {

    try {
        mMediaPlayer.reset();

        if (mCurrentPath == mPath1)
         mCurrentPath = mPath2;
        else
         mCurrentPath = mPath1;

        mMediaPlayer.setDataSource( mCurrentPath );

        mMediaPlayer.prepare();

    } catch (Exception e) {
    }

}

有任何想法吗 ?

4

3 回答 3

0

stringA == stringB测试不会引起任何问题,但它只会测试是否stringAstringB.

至于这个MediaPlayer问题,我几乎肯定第二个,当MediaPlayer播放完视频时,它会破坏(但不会取消)它使用的视图。我不知道为什么会这样,这给我带来了一个大问题(因为我无法从我的游戏循环线程中替换视图)。

于 2012-08-04T08:11:48.477 回答
0

我使用mediaPlayer.release(),但这确实意味着您必须重新设置所有内容。

于 2013-06-14T14:09:49.143 回答
0

为避免此问题,请执行以下操作

在您的 mediaPlayer 上设置 setOnErrorListener 并在您的 onErorr 方法中执行以下操作

mediaPlayer.setDisplay(null);
mediaPlayer.reset();

在此之后再次设置surfaceholder,然后再启动媒体播放器

mediaPlayer.setDisplay(surfaceHolder1);
mediaPlayer.start();  in onPrepared
于 2012-09-12T19:20:51.107 回答