android - 使用 MediaCodec 编辑帧和编码

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

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

最佳答案

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

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

虽然 Grafika 没有完全相似的完整项目,但您可以从现有项目开始,然后尝试使用 grafika 中的以下任一子项目 Continuous CameraShow + capture camera ,当前将 Camera 帧(馈送到 SurfaceTexture)渲染到视频(和显示)。 所以本质上,唯一的变化是 MediaCodec 将帧馈送到 SurfaceTexture 而不是 Camera

谷歌 CTS DecodeEditEncodeTest完全相同,可以作为引用,使学习曲线更平滑。

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

checkout Show + capture camera 中的过滤器对于相同的插图。

解码-编辑-编码流程

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

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

虽然现代硬件编解码器支持同步视频编码和解码,但我建议,在同一个线程中进行解码、渲染和编码,尤其是在您的情况下,当性能不是主要因素时现在关心。这将有助于避免必须自行处理同步和/或跳帧的问题。

关于android - 使用 MediaCodec 编辑帧和编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34932623/

相关文章:

opengl-es - 如何模拟 GL_TEXTURE_EXTERNAL_OES 纹理?

android - 如何在没有设备的情况下在 Nexus 4 上调试 OPENGL ES 2.0 错误?

Android OpenGL es 2.0 无法重新加载对象上的纹理。

android - 多个dex文件定义lorg/apache/commons/io/IOUtils;

android - 不能支持chrome 39 api 19版本

python - 在python中使用vid.stab将ffmpeg的输出文件捕获到一个变量中

android - Phonegap 视频捕捉崩溃

android - 如果 AudioRecord API 中的数据没有被读取但正在连续录制,它是否会丢失任何音频帧?

android - 防止作弊 : Is it really a mobile device, 还是模拟器?

java - java中向servlet发送图像如何在servlet中获取图像