android ffmpeg命令行,在Android 中使用FFmpeg命令

如何在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下

a18fdae2fa7b

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 JNICALL

Java_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;

END。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值