安卓视频实时滤镜

3
我正在编写一个视频播放器,在将每个解码帧显示在屏幕上之前,我尝试对其应用滤镜。
我使用MediaCodec提取帧。这些帧被解码到从SurfaceTexture创建的Surface中,渲染(离屏)到pbuffer中,然后使用glReadPixels()提取。
我已经使用了此页面上的ExtractMpegFramesTest作为示例:

http://bigflake.com/mediacodec/

此时,我使用ByteBuffer提取像素,并在其上执行一些后处理(如转换为灰度或运行边缘检测等)。
完成后,我想在屏幕上呈现筛选后的帧。我可以再次使用MediaCodec进行编码,并使用VideoView进行渲染,但这样每帧都会被不必要地编码和解码。
有没有有效的方法来在屏幕上渲染这些帧?

我正在处理同样的问题,你能告诉我你是怎么做的吗? - Sanjay Hirani
@SanjayHirani 请查看 http://bigflake.com/mediacodec/ 上的 ExtractMpegFramesTest。我使用了这个示例中 CodecOutputSurface 类的修改版本。希望能对你有所帮助! - Gábor Angyal
1个回答

2
简单来说,需要使用glTexImage2D()将像素上传到GLES纹理中,并渲染一个矩形。根据您的滤镜效果,您可能还需要考虑完全在GLES中执行操作。这样做速度更快,但稍微有些难度,因为必须在片段着色器(GLSL)中编写滤镜。您可以在Grafika中找到基于着色器的图像滤镜示例(演示视频在此),以及使用glTexImage2D()将位图数据发送到纹理的一些用法。

谢谢,这正是我所需要的! - Gábor Angyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接