Android MediaCodec:减小mp4视频大小

15

我正在寻找一种“压缩”mp4视频的方法。为了实现这一点,我想要减小视频的分辨率和/或降低帧速率。

经过长时间的研究,我认为可以使用MediaCodec和相关API来实现:

-> MediaExtractor从mp4文件中提取编码的媒体数据。 -> MediaCodec(解码器):解码每一帧以进行后续处理。 -> MediaCodec(编码器):此时,我想这就是我们应该设置MediaFormat参数的地方,例如视频分辨率,这应该有助于减小mp4文件的最终大小。 -> MediaMuxer用于生成mp4文件(MinSDK 18,这可能是一个问题,但目前还可以...)。

我不想使用SurfaceView/TextureView。 至于音频,我不想处理以降低质量。

我看了所有这里的示例: http://bigflake.com/mediacodec/

我也看过CTS源代码模块。

我还看了几个类似于这样的项目: https://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java

当然,我也读了数十篇stackoverflow上的文章。

问题是我还没有找到任何适用于此目的的代码示例。我尝试将各种代码片段组合到一个项目中,但并没有真正起作用。

谢谢。


4
请分享一下,如果你找到了这个问题的解决方案。 - Kanchan
1
你最终解决了这个问题吗? - Mike Walker
1个回答

6
你想要的最接近的东西可能是bigflake上的DecodeEditEncodeTest。你不需要SurfaceViewTextureView,因为你不想显示视频,但你需要使用SurfaceTexture。测试代码生成视频,然后解码/编辑/编码,然后测试编码输出。你想要的是解码-编辑-编码部分。创建编码器时,给它任何你想要的大小。它创建的输入表面将被调整为匹配大小。缩放是由GPU执行的,因为它将GL纹理(来自SurfaceTexture)呈现到编码器的输入表面上。你必须决定GLES线性过滤是否提供了你所需的质量水平。(你可以在ExtractMpegFramesTest中看到类似的东西,它在进行提取时将所有内容缩放到640x480。在这种情况下,它将帧转换为PNG而不是将其馈送到编码器中,因此与你的情况不太适用。)
理论上,丢帧很容易:只需不将其提交给编码器即可。但在实践中,如果输入的帧是不规则间隔的,则会有些困难。例如,如果输入是“frame1 frame2 ... pause ... frame4 frame5”,而您删除了frame2,则最终会停留在frame1上,这可能看起来很奇怪。您可以使用演示时间戳来确定时间。
表面输入和MediaMuxer(用于将H.264保存为.mp4)需要API 18+。对于旧版本的Android,您可能需要使用第三方库,如ffmpeg

DecodeEditEncodeTest 只能解码视频,但如何进行编码呢?基本上,我想要减小视频大小以便在服务器上发送。 - Kanchan
它被称为“DecodeEditEncodeTest”,因为它在解码和编码视频时修改(编辑)颜色。 - fadden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接