在Android(安卓)中使用FFmpeg命令
如何编译FFmpeg 并且引入Android Studio
如何在Android 中使用FFmpeg命令 ?
Github 项目源码 ffmpeglibrary 如果喜欢star走一个。
在FFmpeg目录在找到
cmdutils.c cmdutils.h cmdutils_common_opts.h config.h ffmpeg.c ffmpeg.h ffmpeg_filter.c ffmpeg_opt.c(注意:config.h需要编译后才有)到 cpp 目录下。
把FFmpeg 下面的文件也需要copy 到 cpp下
100011.png修改部分文件
修改cmdutils.c 和 cmdutils.h
找到cmdutils.c中的exit_program函数
修改前:
int exit_program(int ret){ if (program_exit) program_exit(ret); exit(ret); }
修改后:
int exit_program(int ret){ if (program_exit) program_exit(ret); return ret;}
找到cmdutils.h中exit_program的申明,也把返回类型修改为int:如下:
int exit_program(int ret);
修改ffmpeg.c与ffmpeg.h
找到ffmpeg.c,把int main(int argc, char argv) 改名为 int run(int argc, char argv) (名字可以随便起)
找到ffmpeg.h, 在文件末尾添加函数申明: int run(int argc, char **argv);(需要和ffmpeg.c 所起名字保持一致)
编写文件调用:
JNIEXPORT jint JNICALLJava_com_maiml_ffmpeglibrary_FFmpeg_run(JNIEnv *env, jobject instance, jobjectArray commands) { // TODO av_log_set_callback(my_logcat); int argc = env->GetArrayLength(commands); char *argv[argc]; int i; for (i = 0; i < argc; i++) { jstring js = (jstring) env->GetObjectArrayElement(commands, i); argv[i] = (char *) env->GetStringUTFChars(js, 0); } return run_command(argc, argv);}
到这里就可以运行FFmpeg命令了。一直我也是这样使用,但是我在做这个项目Cut的时候发现连续调用多次FFmpeg命令会报错(在项目需要,先改变分镜头的速度,再合成视频)。
为什么会这样的呢?
FFmpeg每次执行完命令后会调用 ffmpeg_cleanup 函数清理内存,并且会调用exit(0)结束当前进程,但是经过我们的修改,exit()的代码已经被删掉,而我们的App还在运行,不能杀死进程,所以有些变量的值还在内存中,这样就会导致下次执行的时候可能会出错。
打开ffmpeg.c找到刚修改的run函数,然后在 return 前加上如下代码即可:
nb_filtergraphs = 0; progress_avio = NULL; input_streams = NULL; nb_input_streams = 0; input_files = NULL; nb_input_files = 0; output_streams = NULL; nb_output_streams = 0; output_files = NULL; nb_output_files = 0;
参考文章
FFmpeg
编译Android下可执行命令的FFmpeg
END。
更多相关文章
- Android使用其他资源
- Android应用程序组件Content Provider应用实例(4)
- android 手机虚拟按键 震动过程的追溯(1)
- Android通过Termux安装scrapy遇到的问题和解决方法
- Android(安卓)Git忽略规则
- Ubuntu 编译Android若干错误及解决方法
- Android(安卓)7.0 FileUriExposedException 的处理
- Android(安卓)由图片资源ID获取图片的文件名
- android 签名和adb命令(时刻更新)