Android视频实时过滤



我正在编写一个视频播放器,我试图在每个解码帧上应用过滤器,然后在屏幕上显示它。

我使用MediaCodec来提取一帧。帧被解码为一个由SurfaceTexture创建的表面,渲染(屏幕外)到pbuffer,用glReadPixels()提取

我已经使用了ExtractMpegFramesTest作为这个页面的一个例子:

http://bigflake.com/mediacodec/

在这一点上,我有ByteBuffer与提取的像素,我做一些后处理(转换为灰度,或运行边缘检测等)

完成后,我想在屏幕上渲染过滤后的帧。我可以再次用MediaCodec对它进行编码,并使用VideoView来渲染它,但这样每一帧都是不必要的编码和解码。

是否有一种有效的方法将这些帧呈现在屏幕上?

简单的答案是:将像素上传到GLES纹理,使用glTexImage2D(),并渲染一个四边形。

根据您的过滤,您可能还希望考虑完全在GLES中执行操作。这明显更快,但有点难以实现,因为过滤器必须在片段着色器(GLSL)中编写。

你可以在Grafika中找到一个基于着色器的图像过滤的例子(演示视频在这里),以及glTexImage2D()的一些使用,以发送位图数据到纹理

最新更新