app build.gradle中引入
// RxFFmpeg 极速版 (预计占用 4M 左右空间),主要移除了一些不常用的编解码器
// 三方库github链接:https://github.com/microshow/RxFFmpeg
implementation 'com.github.microshow:RxFFmpeg:4.9.0-lite'
app build.gradle下
android {
defaultConfig {
ndk {
abiFilters "armeabi-v7a"// , "arm64-v8a"// , "x86" // 选择自己需要的abi类型
}
}
}
// 压缩后文件的输出路径目录
String destOutDir = getCacheDir().getAbsolutePath() + "/compVideoOutputDir/";
if (!new File(destOutDir).exists()) { // 如果目录不存在,则创建目录
new File(destOutDir).mkdirs();
}
String destOutPath = destOutDir + System.currentTimeMillis() + ".mp4";
// realPath 是选择的图库的视频文件全路径,替换成要压缩的文件全路径即可
String text = "ffmpeg -y -i " + realPath + " -b:v 600k -r 25 -crf 20 -vcodec libx264 -vf scale=-2:720 -preset superfast "
String[] commands = text.split(" ");
// 这里是同步执行的,直到执行完成,才会走到下一步,也就是说是当前线程同步执行的
// ret等于0则执行成功,否则执行失败
int ret = RxFFmpegInvoke.getInstance().runCommand(commands, new RxFFmpegInvoke.IFFmpegListener() {
@Override
public void onFinish() {
// 压缩完成...
}
/**
*@param progress 当前转化的进度
*/
@Override
public void onProgress(int progress, long progressTime) {
LogUtils.d("RxFFmpeg---Invoke---onProgress-----progress=" + progress + ",progressTime=" + progressTime);
MainThread.run(new Runnable() {
@Override
public void run() {
if (progress >= 0 && progress <= 100) {
showProgress(String.format("视频压缩中%d%%...", progress));
}
}
});
}
@Override
public void onCancel() {
MainThread.run(new Runnable() {
@Override
public void run() {
hideProgress();
toastLong("压缩取消");
}
});
}
@Override
public void onError(String message) {
MainThread.run(new Runnable() {
@Override
public void run() {
hideProgress();
toastLong(message);
}
});
}
});
// ret==0则转化执行成功
LogUtils.d("RxFFmpeg---Invoke--------getTaskResult-----exeFinish--ret=" + ret);