以前记录过一个好用的ffmpeg第三方开源库-》FFmpegKit。现在再记录另一个好用的ffmpeg第三方库-》mobile-ffmpeg。
地址:https://github.com/tanersener/mobile-ffmpeg
主要是几大点:
1、集成上,比较全的分full和full-gpl
implementation 'com.arthenica:mobile-ffmpeg-full:4.4'
implementation 'com.arthenica:mobile-ffmpeg-full-gpl:4.4'
二选一就行,gpl包含更全更多,今天记录的libx265就在gpl。对照表如下:
image.png
2、然后通过他获取音视频信息,比如视频信息:
val mediaInformation = FFprobe.getMediaInformation(photo.path)
val mediaProperties = mediaInformation.streams
for (mediaProperty in mediaProperties) {
if(!TextUtils.isEmpty(mediaProperty.type) && TextUtils.equals("video",mediaProperty.type)){
//判断是视频数据后,拿取相关数据,比如:mediaProperty.width,拿取视频宽度
}
}
一个视频有音频流和视频流,上面代码中用TextUtils.equals("video",mediaProperty.type)作为区分。
3、执行命令:
var mCompressId = FFmpeg.executeAsync(commend,object :ExecuteCallback{
override fun apply(executionId: Long, returnCode: Int) {
if (returnCode == Config.RETURN_CODE_SUCCESS) {
//成功了
} else if (returnCode == Config.RETURN_CODE_CANCEL) {
//取消了
} else {
//出错了
}
}
}
mCompressId 是对应执行命令的id
4、取消
//指定id取消
FFmpeg.cancel(mCompressId)
//内部获取正在执行的id后取消
FFmpeg.cancel()
5、进度获取
Config.enableStatisticsCallback {
if(mCompressId == it.executionId){
val timeInMilliseconds: Int = it.getTime()
var progress = ((timeInMilliseconds.toDouble() / 视频时长毫秒级) * 100).toInt()
mTvLoading.setText("当前进度:${progress}%")
}
}
上面是视频处理时展示进度。
以上就是这个开源库基本用法。
最后配上压缩命令
var commend = "-i ${原视频路径}"+ " -strict -2 -vf scale=${视频宽度}:${视频高度} -c:v libx265 -x265-params crf=${压缩级别}:preset=${编码速度} -r ${帧率} ${视频输出地址}"
原视频路径没啥好说的
视频宽度,想要压缩到的宽度,比如原视频是1080,现在压缩到720。注意保持视频宽高比例不能变。
视频高度同上
压缩级别最高值是51。这个值越小压缩越清晰,但是文件大小越大,显然不行。数值越大越模糊,也不行。推荐值是18到28。
编码速度,编码速度越慢,则压缩效果及画质越好。他的值为:
placebo
veryslow
slower
slow
medium
fast
faster
veryfast
superfast
ultrafast
帧率,可以先获取视频帧率,保持原视频的帧率就行,但是大于30帧,可以强制修改为30帧,毕竟是压缩视频搞啥60帧视频啊。哈哈哈
视频输出地址没啥好说的。
网友评论