使用 MediaCodec 编辑帧和编码
Editing frames and encoding with MediaCodec
我能够解码 mp4 视频。如果我使用 Surface
配置解码器,我可以在屏幕上看到视频。现在,我想编辑帧(添加一条黄线或什至更好地重叠一个小图像)并将视频编码为新视频。没有必要显示视频,我现在不关心性能。(如果我在编辑时显示帧,如果编辑功能需要很多时间,我可能会有间隙),那么,你有什么建议我,无论如何用 GlSurface 配置解码器并使用 OpenGl
(GLES),或者用 null 配置它并以某种方式将 Bytebuffer
转换为 Bitmap
,修改它,并将位图编码为一个字节数组?我还在 Grafika 页面中看到,您可以将 Surface
与自定义 Rederer 一起使用,并使用 OpenGl
(GLES)。谢谢
您将不得不使用 OpenGLES
。 ByteBuffer/Bitmap 方法不能给出现实 performance/features.
既然您已经能够(使用 MediaExtractor 和编解码器)将视频解码为 Surface
,您需要使用 SurfaceTexture
将 Surface 创建为 External Texture
并使用 GLES 渲染到从 MediaCodec
检索到的另一个 Surface
配置为编码器。
虽然 Grafika
没有完全相似的完整项目,但您可以从现有项目开始,然后尝试使用 grafika Continuous Camera or Show + capture camera 中的以下任一子项目,目前呈现 Camera
帧(馈送到 SurfaceTexture)到视频(和显示)。
所以本质上,唯一的变化是 MediaCodec
将帧馈送到 SurfaceTexture
而不是 Camera
.
Google CTS DecodeEditEncodeTest 完全一样,可以作为参考,让学习曲线更平滑
使用这种方法,你当然可以做各种各样的事情,比如操纵视频的播放速度(快进和 slow-down),在场景中添加各种叠加层,播放 colors/pixels 在视频中使用着色器等
查看 Show + capture camera 中的 filters 以获得相同的插图。
Decode-edit-Encode流量
使用 OpenGLES 时,'editing' 帧是通过使用 GLES 渲染到编码器的输入表面而发生的。
如果解码和渲染+编码在不同的线程中分开,你一定会每帧跳过几帧,除非你在两个线程之间实现某种同步以使解码器等待直到渲染+该帧的编码发生在另一个线程上。
虽然现代硬件编解码器支持同步视频编码和解码,但我建议,do the decoding, rendering and encoding in the same thread
,特别是在您的情况下,当性能不是主要问题时。这将有助于避免必须自己处理同步的问题 and/or 帧跳转。
我能够解码 mp4 视频。如果我使用 Surface
配置解码器,我可以在屏幕上看到视频。现在,我想编辑帧(添加一条黄线或什至更好地重叠一个小图像)并将视频编码为新视频。没有必要显示视频,我现在不关心性能。(如果我在编辑时显示帧,如果编辑功能需要很多时间,我可能会有间隙),那么,你有什么建议我,无论如何用 GlSurface 配置解码器并使用 OpenGl
(GLES),或者用 null 配置它并以某种方式将 Bytebuffer
转换为 Bitmap
,修改它,并将位图编码为一个字节数组?我还在 Grafika 页面中看到,您可以将 Surface
与自定义 Rederer 一起使用,并使用 OpenGl
(GLES)。谢谢
您将不得不使用 OpenGLES
。 ByteBuffer/Bitmap 方法不能给出现实 performance/features.
既然您已经能够(使用 MediaExtractor 和编解码器)将视频解码为 Surface
,您需要使用 SurfaceTexture
将 Surface 创建为 External Texture
并使用 GLES 渲染到从 MediaCodec
检索到的另一个 Surface
配置为编码器。
虽然 Grafika
没有完全相似的完整项目,但您可以从现有项目开始,然后尝试使用 grafika Continuous Camera or Show + capture camera 中的以下任一子项目,目前呈现 Camera
帧(馈送到 SurfaceTexture)到视频(和显示)。
所以本质上,唯一的变化是 MediaCodec
将帧馈送到 SurfaceTexture
而不是 Camera
.
Google CTS DecodeEditEncodeTest 完全一样,可以作为参考,让学习曲线更平滑
使用这种方法,你当然可以做各种各样的事情,比如操纵视频的播放速度(快进和 slow-down),在场景中添加各种叠加层,播放 colors/pixels 在视频中使用着色器等
查看 Show + capture camera 中的 filters 以获得相同的插图。
Decode-edit-Encode流量
使用 OpenGLES 时,'editing' 帧是通过使用 GLES 渲染到编码器的输入表面而发生的。
如果解码和渲染+编码在不同的线程中分开,你一定会每帧跳过几帧,除非你在两个线程之间实现某种同步以使解码器等待直到渲染+该帧的编码发生在另一个线程上。
虽然现代硬件编解码器支持同步视频编码和解码,但我建议,do the decoding, rendering and encoding in the same thread
,特别是在您的情况下,当性能不是主要问题时。这将有助于避免必须自己处理同步的问题 and/or 帧跳转。