我有一个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。
答案 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中找到完整的演示。
希望任何到达这里的人都会有所帮助。