我最近尝试通过从源代码下载和编译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,但我找不到它了)
答案 0 :(得分:7)
我找到了解决问题的方法,即使我仍然感兴趣,如果有人能帮我解释我的问题。
基本上,我只在函数顶部调用av_register_all()。 现在,在此之后添加avcodec_register_all()时,我的代码再次运行。 我不明白为什么,因为avcodec_register_all()应该由av_register_all()从查看源代码中调用。
请参阅http://www.ffmpeg.org/doxygen/trunk/allformats_8c-source.html#l00039了解源代码
答案 1 :(得分:0)
在av_register_all()中:
static int initialized;
if (initialized)
return;
initialized = 1;
avcodec_register_all();
也许是由于一些未被注意的因素,静态int变量“initialized”已初始化,而avcodec尚未注册...然后我们应该调用avcodec_register_all()来明确地实现它。但我倾向于认为这是ffmpeg中的一个错误。