0

我将 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 是空的。有任何方法可以使用媒体播放器在同一表面上绘图。

4

1 回答 1

3

你不能这样做。

“表面”是生产者-消费者对的生产者侧。你不能有两个生产者。(如果你想要血淋淋的细节,请参阅此文档。)

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

于 2014-07-07T15:23:31.900 回答