如何使用MediaCodec在Android上压缩mp4视频?

18
在我的Android应用中,我想通过更改分辨率、比特率来压缩mp4视频。我不想使用FFmpeg(因为我不想使用NDK),所以我决定使用MediaCodec API。
以下是我的逻辑步骤:
1. 使用 MediaExtractor 提取视频文件,然后解码数据。 2. 创建新的编码器,设置新的分辨率、比特率,并对数据进行编码。 3. 使用 MediaMuxer 创建一个新的 mp4 文件。
我的问题是:我不知道如何设置解码器输出和编码器输入之间的连接。我可以将视频解码到 Surface 上,也可以从 Surface 上编码新的视频。但我不明白它们之间如何连接。
我阅读了这些链接:Android MediaCodec: Reduce mp4 video sizeVideo compression on android using new MediaCodec Library 以及 Bigflake 的示例:https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java 有谁能给我一个清晰的解释,告诉我该怎么做吗?

要进行直接复制,您只需从编码器获取输入表面(通过 getInputSurface())并将其作为输出表面(通过 configure())传递给解码器即可。 - fadden
请查看此答案 http://stackoverflow.com/questions/31796711/fast-video-compression-like-whatsapp/31823187#31823187 - Jorge E. Hernández
1
MediaCodec API相当晦涩难懂且文档不全。我已经在这个问题上发起了一项奖励计划,希望有人能够公布他们已经拥有的类。 将大型磁盘上的mp4文件转换为小型磁盘上的mp4文件。所有使用MediaCodec。 那样做可以节省无数的生命!(好吧,也许不是所有的生命,但肯定会挽救我的 ^^) - Taiko
@TOP 我正在使用以下答案中的压缩库来压缩视频文件。但是我无法从中获取音频。请帮助我解决这个问题。 - Ravindra Kushwaha
你能分享一下你最终是怎么做到的样例吗?谢谢。 - james04
1个回答

17

视频重采样器 resampler = new VideoResampler();resampler.addSamplerClip( new SamplerClip( inputUri ) );resampler.setOutput( outputUri );resampler.setOutputResolution( Resolution.RESOLUTION_720P.getWidth(), Resolution.RESOLUTION_720P.getHeight() ); try { resampler.start(); } catch ( Throwable e ) { e.printStackTrace(); }它就像魔术一样! - Taiko
5
压缩后音频无声,请问是否缺少了某些代码? - SkyWalker
@SkyWalker 抱歉,我的情况下只使用了视频。如果需要,可以随意在我的帖子中添加音频! - Taiko
@SkyWalker 有点晚了,但是请查看这个答案 https://github.com/hoolrory/AndroidVideoSamples/issues/1#issuecomment-256654251 mux 函数添加音轨,我尝试过并且成功了。 - Silvia H

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