2014-02-27 102 views
11

我正在寻找一种方法来“压缩”MP4视频。为了实现这一点,我想降低视频的分辨率和/或降低FPS。Android MediaCodec:减少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

当然,我看过几十个计算器的职位。

问题是我还没有找到任何代码示例适用于此porpuse。我尝试了各种代码并将它们放在一个项目中,但实际上并不奏效。

谢谢。

+3

请分享,如果你发现这个问题的任何解决方案。 – Kanchan

+0

你能解决这个问题吗? –

回答

4

最接近你想要的东西可能是DecodeEditEncodeTest在bigflake上。您不需要SurfaceViewTextureView,因为您并未尝试显示该视频,但需要使用SurfaceTexture

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

(你可以看到在ExtractMpegFramesTest类似的东西,它可以扩展一切为640x480,因为它是干什么的提取。在这种情况下,它转换帧PNG而不是将它们送入编码器,所以它不是适用于您的情况。 )

删除帧在理论上很容易:只是不要将其提交给编码器。在实践中,如果输入具有不规则间隔的帧,则会更困难。如果输入是“frame1 frame2 ... pause ... frame4 frame5”,并且你放弃了frame2,那么你最终会在frame1上暂停,这可能看起来很奇怪。您可以使用演示时间戳来计算时间。

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

+0

DecodeEditEncodeTest只解码视频,但如何对其进行编码。基本上我想减少视频大小,以便在服务器上发送。 – Kanchan

+0

任何建议。 – Kanchan

+0

它被称为“DecodeEditEncodeTest”,因为它解码并编码视频,修改(编辑)它的颜色。 – fadden