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

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

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

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

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

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

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

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

何時間も試していますが、まだ完全にわかりません。どんな助けでもいただければ大変助かります。

答え1

できました! このコードは、フレームを、そのフレームが保存されているビデオと同じ名前のフォルダーに出力します。フレームの先頭にはビデオ名が付けられ、末尾には 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:\wherever\%%~nF\%%~nF-%%3d.jpg から C:\wherever\frames\%%~nF-%%3d.jpg になります。また、2 行目を新しい場所を指すように編集して不要なディレクトリが大量に作成されないようにするか、2 行目を完全に削除する必要があります。2 行目を削除する場合は、まず「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
)

出力フォルダーが 2 つあります。

ファイル名 (画像を保存する場所) とテスト フォルダー (画像が実際に保存される場所) の 1 つです。

これがコードの本来の動作方法であることはわかっていますが、おそらく過去 4 年間の変更により、現在のコードの動作方法が変わったのでしょう。しかし、全体としては、それほど不便ではありません。

さらに、より高品質の GIF を作成したい場合は、.jpg を .png に変更するだけで済みます。

また、(.mp4)を(.mkv) で、これが機能することがわかっています。

他のビデオ形式も動作すると思います。例えば、.avi)、(.mpeg)、(.ts)、(.flv)など -ただし、これはテストされていません。

しかし、私も OP と同じようにこのコードを理解しておらず、オンラインで見つけたものをコピー/貼り付けして少しいじっているだけなので、.bat ファイルを準備しておくと便利です。

作成されている「test」フォルダーを修正し、スクリーンショットをファイル名で既に作成されているフォルダーに保存する方法を知りたいだけです。

他のビデオ形式で動作するようにコードをどのように変更したかを示すために、いくつかの例を示します。

動作することがわかっている最初の例は、.mp4 ではなく .mkv ファイルで、スクリーンショットを .png にするものです。

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

最後の例は、スクリーンショットを .png に変換する .ts ファイルで機能するはずです。

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

関連情報