ffmpeg首先会在main入口注册这个回调。

register_exit(ffmpeg_cleanup);

void register_exit(void (*cb)(int ret))
    program_exit = cb;

然后,在其他的地方调用,exit_program方法。

void exit_program(int ret)
    if (program_exit)
        program_exit(ret);
    exit(ret);

exit_program

如果是c,我们可以把对应的位置都改成返回值。因为android都是支持c++的,所以我们可以注册自己的退出方法,然后给调用层抛一个异常。实现方法:

void on_exit(int ret) {
  ffmpeg_cleanup(ret);
#ifdef DEBUG
    logd("ffmpeg exit: %d", ret);
#endif
    throw ret;
}
调用方式:
register_exit(on_exit);

2.cleanup的歧义:

这个函数是容易产生歧义的,根据一般的语法习惯,cleanup是清内存操作。可是ffmpeg的demo工程里面有个

term_exit();

这个函数的实现是:

static void term_exit_sigsafe(void)
#if HAVE_TERMIOS_H
    if(restore_tty)
        tcsetattr (0, TCSANOW, &oldtty);
#endif
void term_exit(void)
    av_log(NULL, AV_LOG_QUIET, "%s", "");
    term_exit_sigsafe();

这是个清空输出终端的函数,个人感觉和cleanup分开比较好。

而且当我移植到android上时,是没有终端操作到。所以,全部去掉就好。

3.term相关调用,很简单,所有相关的都删掉。

使用 FFmpeg 生成视频封面图时,其实可以直接使用 FFmpeg 相关命令截取一帧的图像数据保存到本地,然后加载到 ImageView 上。有时候使用命令确实比写代码更加简单和使人轻松一点。所以这一篇是讲解如何导入 FFmpeg 相关源码然后如何执行命令行工具的博客,但是其实这只是个 Demo 而已,因为有很多细节需要处理,推荐直接使用开源库。导入源码从FFmpeg源码中导入 cmdutil... FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案。FFmpeg的 开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用。FFmpeg支持MPEG、 DivX、MPEG4、AC3、DV、FLV等40多种编码,A 在编译支持ffmpeg命令行的静态库时遇到了很多坑,总结修改如下:       1.  修改ffmpeg.c的main函数,因为一个程序不能有俩个main函数,我们可以改成ffmpeg_main,       2.修改exit_program(int)函数,这个函数是清理资源用的,但是在里面调用了退出进程的函数exit,导致每次执行ffmpeg命令程序都会闪退。 将exit函数注释掉