如何使用 ffmpeg 快速產生低品質的動畫 GIF?

如何使用 ffmpeg 快速產生低品質的動畫 GIF?

我們產生了大量 GIF 縮圖,其品質並不重要,重要的是產生它們所需的時間。使用 ffmpeg 產生高品質的 GIF 已經有很好的介紹,但我不太幸運地弄清楚如何盡快產生低品質的 GIF。

調色板計算佔用了以下命令的大部分執行時間(取自此處的多鏈過濾器答案:如何直接從網路上的影片部分有效地創建最佳調色板 gif):

ffmpeg -y -threads 8 -r 24 -f image2 -start_number 1 -i "frames.%04d.jpg" -filter_complex "fps=24,scale=150:-1:flags=fast_bilinear,split=2 [a][b]; [a] palettegen [pal] fifo [b]; [b] [pal] paletteuse" output.gif

此指令在 1000 幀的情況下執行時間約為 72 秒。其中大約 67 秒是調色板過程,然後在大約 5 秒內完成實際的 GIF 生成。我希望盡可能縮短整個執行時間,並願意為了速度而犧牲大量影像品質。

答案1

您使用palettegen/paletteuse過濾器會使命令運轉速度變慢。獲得較低質量 GIF 的簡單方法是:

ffmpeg -f image2 -i "frames.%04d.jpg" output.gif

透過額外的縮放:

ffmpeg -f image2 -i "frames.%04d.jpg" -vf scale=150:-1 output.gif

您也可以在輸出 GIF 中丟棄幀,也就是對幀進行取樣,這樣就不會處理所有幀。例如,透過使用過濾器只有 1 FPS 輸出fps

ffmpeg -i "frames.%04d.jpg" -vf "fps=fps=1,scale=150:-1" output.gif

答案2

我的任務是減少生成長度盡可能接近 30 幀、寬度為 150 像素的動畫 GIF 所需的時間。我們產生的大多數序列都在 1000 幀以下。我們有 15,000 幀序列,我們的渲染節點正在使用17分鐘產生這個約 30 幀的 GIF,速度慢得令人無法接受。

我們使用 ffmpeg 作為解復用器並透過管道傳輸到 imagemagick。經過幾個小時的實驗,我得出以下結論:

  • 您要求 ffmpeg 處理的輸入幀數是到目前為止就執行速度而言最有影響力的輸入。如果可以選擇使用連續解復用器來跳過輸入幀,這將帶來最大的性能差異。每 5 張拍攝一次,我能夠將總計算時間減少到1分45秒具有高品質的 lanczos 重新縮放和每幀調色板計算。現在產生 30 幀預覽縮圖只需不到 1 秒

  • 重新調整演算法是第二大的效能影響因素(但遠遠落後於第二)。使用 fast_bilinear 取代 lanczos 在所有 15,000 個訊框上節省了 150 秒的計算時間。

  • 影響最小的變數是調色板計算,這會隨著重新縮放演算法的不同而變化。使用 lanczos 超過 15,000 個幀,如果消除調色板計算,我們可以節省大約 17 秒的執行時間。使用 fast_bilinear,我們節省了大約 75 秒的執行時間。

由於重新縮放演算法和調色板計算可以忽略不計,因此我們最終將它們保持在最高品質。我們主要透過告訴 ffmpeg 跳過讀取輸入檔來將計算時間從 17 分鐘減少到 1 秒以下。

重點:跳過輸入幀與跳過輸出幀

我們的流程花費如此長的時間的原因是,在使用 image2 解復用器時,丟幀對執行時間沒有幫助。如果你弄亂了-r標誌和fps過濾器,你將影響最終 GIF 中出現的幀數,但 ffmpeg 似乎仍然對所有 15,000 個輸入幀執行某些操作。

我發現讓 ffmpeg 跳過輸入幀的唯一方法是使用concat解復用器。

以下是我現在如何透過跳過輸入影格在 1 秒內在我的開發機器上產生高品質的動畫 GIF 縮圖:

# create text file which describes the ~30 input frames we want ffmpeg to process
seq -f "file 'left_frames.%04g.jpg'" 10000 500 25000 > tmp.txt

# generate the animated gif using ffmpeg only
ffmpeg -f concat -i tmp.txt -filter_complex "scale=150:-1:flags=lanczos,split=2 [a][b]; [a] palettegen [pal]; [b] fifo [b]; [b] [pal] paletteuse" output.gif

相關內容