在MediaCodec生成的Surface上应用片段着色器,用于lockCanvas()

时间:2016-03-04 10:14:04

标签: android opengl-es mediacodec

到目前为止,使用MediaCodec生成视频的大多数代码都使用纯OpenGL或从 MediaCodec生成的 Surface锁定Canvas并对其进行编辑。我可以将它们混合使用吗?

例如,如果我以后一种方式生成框架,是否可以在编辑Surface之前或之后在 MediaCodec生成的 Surface上应用 Fragment Shader 帆布?

1 个答案:

答案 0 :(得分:1)

Surface是生产者 - 消费者对的生产者端。一次只能连接一个生产者,因此您不能在同一个Surface上使用GLES和Canvas,而无需断开连接并连接另一个。

最后我检查过(Lollipop)没有办法断开画布。所以不可能来回切换。

您需要做的是:

  • 创建Canvas backed by a Bitmap
  • 渲染到Canvas。
  • 使用glTexImage2D()将渲染的位图上传到GLES。
  • 使用所需的片段着色器使用GLES Blit位图。

与上传相关的开销是不可避免的,但请记住,您可以以较小的分辨率绘制位图,并让GLES对其进行扩展。因为您绘制的是Bitmap而不是Surface,所以没有必要为每次更新重绘整个屏幕,因此有机会减少Canvas渲染开销。

无论Surface连接的是什么,上述所有内容都可以保存 - 可以是MediaCodec,SurfaceView,SurfaceTexture等。