【问题标题】:MediaPlayer cannot render to TextureView after image render图像渲染后 MediaPlayer 无法渲染到 TextureView
【发布时间】:2014-07-23 04:53:20
【问题描述】:

我有一个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。

【问题讨论】:

    标签: android video android-mediaplayer textureview


    【解决方案1】:

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

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

    问题在于无法分离基于软件的 (Canvas) 缓冲区生成器。可能有,但没有。因此,一旦您使用 Canvas 绘图,您就会陷入困境。 (有一条说明here。)

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

    【讨论】:

    • 如果我有一个 MediaPlayer 作为缓冲区生产者,将我的表面清除为黑色的最简单方法是什么?
    • @Gilbert:您可能应该将其作为一个新问题发布。解决这个问题一般有三种形式:(1)让MediaPlayer来做,可能是播放单帧黑视频; (2)断开MediaPlayer,用GLES清除,重新连接MediaPlayer; (3) 在其前面放置一个尺寸相同的不透明黑色 View。第三个使用 TextureView 非常简单,因为与 SurfaceView 不同,它与其他 View 配合得很好。
    • @fadden 我们可以使用 2 种方式在 SurfaceView 上绘制位图,只需使用 Canvas.drawBitmap() API 并使用 opengl 手动绘制。两者都是硬件加速的,但哪个更快?我认为使用opengl手动绘制需要内存复制,我们应该首先使用texImage2D API将位图上传到GPU中的纹理。
    • 上次我检查过,画布渲染到 Surface 上不是硬件加速的。如果每次绘制时位图都不同,那么最好在 CPU 上进行工作。如果您要多次绘制同一个位图,那么 GPU 是更好的选择。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      相关资源
      最近更新 更多