【问题标题】:Android video real time filteringAndroid视频实时过滤
【发布时间】:2015-10-13 03:12:28
【问题描述】:

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

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

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

http://bigflake.com/mediacodec/

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

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

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

【问题讨论】:

  • 我也在做同样的事情,你能帮我看看你是怎么做到的吗?
  • @SanjayHirani 在bigflake.com/mediacodec 查看 ExtractMpegFramesTest。我使用此示例中的 CodecOutputSurface 类的修改版本。希望对您有所帮助!

标签: java android android-mediacodec


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,这正是我需要的!
猜你喜欢
  • 1970-01-01
  • 2017-01-07
  • 2017-03-20
  • 1970-01-01
  • 2022-01-20
  • 2020-11-28
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多