前言
由于FFmpeg(五):JNI动态注册方法调用FFmpeg播放视频已经讲了如何动态注册,这篇文章的核心是集成FFmpeg的命令模式,解锁了这个技能就可以干很多事情,比如压缩、剪辑、添加水印等等等等···。代码基本还是参考网上大佬的,不过动态方法稍作了修改,否则会报内存错误。
正文
1 源文件导入
FFmpeg的命令模式需要用的FFmpeg的源码,在FFmpeg-3.2.5的源码中,把cmdutils.c、cmdutils.h cmdutils_common_opts.h、config.h、ffmpeg.c、ffmpeg.h、ffmpeg-filter.c、ffmpeg_opt.c 八个文件拷贝到src/main/cpp工程路径下,拷贝后有很多错,不管:
2 CMakeList.text配置
如图把cmdutils.c、ffmpeg.c、ffmpeg-filter.c、ffmpeg_opt.c添加到native-lib的共享库中:
Sync Now后ffmpegde 源码中会报错,如图修改:
3 FFmpegKit代码
public class FFmpegKit {
static {
System.loadLibrary("native-lib");
System.loadLibrary("avutil");
System.loadLibrary("fdk-aac");
System.loadLibrary("avcodec");
System.loadLibrary("avformat");
System.loadLibrary("swscale");
System.loadLibrary("swresample");
System.loadLibrary("avfilter");
}
//定义接口,回调命令执行周期
public interface KitInterface {
void onStart();
void onProgress(int progress);
void onEnd(int result);
}
//开启异步线程执行
public static void execute(String[] commands, final KitInterface kitIntenrface) {
new AsyncTask<String[], Integer, Integer>() {
@Override
protected void onPreExecute() {
if (kitIntenrface != null) {
kitIntenrface.onStart();
}
}
@Override
protected Integer doInBackground(String[]... params) {
return run(params[0]);
}