前言
由于FFmpeg(五):JNI動態(tài)注冊方法調(diào)用FFmpeg播放視頻已經(jīng)講了如何動態(tài)注冊,這篇文章的核心是集成FFmpeg的命令模式,解鎖了這個技能就可以干很多事情,比如壓縮、剪輯、添加水印等等等等···。代碼基本還是參考網(wǎng)上大佬的,不過動態(tài)方法稍作了修改,否則會報(bào)內(nèi)存錯誤。
正文
1 源文件導(dǎo)入
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 源碼中會報(bào)錯,如圖修改:


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");
}
//定義接口,回調(diào)命令執(zhí)行周期
public interface KitInterface {
void onStart();
void onProgress(int progress);
void onEnd(int result);
}
//開啟異步線程執(zhí)行
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]);
}