前两天项目有需求在上传视频之前需要对其先进行压缩,找了一圈找到个相对最好用最稳定的三方库,内部用的是FFmpeg视频录制与压缩处理技术,下面是github地址:
点击传送至github地址
功能描述
利用FFmpeg录制定制化的视频,并可对其定制化的压缩处理。如设置视频尺寸、设置码率、码率模式、帧率、视频质量等级、压缩速度等等,当然这些只是暂时的,后期会继续维护。
特点
- 利用FFmpeg自定义录制各种时长、分辨率、码率、帧率、转码速度的视频。
- 可设置以H264编解码器二次压缩,6秒的1M视频压缩后为200多KB,且视频还比较清晰
- 可选择本地视频压缩
- 录制简单,一行代码完成集成,几个参数搞定录制。
使用方法
- 添加依赖
compile 'com.mabeijianxi:small-video-record:1.2.0'
- 在manifests里面添加
<!--视频录制页面的activity-->
<activity android:name="mabeijianxi.camera.MediaRecorderActivity"/>
- 在Application里面初始化小视频录制
public static void initSmallVideo(Context context) {
// 设置拍摄视频缓存路径
File dcim = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
if (DeviceUtils.isZte()) {
if (dcim.exists()) {
VCamera.setVideoCachePath(dcim + "/mabeijianxi/");
} else {
VCamera.setVideoCachePath(dcim.getPath().replace("/sdcard/",
"/sdcard-ext/")
+ "/mabeijianxi/");
}
} else {
VCamera.setVideoCachePath(dcim + "/mabeijianxi/");
}
// 开启log输出,ffmpeg输出到logcat
VCamera.setDebugMode(true);
// 初始化拍摄SDK,必须
VCamera.initialize(context);
}
- 跳转录制界面或选择压缩
// 录制
MediaRecorderConfig config = new MediaRecorderConfig.Buidler()
.doH264Compress(new AutoVBRMode()
// .setVelocity(BaseMediaBitrateConfig.Velocity.ULTRAFAST)
)
.setMediaBitrateConfig(new AutoVBRMode()
// .setVelocity(BaseMediaBitrateConfig.Velocity.ULTRAFAST)
)
.smallVideoWidth(480)
.smallVideoHeight(360)
.recordTimeMax(6 * 1000)
.maxFrameRate(20)
.captureThumbnailsTime(1)
.recordTimeMin((int) (1.5 * 1000))
.build();
MediaRecorderActivity.goSmallVideoRecorder(this, SendSmallVideoActivity.class.getName(), config);
// 选择本地视频压缩
LocalMediaConfig.Buidler buidler = new LocalMediaConfig.Buidler();
final LocalMediaConfig config = buidler
.setVideoPath(path)
.captureThumbnailsTime(1)
.doH264Compress(new AutoVBRMode())
.setFramerate(15)
.build();
OnlyCompressOverBean onlyCompressOverBean = new LocalMediaCompress(config).startCompress();
- 一些参数说明
maxFrameRate:指定最大帧率,越大视频质量越好,体积也会越大,当在cbr模式下不再是动态帧率,而是固定帧率;
captureThumbnailsTime:指定剪切哪个时间的画面来作为封面图;
doH264Compress:不传入值将不做进一步压缩,暂时可以传入三种模式AutoVBRMode、VBRMode、VBRMode;
setMediaBitrateConfig:视频录制时期的一些配置,暂时可以传入三种模式AutoVBRMode、VBRMode、VBRMode;
AutoVBRMode:可以传入一个视频等级与转码速度,等级为0-51,越大质量越差,建议18~28之间即可。转码速度有ultrafast、superfast、 veryfast、faster、fast、medium、slow、slower、veryslow、placebo。
VBRMode:此模式下可以传入一个最大码率与一个额定码率,当然同样可以设置转码速度。
VBRMode:可以传入一个固定码率,也可以添加一个转码速度。
特别注意
1:编译环境请满足:targetSdkVersion<=22
2:出现 java.lang.UnsatisfiedLinkError错误可以尝试在gradle.properties中添加:android.useDeprecatedNdk=true,然后在主module的build.gradle中配置ndk {abiFilters "armeabi", "armeabi-v7a"}