使用 FFmpeg 從目錄中的所有影片中提取幀

使用 FFmpeg 從目錄中的所有影片中提取幀

我正在嘗試使用 FFmpeg 從目錄中的每個檔案中每秒提取一幀。

我對單一檔案使用此命令,但我不知道如何輸入目錄:

ffmpeg -i "C:\input\clip1.mp4" -vf fps=1 -qscale:v 2 "C:\output\clip1\clip1A"%d.jpg

理想情況下,我希望將幀保存到自己的資料夾中,如下所示,但我思考我可以自己解決那部分。如果它們全部輸出到具有相同前綴和順序編號的相同資料夾,那就沒問題了。

C:\output\clip1\clip1-001.jpg,clip1-002.jpg

C:\output\clip2\clip2-001.jpg,clip2-002.jpg

我已經嘗試了好幾個小時了,但我仍然完全迷失了。任何幫助都將非常感激。

答案1

完成了!此程式碼會將幀輸出到與其來源的影片同名的資料夾中。這些幀將以視訊名稱為前綴,並以從 001 開始的序號作為後綴。

以防萬一您像我一樣並且不知道自己在做什麼,請將以下程式碼貼到記事本中,另存為“extractframesorwhatever.bat”,然後從剪輯所在的目錄運行。

for %%F in (*.mp4) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.jpg
)

如果您想將資料夾輸出到其他地方,請更改:

If not Exist "%%~nF" MkDir "%%~nF"

對於這樣的事情:

If not Exist "C:\wherever\%%~nF" MkDir "C:\wherever\%%~nF"

如果您這樣做,您還需要更改輸出(在我的範例中):

%%~nF\%%~nF-%%3d.jpg

C:\wherever\%%~nF\%%~nF-%%3d.jpg

或者,如果您希望將所有幀放在一個資料夾中。將輸出中的第一個 %%~nF 替換為您的首選目錄。使用我的範例,它將從 C:\wherever\%%~nF\%%~nF-%%3d.jpg 轉到 C:\wherever\frames\%%~nF-%%3d.jpg。您還需要編輯第二行以指向新位置並阻止它建立一堆不必要的目錄,或完全刪除第二行。如果刪除第二行,則必須先自行建立「frames」資料夾。

編輯 - 您可能需要刪除檔案名稱中的所有空格,然後才能對其進行處理。 “批量重命名實用程式”可以為您節省大量時間。

答案2

我喜歡這種提取幀的方法,非常方便。但是當我使用您提供的程式碼時:

for %%F in (*.mp4) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.jpg
)

我得到兩個輸出資料夾:

文件名之一(這是我希望圖像所在的位置)和測試資料夾(這是我的圖像的位置)。

我知道這就是程式碼應該如何運作的,但也許過去四年的變化已經改變了程式碼現在的工作方式。但實際上,總而言之,這並不算太不方便。

我還要補充一點,對於那些想要製作更高品質的 GIF 的人,您可以將 .jpg 更改為 .png。

另外,您可以透過更改 (.mp4) 進入 (.mkv),我知道它有效。

我假設所有其他視訊格式也可以使用,例如(.avi), (.mpeg), (.ts), (.flv) 等 -雖然這還沒有經過測試。

但由於我和OP一樣,我不理解這段程式碼,只能複製/貼上我在網路上找到的內容並進行一些嘗試,因此準備好.bat檔案很方便。

我只想知道如何修復正在創建的“測試”資料夾,並將螢幕截圖放入它已經創建的文件名資料夾中。

為了展示我如何更改程式碼以適用於其他影片格式,我將提供幾個範例:

我知道第一個範例適用於 .mkv 檔案而不是 .mp4,將螢幕截圖製作為 .png。

for %%F in (*.mkv) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.png
)

最後一個範例應該適用於 .ts 文件,將螢幕截圖轉換為 .png。

for %%F in (*.ts) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.png
)

相關內容