我正在编写一个视频播放器,我试图在每个解码帧上应用过滤器,然后在屏幕上显示它。
我使用MediaCodec
来提取一帧。帧被解码为一个由SurfaceTexture
创建的表面,渲染(屏幕外)到pbuffer,用glReadPixels()
提取
我已经使用了ExtractMpegFramesTest作为这个页面的一个例子:
http://bigflake.com/mediacodec/在这一点上,我有ByteBuffer
与提取的像素,我做一些后处理(转换为灰度,或运行边缘检测等)
完成后,我想在屏幕上渲染过滤后的帧。我可以再次用MediaCodec对它进行编码,并使用VideoView来渲染它,但这样每一帧都是不必要的编码和解码。
是否有一种有效的方法将这些帧呈现在屏幕上?
简单的答案是:将像素上传到GLES纹理,使用glTexImage2D()
,并渲染一个四边形。
根据您的过滤,您可能还希望考虑完全在GLES中执行操作。这明显更快,但有点难以实现,因为过滤器必须在片段着色器(GLSL)中编写。
你可以在Grafika中找到一个基于着色器的图像过滤的例子(演示视频在这里),以及glTexImage2D()
的一些使用,以发送位图数据到纹理