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()
将位图数据发送到纹理的一些用法。
我正在编写一个视频播放器,我尝试在每个解码帧上应用过滤器,然后再将其显示在屏幕上。
我用MediaCodec
提取一帧。帧被解码为从 SurfaceTexture
创建的 Surface,渲染(离屏)到 pbuffer,用 glReadPixels()
我使用 ExtractMpegFramesTest 作为此页面的示例:
http://bigflake.com/mediacodec/
此时我有 ByteBuffer
和提取的像素,我对其进行了一些 post 处理(转换为 灰度 ,或 运行边缘检测等)
完成后,我想在屏幕上渲染过滤后的帧。 我可以再次使用 MediaCodec 对其进行编码并使用 VideoView 来渲染它,但这样一来,每个帧都被不必要地编码和解码了。
有没有一种有效的方法可以在屏幕上渲染这些帧?
简单的答案是:使用 glTexImage2D()
将像素上传到 GLES 纹理,然后渲染四边形。
根据您的筛选,您可能还需要考虑完全在 GLES 中执行操作。这明显更快,但更难实现,因为过滤器必须在片段着色器 (GLSL) 中编写。
您可以在 Grafika (demo video here 中找到基于着色器的图像过滤示例,以及 glTexImage2D()
将位图数据发送到纹理的一些用法。