手动绘制到MediaPlayer的表面

时间:2014-07-07 05:15:44

标签: android drawing android-mediaplayer surface textureview

我有一个TextureView,我设置为MetoaPlayer播放视频:

TextureView textureView = new TextureView(context);
addView(textureView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
textureView.setSurfaceTextureListener(this);

@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {}

@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface)
{
    return false;
}

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)
{
    this.surface = new Surface(surface);
    mediaPlayer.setSurface(this.surface);
    prepareAndPlay();
}

视频正常播放。

但是,当我尝试在表面上画出一个表面上,视频播放没有开始!

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)
{
    this.surface = new Surface(surface);
    mediaPlayer.setSurface(this.surface);

    // DRAW FIRST FRAME ON SURFACE

    Bitmap bitmap = BitmapFactory.decodeFile(firstFramePath);
    Canvas canvas = surface.lockCanvas(null);
    canvas.drawBitmap(bitmap, new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), new Rect(0, 0, canvas.getWidth(), canvas.getHeight()), null); 
    bitmap.recycle();
    surface.unlockCanvasAndPost(canvas);

    prepareAndPlay();
}

当我在未开始播放的媒体播放器上调用play()时。

我想,Surface移动到无效状态,MediaPlayer无法播放视频。但是logcat是空的。 有任何方法可以在媒体播放器上绘制相同的表面。

1 个答案:

答案 0 :(得分:3)

你不能这样做。

“表面”是生产者 - 消费者对的生产者方。你不能有两个生产者。 (如果您需要详细信息,请参阅this doc。)

使用TextureView,您可以使用setSurfaceTexture()更改底层SurfaceTexture,这应该允许您从一个切换到另一个。在Grafika's“双重解码”活动中使用此功能(出于不同的原因)。