使用MediaCodec编辑帧和编码

时间:2016-01-21 19:27:43

标签: android video opengl-es-2.0 mediacodec mediamuxer

我能够解码mp4视频。如果我使用Surface配置解码器,我可以在屏幕上看到视频。现在,我想编辑帧(添加黄线或甚至更好地重叠小图像)并将视频编码为新视频。没有必要显示视频,我现在不关心性能。(如果我在编辑时显示帧,如果编辑功能需要花费很多时间就会有间隙),那么,你是什么?建议我使用GlSurface配置解码器并使用OpenGl(GLES),或者将其配置为null并以某种方式将Bytebuffer转换为Bitmap,修改它并编码位图作为字节数组?另外我在Grafika页面中看到,你可以使用Surface和自定义Rederer并使用OpenGl(GLES)。谢谢

1 个答案:

答案 0 :(得分:4)

您必须使用OpenGLES。 ByteBuffer / Bitmap方法无法提供逼真的性能/功能。

现在您已经能够将视频(使用MediaExtractor和Codec)解码为Surface,您需要使用SurfaceTexture创建Surface {{1}并使用GLES渲染到从配置为编码器的External Texture检索到的另一个Surface

虽然MediaCodec没有完全相似的完整项目,但您可以从现有项目开始,然后尝试在grafika Continuous Camera或{{3}中使用以下任一子项目},当前呈现Grafika帧(馈送到SurfaceTexture)到视频(和显示)。 基本上,唯一的变化是CameraMediaCodec而不是SurfaceTexture提供框架。

Google CTS Show + capture camera完全相同,可用作参考,以使学习曲线更顺畅。

使用这种方法,你当然可以做各种各样的事情,比如操纵视频的播放速度(快进和慢速),在场景中添加各种叠加层,使用着色器在视频中播放颜色/像素等

DecodeEditEncodeTest中结帐过滤器以获取相同的插图。

解码 - 编辑 - 编码流程

使用OpenGLES时,'编辑'帧的发生是通过使用GLES渲染到编码器的输入表面来实现的。

如果解码和渲染+编码在不同的线程中分离出来,你必须每帧跳过几帧,除非你在两个线程之间实现某种同步,以使解码器等到渲染+该帧的编码发生在另一个线程上。

虽然现代硬件编解码器支持同步视频编码和解码,但我建议,Camera,尤其是在您的情况下,当时性能不是主要问题。这将有助于避免必须在您自己和/或帧跳转上处理同步的问题。