解决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
- 这个版本我在我的centos7上跑不起来,make就会报类似这样的错:“/opt/ffmpeg/lib/libavcodec.so: undefined reference to _ZGVcN4vv_pow@GLIBC_2.22
-
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版本是多少,看你报错是上面哪种,对症下药。
所以如果有帮到你,请点个赞吧!