最近项目当中有遇到上传视频的时候,需要做合理压缩的需求。分享一下我使用的视频压缩库,希望能帮助遇到同样有视频处理的需求的小伙伴。
RxFFmpeg依赖
这个开源库一共有三个版本,这里贴两个版本的依赖:
//完整版
implementation 'com.github.microshow:RxFFmpeg:4.9.0'
//极速版 (预计占用 4M 左右空间),主要移除了一些不常用的编解码器
implementation 'com.github.microshow:RxFFmpeg:4.9.0-lite'
迷你版需要找开源库的大佬付费定制版本,如果真的有特别需求的小伙伴可以去GitHub的RxFFmpeg
主页了解一下。
NDK支持
ndk {
//目前已支持 "armeabi-v7a","arm64-v8a","x86","x86_64" 平台架构
abiFilters "armeabi-v7a","arm64-v8a","x86","x86_64"
}
这里NDK
支持按照自己的需求开放,全部支持会增加一定的apk大小。下面来说说相关的库的使用。
debug模式设置
RxFFmpegInvoke.getInstance().setDebug(true);
开始或者关闭debug模式,建议是在Application
当中调用。
FFmpeg使用举例
由于我个人使用是在项目当中的,这里贴一下开源库的代码:
private void runFFmpegRxJava() {
String text = "ffmpeg -y -i /storage/emulated/0/1/input.mp4 -vf boxblur=25:5 -preset superfast /storage/emulated/0/1/result.mp4";
String[] commands = text.split(" ");
myRxFFmpegSubscriber = new MyRxFFmpegSubscriber(this);
//开始执行FFmpeg命令
RxFFmpegInvoke.getInstance()
.runCommandRxJava(commands)
.subscribe(myRxFFmpegSubscriber);
}
public static class MyRxFFmpegSubscriber extends RxFFmpegSubscriber {
private WeakReference<HomeFragment> mWeakReference;
public MyRxFFmpegSubscriber(HomeFragment homeFragment) {
mWeakReference = new WeakReference<>(homeFragment);
}
@Override
public void onFinish() {
final HomeFragment mHomeFragment = mWeakReference.get();
if (mHomeFragment != null) {
mHomeFragment.cancelProgressDialog("处理成功");
}
}
@Override
public void onProgress(int progress, long progressTime) {
final HomeFragment mHomeFragment = mWeakReference.get();
if (mHomeFragment != null) {
//progressTime 可以在结合视频总时长去计算合适的进度值
mHomeFragment.setProgressDialog(progress, progressTime);
}
}
@Override
public void onCancel() {
final HomeFragment mHomeFragment = mWeakReference.get();
if (mHomeFragment != null) {
mHomeFragment.cancelProgressDialog("已取消");
}
}
@Override
public void onError(String message) {
final HomeFragment mHomeFragment = mWeakReference.get();
if (mHomeFragment != null) {
mHomeFragment.cancelProgressDialog("出错了 onError:" + message);
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (myRxFFmpegSubscriber != null) {
myRxFFmpegSubscriber.dispose();
}
}
执行FFmpeg命令
RxFFmpegInvoke.getInstance().runCommand(command, null);
这种调用方式是同步的。
中断FFmpeg命令
RxFFmpegInvoke.getInstance().exit();
这个方法建议在onDestory()
的时候调用,防止内存泄漏。
构建FFmpeg命令
public static String[] getBoxblur() {
RxFFmpegCommandList cmdlist = new RxFFmpegCommandList();
cmdlist.append("-i");
cmdlist.append("需要压缩的视频路径");
cmdlist.append("-vf");
cmdlist.append("boxblur=5:1");
cmdlist.append("-preset");
cmdlist.append("superfast");
cmdlist.append("压缩后输出文件的路径");
return cmdlist.build();
}
获取媒体文件的信息
RxFFmpegInvoke.getInstance().getMediaInfo(String filePath);
代码混淆
-dontwarn io.microshow.rxffmpeg.**
-keep class io.microshow.rxffmpeg.**{*;}
按照博客的步骤来,一步步就可以简单实现视频压缩的功能了。