5

I have a MediaPlayer rendering videos to a TextureView. This is working.

Now, I want to display a still image on this TextureView for a given time, then get the MediaPlayer to render a video to the same TextureView.

Here's my code to render the bitmap:

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

After this, any attempts to play videos result in ERROR_INVALID_OPERATION (-38) being triggered from the video player.

I tried commenting out the call to drawBitmap, and the error still happened. It seems that the simple act of calling lockCanvas followed by unlockCanvasAndPost results in the TextureView being unsuitable for the MediaPlayer to use.

Is there some way that I can reset the TextureView to a state that allows the MediaPlayer to use it?

I'm working on Android 4.2.2.

4

2 回答 2

9

由于 Android 应用程序框架的限制(至少从 Android 4.4 开始),您不能这样做。

作为 TextureView 基础的 SurfaceTexture 是一个缓冲区使用者。MediaPlayer 是缓冲区生产者的一个例子,Canvas 是另一个例子。附加生产者后,必须先将其分离,然后才能附加第二个生产者。

问题是没有办法分离基于软件(Canvas)的缓冲区生产者。可能有,但没有。因此,一旦您使用 Canvas 绘图,您就会陷入困境。(这里有一个关于这种效果的注释。)

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

于 2014-07-23T15:39:33.147 回答
3

我最近遇到了类似的问题。我的意图是直接显示视频缩略图TextureView,然后使用相同TextureView的播放视频,而不使用另一个ImageView显示视频缩略图。

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

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

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

希望它对任何到达这里的人都有帮助。

于 2016-10-29T05:16:28.580 回答