Macos ffmpeg编译问题:avcodec_find_解码器始终返回空值

Macos ffmpeg编译问题:avcodec_find_解码器始终返回空值,macos,ffmpeg,Macos,Ffmpeg,我最近试图通过从源代码下载和编译ffmpeg来升级我在Mac OS X应用程序中使用的ffmpeg库 我的代码可以在windows上正确使用相同版本的预编译库。 在Mac OS X上,该库似乎可以工作(它可以打开文件并查找使用的流和编解码器),但当它到达avcodec_find_decoder时,该函数始终返回null 该代码使用了旧版本的库(一年前在MacOSX10.5上编译) 我使用配置fmpeg ./configure --extra-cflags="-arch i386" --extra

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

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

该代码使用了旧版本的库(一年前在MacOSX10.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等) 我还检查了是否使用了正确的头文件以及是否使用了新编译的库

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


编辑:进一步检查,av\U codec\U next(NULL)似乎也返回NULL,这意味着没有一个编解码器可用,或者utils.c中的第一个avcodec没有设置(我实际上根本没有找到这个变量的设置位置,我假设av\U register\U all,但我在那里找不到)

我已经找到了解决问题的方法,即使我仍然有兴趣,如果有人能帮我解释我的问题

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


查看源代码

我已经找到了问题的解决方案,尽管如果有人能帮我解释我的问题,我仍然很感兴趣

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

有关av_register_all()中的源代码,请参见:

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

在av\u register\u all()中:


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

这看起来确实像个bug。我不认为c标准保证初始化值为0?所以静态int初始化=0;是的,如果静态int变量没有显式初始化,C标准会将它们初始化为零。但是,说的更多…好吧,我实际上不再调用avcodec_register_all(),所以在我提出这个问题的5年内,任何错误似乎都得到了修复。这看起来确实像一个bug。我不认为c标准保证初始化值为0?所以静态int初始化=0;是的,如果静态int变量没有显式初始化,C标准会将它们初始化为零。但是,说的更多…好吧,我实际上不再调用avcodec_register_all(),所以在我问这个问题的5年里,任何错误似乎都得到了修复。
static int initialized;
if (initialized)  
    return;
initialized = 1;
avcodec_register_all();