Windows: FFmpeg を使用してメディア ファイルの長さのディレクトリをバッチ再帰的に検索する

Windows: FFmpeg を使用してメディア ファイルの長さのディレクトリをバッチ再帰的に検索する

さまざまなフォルダーにさまざまな種類のメディア ファイル (例: .wav、.mp4) があります。バッチ ファイルを使用して、次のように、それらの継続時間のリストを作成したいと思います。

D:\Some Folder 1\Movie File.mp4 | 2:15:23
E:\Some Folder 2\Audio File.mp3 | 0:08:17

必要に応じて、別のドライブでバッチ ファイルを手動で再実行します。リストには、Windows ファイル名の一部ではないとわかっている | 記号などが含まれるのが理想的です。これにより、Excel でリストを解析するときに、ファイル パスと名前を期間から分離しやすくなります。

次のように、単一のフォルダー内の指定されたファイルタイプのリストを提供する MediaInfo コマンドがあります。

mediainfo --output=General;%FileName%.%FileExtension%^|%Duration/String3%\r\n *.mp3 *.wav

これに関して私が問題視しているのは、(1) フォルダ内のファイルタイプのセットが制限されていないことです。.mp3 と .wav (この例) がそれらすべてをキャプチャできるとは確信できません。(2) 現在のニーズを満たし、将来のニーズに合わせてコマンドを変更できると確信できるような詳細な MediaInfo ドキュメントが見つかりません (例:カリシアン(3)私はバッチ再帰の達人ではない。つまり、そのコマンドをforループでラップする複数の方法を試したにもかかわらず、1 2StackExchangeのディスカッションと古いDoom9フォーラムを推奨していますusebackqが、複数のフォルダにまたがって動作させることができません。(4)理想的には、これらのツールを学習するための長期的な取り組みの一環として、とにかくffmpeg/ffprobeでこれを行う方法を学ぶつもりです。

ffprobe では、これが単一のファイルに対して機能することがわかりました。

ffprobe -i "input.mp4" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

あまりエレガントではないが、おそらくより適応性の高い代替としてバッチファイル-- ただし、ファイル名と継続時間を同じ出力行に表示する方法が明確ではありませんでした。しかし、MediaInfo と同様に、これを複数のファイルに拡張したり (たとえば、「input.mp4」を「*.*」に置き換えたり)、上記の方法を使用して再帰的にしたりすることはできませんでした。たとえば、次の例を試しました。ジャック・アランの提案:

for /R %f in (*.*) do ffprobe -i *.* -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

しかし、ファイル情報は生成されませんでした。

私の質問:バッチ ファイルで ffmpeg/ffprobe を使用して、複数のフォルダーから再帰的に取得したメディア ファイルのリストを完全なパスと期間とともに生成するにはどうすればよいですか?

答え1

バッチファイルからこれを試してください:

for /R %%i in (*) do ffprobe -i "%%~fi" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

コマンドプロンプトからこれを試してください:

for /R %i in (*) do ffprobe -i "%~fi" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

答え2

ここでも同じニーズがあります。私は苦労していたので答えに非常に興味がありました。そして、いくつかの試行の後、ここにエレガントでない解決策がありますが、それは私にとってはうまくいきました

/R %f in (*) で (echo "%~ff" >>"filename.txt" & ffprobe -i "%~ff" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal >>"filename.txt") を実行します。

関連情報