【问题标题】:ffmpeg compilation problem: avcodec_find_decoder always returns nullffmpeg编译问题:avcodec_find_decoder总是返回null
【发布时间】:2019-07-05 06:27:59
【问题描述】:

我最近尝试通过从源代码下载和编译 ffmpeg 来升级我在 Mac OS X 应用程序中使用的 ffmpeg 库。

我的代码在 Windows 上与相同版本的预编译库一起正常工作。 在 Mac OS X 上,该库似乎可以工作(它可以打开文件并找到使用的流和编解码器),但是当它到达 avcodec_find_decoder 时,此函数总是返回 null。

该代码已与旧版本的库一起使用(一年前在 Mac OS X 10.5 上编译)

我使用 fmpeg 配置了

./configure --extra-cflags="-arch i386" --extra-ldflags='-arch i386' --arch=x86_32 --target-os=darwin --enable-cross-compile --disable-indev=jack --enable-shared --disable-static

我检查了 config.mak,它似乎启用了我尝试过的文件类型的解码器(ogg、vorbis、avi、mkv、...) 我还检查了是否使用了正确的头文件以及是否使用了新编译的库。

我只找到了一些与此问题相关的旧帖子,但没有任何解决方案:

http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2007-January/021399.html

http://libav-users.943685.n4.nabble.com/avcodec-find-decoder-problem-td944800.html

编辑:进一步检查,似乎 av_codec_next(NULL) 也返回 null,这意味着没有一个可用的编解码器,或者 utils.c 中的 first_avcodec 未设置(我实际上根本没有找到此变量已设置,我会假设为 av_register_all,但在那里找不到)

【问题讨论】:

    标签: macos ffmpeg


    【解决方案1】:

    我已经找到了解决问题的方法,尽管如果有人可以帮助我解释我的问题,我仍然很感兴趣。

    基本上,我只在函数顶部调用 av_register_all()。 现在,在此之后添加 avcodec_register_all() 时,我的代码再次工作。 我不明白为什么,因为 avcodec_register_all() 应该由 av_register_all() 从查看源代码中调用。

    源码见http://www.ffmpeg.org/doxygen/trunk/allformats_8c-source.html#l00039

    【讨论】:

      【解决方案2】:

      在 av_register_all() 中:

      static int initialized;
      if (initialized)  
          return;
      initialized = 1;
      avcodec_register_all();
      

      可能由于一些不为人知的因素,静态int变量“initialized”已经初始化,而avcodec还没有注册……那么我们应该调用avcodec_register_all()来显式地实现它。但我倾向于认为这是ffmpeg中的一个错误。

      【讨论】:

      • 这确实看起来像一个错误。我不认为c标准保证初始化将为0?所以静态int初始化= 0;将是正确的方法。
      • @Adion 是的,如果静态 int 变量未显式初始化,C 标准会将它们初始化为零。但是,here 说的更多……
      • 好的,我实际上不再调用 avcodec_register_all(),所以自从我提出这个问题以来的 5 年里似乎已经修复了任何错误。
      猜你喜欢
      • 2020-09-02
      • 2014-03-04
      • 2016-11-02
      • 2014-05-06
      • 2012-06-05
      • 2014-05-30
      • 2014-02-23
      • 2017-10-12
      相关资源
      最近更新 更多