解决ffmpeg读取视频流时,报错“Segmentation fault (core dumped)“,avformat_open_input 返回 -1330794744

错误现象:

  • ffmpeg读取视频流时,直接报错返回“Segmentation fault (core dumped)”;
  • 排查中发现是avformat_open_input函数错误,返回的是-1330794744,而不是代表正确的0。

这个问题困扰了我很久,网上也搜了很久,但解决办法中都没提及ffmpeg的版本,在试错很多次后,发现了问题的所在,是代码与ffmpeg的版本有些不兼容的问题,那就直接切入主题。



这次我试了ffmpeg的两个大版本:(一定对照自己的版本来看)

  • ffmpeg-n4.4-latest-linux64-gpl-shared-4.4.tar.xz (这是github上别人编译好的)(在ubuntu和windows上都能直接跑起来)

    • 这个版本我在我的centos7上跑不起来,make就会报类似这样的错:“/opt/ffmpeg/lib/libavcodec.so: undefined reference to _ZGVcN4vv_pow@GLIBC_2.22
      /opt/ffmpeg/lib/libavcodec.so: undefined reference to _ZGVeN16v_expf@GLIBC_2.22
      /opt/ffmpeg/lib/libavcodec.so: undefined reference to _ZGVbN2v_exp@GLIBC_2.22
      /opt/ffmpeg/lib/libavcodec.so: undefined reference to _ZGVbN2vv_pow@GLIBC_2.22’”
    • warning说是因为缺乏libmvec.so.1这个库,显然因为glibc版本的问题(我centos的glibc是2.17的,版本太低,yum暂时最高就是这,不能yum升级;手动去升级话,是有可能会把系统弄崩的,所以要慎重,特别生产环境一定慎重,虚拟机可以先拍一个快照);
    • 然后我在一个centos虚拟机上,手动编译glibc,把glibc升级到2.25,就能成功运行;
    • 查看glibc版本的命令:ldd --version

  • FFmpeg-n3.4.9 (这个是自己源码编译的)

    • 这个在glibc为2.17的centos7上能make能成功,但是一运行,就报错"Segmentation fault (core dumped)”,排查是avformat_open_input()函数返回的是-1330794744,解决办法很简单,在你代码main()函数开头加这样两行:

      av_register_all();

      avformat_network_init();

    • 这应该是在ffmpeg版本4后,是没有这俩api了,网上的解决办法也总是直接说加这两行,也没说版本,这要是加了这两行的代码使用上面ffmpeg-n4.4版本,编译都是会直接报错的。

嗯,说的是很详细了,别的错误情况也说到了,也是自己反复各种尝试,ffmpeg都编译了十多次,还以为是自己预编译指令没给对,所以重点是,一定要注意自己的ffmpeg版本是多少,看你报错是上面哪种,对症下药。
所以如果有帮到你,请点个赞吧!