使用MediaCodec编辑帧和编码

Gab*_*tyn 2 video android opengl-es-2.0 mediacodec mediamuxer

我能够解码mp4视频。如果我使用来配置解码器,则Surface可以在屏幕上看到视频。现在,我要编辑帧(添加黄线甚至更好地重叠小图像)并将视频编码为新视频。不必显示视频,现在我也不在乎性能。(如果在编辑时显示帧,如果编辑功能花费很多时间,我可能会有空隙),那么,您对此有何建议?我是使用GlSurface来配置解码器并使用OpenGl(GLES),还是将其配置为null并以某种方式将其转换Bytebuffer为a Bitmap,对其进行修改,然后将位图编码为字节数组?另外我在Grafika页面中看到,您可以将a Surface与自定义Rederer一起使用并使用OpenGl(GLES)。谢谢

Sah*_*jaj 5

您将不得不使用OpenGLES。ByteBuffer / Bitmap方法无法提供逼真的性能/功能。

既然您已经能够将Video(使用MediaExtractor和Codec)解码为Surface,则需要使用SurfaceTexture用于将Surface创建为,External Texture并使用GLES渲染为SurfaceMediaCodec配置为编码器检索的另一个。

尽管Grafika没有完全相似的完整项目,但是您可以从现有项目开始,然后尝试使用grafika Continuous CameraShow + capture camera中的以下子项目之一,它们当前将Camera帧(馈送到SurfaceTexture)渲染为视频(和显示)。因此,从本质上讲,唯一的变化是将MediaCodec饲喂框架SurfaceTexture改为Camera

Google CTS DecodeEditEncodeTest的功能完全相同,可以用作参考,以使学习曲线更平滑。

使用这种方法,您当然可以做各种事情,例如控制视频的播放速度(快进和慢下来),在场景上添加各种叠加层,使用着色器在视频中播放颜色/像素等。

显示+捕获相机中的检出过滤器获取相同插图。

解码-编辑-编码流程

使用OpenGLES时,通过使用GLES渲染到编码器的输入表面进行帧的“编辑”。

如果解码和渲染+编码在不同的线程中分开,则势必会每帧跳过几帧,除非您在两个线程之间实现某种同步,以使解码器一直等到该帧的渲染+编码具有发生在另一个线程上。

尽管现代硬件编解码器支持同步视频编码和解码,但我还是建议do the decoding, rendering and encoding in the same thread,特别是在您的情况下,此时性能不是主要问题。这将有助于避免必须自己处理同步和/或跳帧的问题。