Android MediaCodec:减少mp4视频大小

Ric*_*ion 13 video mp4 android resolution mediacodec

我正在寻找一种"压缩"mp4视频的方法.为此,我想降低视频的分辨率和/或降低FPS.

经过长时间的研究,我认为这样做的方法是使用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上阅读了几十篇帖子.

问题是我还没有找到任何适合这个porpuse的代码示例.我尝试将各种代码片段放在一起放在一个项目中,但实际上并没有用.

谢谢.

fad*_*den 5

与您想要的最接近的可能是bigflake上的 DecodeEditEncodeTest。您不需要SurfaceViewor TextureView,因为您不想显示视频,但您需要使用SurfaceTexture.

测试代码生成视频,然后解码/编辑/编码,然后测试编码输出。您需要解码-编辑-编码部分。创建编码器时,给它任何你想要的大小。它创建的输入表面将调整大小以匹配。缩放由 GPU 执行,因为它将 GL 纹理(从SurfaceTexture)渲染到编码器的输入表面上。您必须决定 GLES 线性过滤是否提供您需要的质量水平。

(您可以在ExtractMpegFramesTest 中看到类似的东西,它在提取时将所有内容缩放到 640x480。在这种情况下,它将帧转换为 PNG,而不是将它们送入编码器,因此它不适用于您的情况。)

丢帧理论上很容易:只是不要将其提交给编码器。实际上,如果输入具有不规则间隔的帧,则会有点困难。如果输入是“frame1 frame2 ... pause ... frame4 frame5”,而你放下 frame2,你最终会在 frame1 上暂停,这可能看起来很奇怪。您可以使用演示时间戳来确定时间。

表面输入和MediaMuxer(需要将 H.264 保存为 .mp4)需要 API 18+。对于旧版本的 Android,您可能需要使用第三方库,例如ffmpeg