mPaaS

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的声明
上一篇下一篇

猜你喜欢

热点阅读