FFMPEG:將影片轉換為動畫 Gif 預覽,間隔後取得幀

FFMPEG:將影片轉換為動畫 Gif 預覽,間隔後取得幀

我想為我的應用程式產生 gif 預覽,並使用 FFMPEG 將其製作在我的伺服器上。

它應該為每個影片產生一個 10 幀的 gif,但如果可能的話,不使用臨時目錄(或與每個幀相關的臨時檔案)。

關於這個答案超級用戶網站,它應該使用每一幀生成一個 gif,這不是我需要的。

看起來很奇怪,但我需要的效果是你可以在許多色情網站上看到的效果(我不記得這些是什麼)

答案1

如果我理解正確的話FFmpeg Wiki 上的這篇文章名為“每 X 秒影片建立一個縮圖”表明 FFmpeg 不能做你想要它做的事情(沒有一些自動計算)。

維基百科說這是你最好的鏡頭 - 它會為原始影片的-vf "fps=fps=XYZ"每一幀創建一個縮圖/幀。XYZ如果您確實想要每個影片 10 張圖片並且它們都有不同的長度,您可以先讀取總幀數,然後使用腳本計算所需的 fps:

XYZ=wanted_frames_times_actual_fps/total_frames_of_vid

在您的情況下,例如(PAL)或(NTSC),其中wanted_frames_times_actual_fps表示小時,表示分鐘,表示秒,表示幀(在最後計算的秒之後)。10*2510*30total_frames_of_vid=(hh*3600+mm*60+ss)*25+ffhhmmssff計算範例:每秒 25 幀的時間碼01:35:45:24(或用 FFmpeg 的術語,因為 FFmpeg 不使用幀而是毫秒)相當於總共 143649 幀。01:35:45.960

這個解決方案可以很好地工作- 您只需要找到一種方法來獲取視頻的總時間(例如通過ffprobe)及其fps(如果您無法獲得正確的時間碼),然後將該信息存儲為名為的變數$total_frames_of_vid


我在 Wiki 的“另請參閱”部分中找到了另一種方法,連結到 名為「使用 FFmpeg 的影片的有意義的縮圖」的超級用戶問題建議使用:

ffmpeg -hide_banner -i <YOUR_VIDEO> -vf "select=gt(scene\,0.8)" -frames:v 10 -vsync vfr -vf "fps=fps=1/200" -y out%03d.png

(我稍微修改了程式碼 - 將圖像編解碼器更改為 PNG 並更改了-frames:v和 的值fps。還更改了輸出圖像的名稱中包含三位數字。)

然後將它們重新編碼為您的 GIF。

這個解決方案還需要一些計算或體力勞動,因為所有選項的值(特別是fps需要根據視頻的長度進行更改。即,我嘗試了超級用戶的原始代碼和 35 分鐘的視頻,但只得到了 5 幀) 。

相關內容