為什麼 FFmpeg 突然拋出「Segmentation failure: 11」錯誤並建立僅包含「ftypisomisomiso2avc1mp4freemdat」內容的輸出檔案?

為什麼 FFmpeg 突然拋出「Segmentation failure: 11」錯誤並建立僅包含「ftypisomisomiso2avc1mp4freemdat」內容的輸出檔案?

我正在 macOS Catalina (10.15.7) 上運行 FFmpeg 版本 4.3.1(透過 Homebrew 安裝)。今天早上我運行了一個標準 FFmpeg 命令來使用合併 MP4 和 SRT 字幕:

ffmpeg -y -i input.mp4 -i input.srt -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=eng output.mp4

當它突然失敗並在螢幕上顯示這些行時:

Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #1:0 -> #0:2 (subrip (srt) -> mov_text (native))
Press [q] to stop, [?] for help
Segmentation fault: 11

這對我來說很奇怪,因為幾天前我使用了完全相同的命令——甚至是過去的命令——沒有任何問題。

檢查輸出檔案本身僅顯示以下內容;似乎在為輸出檔案創建標頭時立即死亡:

ftypisomisomiso2avc1mp4freemdat

檢查我的一些可用的 MP4 文件表明這ftypisomisomiso2avc1mp4freemdat也是這些文件的初始內容的一部分。但可以正常工作的 MP4 檔案顯然還具有標頭和二進位內容。

為什麼在如此簡單的內容複製/合併命令上突然發生這種情況?此命令的作用只是將 MP4 視訊與字幕合併,而不對內容進行轉碼,並且應該花費不到一秒左右的時間來完成其工作。

唯一值得注意的是定期運行brew update並且brew upgrade幾乎沒有問題。但我假設最近的 FFmpeg 升級導致了這個問題。以下是我的 macOS 機器上的完整版本輸出,以供參考:

ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 12.0.0 (clang-1200.0.32.21)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_2 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

可以採取什麼措施來解決這個問題?只需等待 FFmpeg 的新版本/補丁發布即可解決該問題嗎?是否可以向該命令添加一個參數以確保該命令按預期工作?

答案1

筆記: FFmpeg 似乎在 2020 年 11 月 6 日左右從版本更新到4.3.1_2解決4.3.1_3了這個問題。所以這是一個暫時性的錯誤,已被清除。如果其他人遇到類似問題,請留下答案以供日後參考。


我對此的唯一解決方案是使用早期版本的 FFmpeg 的解決方法。

我知道FFmpeg 2.8.17 比4.3.1 版本落後兩個主要版本,但出於我快速找到一種無需轉碼即可合併MP4 與字幕的解決方案的目的,該解決方案很快就實現並解決了我的問題。

雖然我希望可以在命令中新增一個參數來解決這個問題,但我不知道還能做什麼,我啟動了一個在 VirtualBox 中設定的 Ubuntu 16.04 VM,在其上安裝了 FFmpeg,將視訊和字幕複製到Ubuntu 16.04 VM 運行相同的命令並且一切都按預期工作。

如果只是運行的話,Ubuntu 16.04上安裝的FFmpeg版本sudo aptitude install ffmpeg是2.8.17;這絕對是我在 macOS 中透過 Homebrew (4.3.1) 獲得的較低版本,但對於純粹的合併字幕來說,它已經完成了工作。

以下是 Ubuntu 16.04 VM 上 FFmpeg 的完整版本輸出,以供參考:

ffmpeg version 2.8.17-0ubuntu0.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
  configuration: --prefix=/usr --extra-version=0ubuntu0.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

相關內容