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函数注释掉