android压缩视频的传统方式一般采用ffmpeg操作库,但是由于ffmpeg需要比较专业的技能,所以在android 4.4以后提供了MediaCodec类来进行视频操作,当然也支持视频压缩功能。
封装MediaCodec是个麻烦的事情,好在有人已经帮忙弄好。这里提供两个大神库,方便大家对比使用。
fishwjy/VideoCompressor
这是一个外国人写的基于MediaCodec的库,Demo非常简单,支持高、中、低三个质量的压缩。下面贴一段低质量压缩(压缩率很高)的使用代码:
VideoCompressTask task = VideoCompress.compressVideoLow(tv_input.getText().toString(), destPath, new VideoCompress.CompressListener() {
@Override
public void onStart() {
//Start Compress
}
@Override
public void onSuccess() {
//Finish successfully
}
@Override
public void onFail() {
//Failed
}
@Override
public void onProgress(float percent) {
//Progress
}
});
VideoCompressor测试说明显示,能够将 168MB(00:01:06)的视频压缩至 11MB ,耗时大概 60s。
yellowcath/VideoProcessor
yellowcath/VideoProcessor 是一个国人写的库,在api方面比较丰富,且是一个多功能支持视频剪辑的库。有兴趣的话可以去github上面学习:https://github.com/yellowcath/VideoProcessor
该库的调用方式也很友好:
VideoProcessor.processor(context)
.input(inputVideoPath)
.output(outputVideoPath)
.outWidth(outWidth)
.outHeight(outHeight)
.process();
其中利用进度回调进行进度控制,比如何时完成。笔者在实践中发现,竟然会多次调用100%进度,感觉这是这个库的一点瑕疵。
参数方面(与ffmpeg比较):
- 体积小 :编译后的aar只有262K,ffmpeg一个so就7、8M,精简之后也差不多还有一半大小
- 速度快 :在huaweiP9上压缩(1080P 20s 20000k -> 720p 2000k)
- 耗时
VideoProcessor 13.3s
ffmpeg 172s
ffmpeg(ultrafast) 74s
我们看出,相对于ffmpeg的压缩方式,yellowcath/VideoProcessor还是具备相当的优势。
二者比较
实际测试中发现 fishwjy/VideoCompressor 比 yellowcath/VideoProcessor 压缩效率会高很多,而且能够有效将视频压缩,而yellowcath/VideoProcessor 压缩后不太理想,需要自己计算压缩比才行。
推荐大家在常规压缩中使用fishwjy/VideoCompressor 这个库。