在图像渲染后,MediaPlayer无法渲染到TextureView

时间:2014-07-23 04:53:21

标签: android video android-mediaplayer textureview

我有一个MediaPlayer呈现视频TextureView。这很有效。

现在,我希望在给定时间内在此TextureView上显示静止图像,然后让MediaPlayer将视频呈现为相同的TextureView

这是我渲染位图的代码:

Canvas canvas = mTextureView.lockCanvas();
canvas.drawBitmap(sourceBitmap, matrix, new Paint());
mTextureView.unlockCanvasAndPost(canvas);

在此之后,任何播放视频的尝试都会导致从视频播放器触发ERROR_INVALID_OPERATION( - 38)。

我尝试评论对drawBitmap的调用,但错误仍然存​​在。似乎调用lockCanvas后跟unlockCanvasAndPost的简单行为导致TextureView不适合MediaPlayer使用。

我是否可以通过某种方式将TextureView重置为允许MediaPlayer使用该状态的状态?

我正在使用Android 4.2.2。

2 个答案:

答案 0 :(得分:8)

由于Android应用框架的限制(至少从Android 4.4开始),你无法做到这一点。

作为TextureView基础的SurfaceTexture是缓冲消费者。 MediaPlayer是缓冲生成器的一个示例,Canvas是另一个示例。附加生产者后,必须先将其分离才能附加第二个生产者。

麻烦的是,无法分离基于软件的(Canvas)缓冲区生成器。可能有,但不是。所以一旦你用Canvas画画,你就会陷入困境。 (有一个关于这种效果的说明here。)

可以分离GLES制作人。例如,在Grafika的一个视频播放器类中,您可以找到一个clearSurface()方法,使用GLES将表面清除为黑色。请注意,EGL上下文和窗口是在方法范围内创建并显式发布的。您可以扩展方法以显示图像。

答案 1 :(得分:2)

我最近遇到过类似的问题。我的目的是将视频缩略图直接显示在TextureView中,然后使用相同的TextureView播放视频,而不使用其他ImageView来显示视频缩略图。

我在@ fadden的评论中实现了第二种方法,使用EGL将视频缩略图绘制到同一TextureView

此外,我们还可以在GLSurfaceView中使用两个纹理来实现相同的目标。一个外部OES纹理可播放连续视频,另一个2D纹理可显示视频缩略图。

可以在此github项目EGLPoster中找到完整的演示。

希望任何到达这里的人都会有所帮助。