web-dev-qa-db-ja.com

FFmpegを使用してディレクトリ内のすべてのビデオからフレームを抽出する

FFmpegを使用して、ディレクトリ内のすべてのファイルから1秒あたり1フレームを抽出しようとしています。

このコマンドを個々のファイルに使用しますが、代わりにディレクトリを入力する方法がわかりません。

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

理想的には、フレームを以下のように独自のフォルダーに保存したいのですが、私はthinkその部分を自分で解決できます。それらがすべて同じプレフィックスと連番で同じフォルダに出力されれば問題ありません。

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

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

私は何時間も試してきましたが、まだ完全に迷っています。どんな助けでも非常にありがたいです。

2
River

やった!このコードは、フレームを元のビデオと同じ名前のフォルダーに出力します。フレームの前にはビデオ名が付けられ、その後に001から始まる連番が付けられます。したがって、私のファイルでは「/clip1/clip1-001.jpg」などが出力されます。

あなたが私のようで、何をしているのかわからない場合に備えて、以下のコードをメモ帳に貼り付け、「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

または、すべてのフレームを1つのフォルダーに入れたい場合。出力の最初の%% 〜nFを優先ディレクトリに置き換えます。私の例を使用すると、C:\ whereever\%% 〜nF\%% 〜nF-%% 3d.jpgからC:\ wherever\frames\%% 〜nF-%% 3d.jpgに移動します。また、2行目を編集して新しい場所をポイントし、不要なディレクトリが大量に作成されないようにするか、2行目を完全に削除することもできます。 2行目を削除する場合は、最初にその「フレーム」フォルダーを自分で作成する必要があります。

編集-処理する前に、ファイル名からすべてのスペースを削除する必要がある場合があります。 「一括名前変更ユーティリティ」を使用すると、時間を大幅に節約できます。

2
River