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