FFMpeg与mPaaS小程序模块冲突
2020-06-08 本文已影响0人
山已几孑
mPaaS项目集成小程序模块,同时集成了FFMpeg的视频压缩功能,
ffmpeg使用了fftools命令行操作方式。
一切配置完毕后,运行程序报错如下:
image
该段代码的解释为,ffmpeg要找到跟name匹配相同的OptionDef
错误在 if (!strncmp(name, po->name, len) && strlen(po->name) == len)
,错误类型为空指针异常。
经测试发现,因*OptionDef po,存在name为空的数据,因此po->name调用时name跑出空指针,让程序无法进行下去。
逐级查找调用链,发现程序入口在main函数中,但并无options声明,因此考虑到是全局设置,因此,全局搜索options
/**ffmpeg.c*/
int ffmpeg_main(int argc, char **argv)
{
...... // 此处忽略大部分代码,仅保留与options调用相关的代码
parse_loglevel(argc, argv, options);
......
show_banner(argc, argv, options);
......
搜索内容摘要如下:
/**ffmpeg.h*/
extern const OptionDef options[]; //定义options
/**ffmpeg_opt.c*/
#define OFFSET(x) offsetof(OptionsContext, x)
const OptionDef options[] = { //此处为options的声明
/* main options */
CMDUTILS_COMMON_OPTIONS
{ "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
"force format", "fmt" },
{ "y", OPT_BOOL, { &file_overwrite },
"overwrite output files" },
...
经过断点,log,发现崩溃的方法中的options与此处设置的options不一样了,因此猜测是应为库见的冲突导致options被中途更改导致。因此决定把上述options改为ffoptions,
改动比较多,如下所示,主要在ffmepg_opt中,所有调用options的都个改掉:
image.png
替换后FFMpeg终于运行起来啦,🎉🎉🎉🎉🎉🎉🎉
简单点就是,这两个地方定义的options改成ffoptions,然后把所有的调用异常都给修复掉,完事儿!!
/**ffmpeg.h*/
extern const OptionDef options[]; //定义options
/**ffmpeg_opt.c*/
const OptionDef options[] = { //此处为options的声明