Android视频实时过滤

时间:2015-10-12 16:16:02

标签: java android mediacodec

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

我使用MediaCodec来提取框架。帧被解码为从SurfaceTexture创建的Surface,渲染(屏幕外)为pbuffer,用glReadPixels()

提取

我在此页面中使用 ExtractMpegFramesTest 作为示例:

http://bigflake.com/mediacodec/

此时我对提取的像素ByteBuffer进行了一些后处​​理(转换为灰度,或运行边缘检测等)。

完成后,我想在屏幕上渲染过滤后的帧。 我可以再次使用MediaCodec对其进行编码,并使用VideoView进行渲染,但这样就可以对每个帧进行编码和解码。

有没有一种有效的方法在屏幕上渲染这些帧?

1 个答案:

答案 0 :(得分:2)

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

根据您的过滤,您可能还需要考虑完全在GLES中执行操作。这个速度要快得多,但有点难以实现,因为过滤器必须写在片段着色器(GLSL)中。

您可以在Grafikademo video here)中找到基于着色器的图像过滤示例,以及使用glTexImage2D()将位图数据发送到纹理的一些用法。