Android 视频实时过滤

Android video real time filtering

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

我用MediaCodec提取一帧。帧被解码为从 SurfaceTexture 创建的 Surface,渲染(离屏)到 pbuffer,用 glReadPixels()

提取

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

http://bigflake.com/mediacodec/

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

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

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

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

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

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