Java Android视频实时过滤

Java Android视频实时过滤,java,android,android-mediacodec,Java,Android,Android Mediacodec,我正在写一个视频播放器,在屏幕上显示之前,我尝试在每个解码帧上应用一个过滤器 我使用MediaCodec提取帧。帧被解码为从SurfaceTexture创建的曲面,渲染(屏幕外)到pbuffer,用glReadPixels()提取 我使用了提取mpegframestest作为本页的示例: 此时,我有了ByteBuffer和提取的像素,我在这些像素上进行一些后处理(转换为灰度,或运行边缘检测等) 完成后,我想在屏幕上渲染过滤后的帧。 我可以再次使用MediaCodec对其进行编码,并使用Vide

我正在写一个视频播放器,在屏幕上显示之前,我尝试在每个解码帧上应用一个过滤器

我使用
MediaCodec
提取帧。帧被解码为从
SurfaceTexture
创建的曲面,渲染(屏幕外)到pbuffer,用
glReadPixels()提取

我使用了提取mpegframestest作为本页的示例:

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

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


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

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

取决于您的筛选,您可能还想考虑完全在GLES中执行操作。这要快得多,但实现起来有点困难,因为过滤器必须写在片段着色器(GLSL)中


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

谢谢,这正是我需要的!我也在做同样的事情,你能帮我一下你是怎么做到的吗?@SanjayHirani请访问。我使用了这个示例中的CodeOutputSurface类的修改版本。我希望有帮助!