9

私がやりたいことは、ビデオの再生を開始する前に、SurfaceView に背景画像を表示することです。

  1. SurfaceView の背景として jpeg 画像を描画しようとしました。出来た。
  2. また、SurfaceView でビデオを再生しようとしました。それもうまくいきました。

しかし、surfaceCreated 関数で Surface の背景として jpeg 画像を描画し、ビデオを再生しようとしたとき。「[SurfaceView] connect: already connected」というエラーが表示されました。

何か案は?ありがとう。

ここに部分的なコードがあります

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
    Bitmap background = BitmapFactory.decodeResource(getResources(), R.drawable.pic1);
    float scale = (float) background.getHeight()/(float)mPreview.getHeight();
    int newWidth = Math.round(background.getWidth()/scale);
    int newHeight = Math.round(background.getHeight()/scale);
    mScaledBitmap = Bitmap.createScaledBitmap(background, newWidth, newHeight, true);
    Canvas canvas = mHolder.lockCanvas();
    canvas.drawBitmap(mScaledBitmap, 0, 0, null);
    mHolder.unlockCanvasAndPost(canvas);
    } catch (Exception e)
    {}
            // initialize mediaplayer
    try {
        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setDataSource("/sdcard/Movies/2.mp4");
        mMediaPlayer.setDisplay(mHolder);
        mMediaPlayer.setLooping(true);
        mMediaPlayer.prepare();
        mMediaPlayer.setOnPreparedListener(this);
        mMediaPlayer.setOnCompletionListener(this);
    } catch (IOException e) {
        e.printStackTrace();
        Log.e(TAG, "error: " + e.getMessage(), e);
    } catch (Exception e) {
        e.printStackTrace();
        Log.e(TAG, "error: " + e.getMessage(), e);  
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub
    Log.i(TAG, "surfaceChanged(w="+ width + ", h=" + height);
    mSurfaceWidth = width;
    mSurfaceHeight = height;
    mVideoWidth = mMediaPlayer.getVideoWidth();
    mVideoHeight = mMediaPlayer.getVideoHeight();
    Log.i(TAG, "video size w=" + mVideoWidth + ", h=" + mVideoHeight +")");     
}


@Override
public void onPrepared(MediaPlayer mp) {
    // TODO Auto-generated method stub
    Log.i(TAG, "onPrepared");
    mMediaPlayer.start();
}
4

2 に答える 2

0

問題は、mHolderオブジェクトをローカルホルダーオブジェクトに変更するだけで、外側のSurfaceHolderを使用できることだと思います。私の側では試すことができません。

于 2013-12-30T10:01:06.467 に答える
0

Here are couple of things that I see wrong based on my experience with MediaPlayer.

  • First, use prepareAysnc() instead of prepare().
  • Second, set the listeners first before calling prepare(). In your case, mMediaPlayer.setOnPreparedListener(this)

is followed by prepare(). Consider scenario where prepare() upon completion looks for OnPreparedListener and does not finds it, because you haven't set it yet. And setting it afterwards is not going to help since, media player is already in PREPARED state and thus you'd never get onPrepared() callback.

Thus in your case, mMediaPlayer.start() may never get executed.

In general, set all the necessary listeners first, before invoking their triggers.

于 2015-08-03T19:14:04.903 に答える