
我正在 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'