3

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

4

1 回答 1

8

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

现在您已经能够将 Video(使用 MediaExtractor 和 Codec)解码为 a Surface,您需要使用SurfaceTextureused 将 Surface 创建为 anExternal Texture并使用 GLES 渲染到从配置为编码器的另一个Surface检索到的。MediaCodec

虽然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尤其是在您的情况下,当性能现在不是主要问题时。这将有助于避免必须自己处理同步和/或帧跳转的问题。

于 2016-01-21T20:51:55.603 回答