草庐IT

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

宋小江@ 2023-06-20 原文

错误现象:

  • 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版本是多少,看你报错是上面哪种,对症下药。
所以如果有帮到你,请点个赞吧!

有关解决ffmpeg读取视频流时,报错“Segmentation fault (core dumped)“,avformat_open_input 返回 -1330794744的更多相关文章

  1. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  2. ruby - 无法在 Ruby 中将 ffmpeg 作为子进程运行 - 2

    我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope

  3. ruby-on-rails - Ruby 的 'open_uri' 是否在读取或失败后可靠地关闭套接字? - 2

    一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我

  4. Ruby:read_timeout 和 open_timeout 之间的区别 - 2

    标题本身就说明了......read_timeout和open_timeout之间有什么区别? 最佳答案 open_timeout是您愿意等待“打开连接”的时间。在TCP上下文中,在放弃尝试并引发超时错误之前等待握手完成的时间量。read_timeout您可能会猜到,是您愿意等待从连接方接收到某些数据的时间。一个例子可能会清楚地说明这一点:在SOAPoverHTTPoverTCP上下文中(简化):您尝试与服务器建立TCP连接。如果建立连接的时间比open_timeout长,则放弃连接尝试并引发/发出/返回超时错误。如果连接成功,您发

  5. ruby - Formtastic,拥有 :as input type - 2

    如何将自己的字段类型添加到formtastic中?例如,我需要一个自定义的日期时间输入,我想要这样的东西::my_date%>这显然是行不通的,因为formtastic不知道:my_date(只有:boolean、:string、:datetime等等...)但是我怎样才能添加额外的输入类型呢? 最佳答案 您需要添加自定义输入法:classMyCustomFormtasticFormBuilder这非常适合新的HTML5输入类型。你可以这样使用它:MyCustomFormtasticFormBuilderdo|f|%>:my_dat

  6. ruby - 使用 File.open 从 ruby​​ 中的目录打开文件 - 2

    我是Ruby的新手,我正在尝试以如下方式打开文件:#!/usr/bin/envrubydata_file='~/path/to/file.txt'file=File.open(data_file,'r')但是我得到“没有这样的文件或目录”(该文件确实存在于该目录中)。如果我将该文件路径作为命令行参数,它会起作用,例如:#!/usr/bin/envrubyfile=File.open(ARGV[0],'r')然后从命令行运行,如:rubyscript.cgi~/path/to/file.txt关于如何让它以第一种方式工作的任何想法? 最佳答案

  7. 用于从 Open3.popen3 标准输出中提取值的正则表达式 - 2

    如何获取外部命令的输出并从中提取值?我有这样的东西:stdin,stdout,stderr,wait_thr=Open3.popen3("#{path}/foobar",configfile)if/exit0/=~wait_thr.value.to_srunlog.puts("Foobarexitednormally.\n")puts"Testcompleted."someoutputvalue=stdout.read("TX.*\s+(\d+)\s+")puts"Outputvalue:"+someoutputvalueend我没有在标准输出上使用正确的方法,因为Ruby告诉我它不能

  8. ruby-on-rails - 无法捆绑安装 'open-uri' - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。关于您编写​​的代码问题的问题必须在问题本身中描述具体问题—并且包括有效代码以重现它。参见SSCCE.org寻求指导。关闭8年前。Improvethisquestion我是Rails的新手。我正在制作一个网络应用程序,我在其中使用nokogiri搜索不同的网站以从中提取文本。所以在Gemfile中,我写了require'nokogiri'和'open-uri',但是当我捆绑安装时我得到这个错误:Couldnotfindgem'open-uri(>=0)ruby'inthegemsavailableon

  9. Ruby—Open3.popen3/如何打印输出 - 2

    我有一个执行mysql的小ruby脚本导入方式:mysql-u-p-h,但利用Open3.popen3这样做。这就是我到目前为止所拥有的:mysqlimp="mysql-u#{mysqllocal['user']}"mysqlimp这实际上是在做工作,但有一件事困扰着我,与我希望看到的输出有关。如果我将第一行更改为:mysqlimp="mysql-v-u#{mysqllocal['user']}"#notethe-v然后整个脚本永远挂起。我猜,发生这种情况是因为读流和写流相互阻塞,我也猜想stdout需要定期冲洗,以便stdin将继续被消耗。也就是说,只要stdout的buffer已满

  10. ruby-on-rails - OSX 10.7.5 - Ruby on Rails LoadError : Could not open library 'sodium' : dlopen(sodium, 5) - 2

    输入rakedb:create后我得到:LoadError:Couldnotopenlibrary'sodium':dlopen(sodium,5):imagenotfound.Couldnotopenlibrary'libsodium.dylib':dlopen(libsodium.dylib,5):imagenotfound这里还有一些输出。/Users/Mao/.rvm/gems/ruby-2.0.0-p451/gems/ffi-1.9.3/lib/ffi/library.rb:133:in`blockinffi_lib'/Users/Mao/.rvm/gems/ruby-2.0

随机推荐