web-dev-qa-db-ja.com

ビデオファイルのバッチマージセット?

158個のフォルダーがあり、それぞれに数分の長さの5〜15個のビデオファイルが含まれています。すべてのビデオをフォルダごとに1つのビデオにマージし、残りを削除したいと思います。

フォルダには、特定の年の日付として名前が付けられ、間にギャップがあります(01.1101.1201.1301.1401.18 ... 01.2802.01など)、およびそれらのファイルの名前は次のとおりです。

ds_AAAAA_BB_CCC_480.mp4

最初の空白(AAAAA)は、そのフォルダー内のすべてのファイルで同じ番号です。フォルダ01.11の場合、番号は03075で、その後はフォルダごとに1つずつ増えていきます。

2番目の空白(BB)は、ファイルの順序です。01から、そのフォルダー内のファイルの数までです。

3番目の空白(CCC)は、ファイルごとに異なる3文字のセットであり、無視できます。

いくつかの例では、最初のフォルダー(01.11)の最初のファイルはds_03075_01_nws_480.mp4です。 4番目のフォルダー(01.14)の最後(7番目)のファイルはds_03078_07_zen_480.mp4です。

理想的には、新しいファイルを別のフォルダーに入れ(古いファイルを簡単に削除できるようにするため)、01_11.mp401_12.mp4などの形式で名前を付けます。しかし、そこにある命名規則は問題ありません。

誰かがこれについてどうやって行くかについて何か提案がありますか?

1
LordZounds

私は最近ビデオをマージ(連結)していますが、 この回答 は非常に便利です。まず、 ffmpeg をインストールし、パス上にあることを確認します。

次の形式のテキストファイルで構成される各ディレクトリのファイルのリストを作成する必要があります。

file `file1.mp4`
file `file2.mp4`
file `file3.mp4`

次に、次の構文でffmpegを実行します。

ffmpeg -f concat -i filelist.txt -c copy merged.mp4

私はこれらをいくつかのファイル用に手作業で作成していましたが、158個のフォルダーの場合は自動化が必要になります。私がとるアプローチは、おそらくWindowsコマンドプロンプトでFORコマンドを使用することです。次のようなものを使用してファイルリストを生成できます。

for /r %f in (*.mp4) do echo file '%~nxf' >>%~dpf\concat.txt

これは再帰的に(/r)現在のフォルダーとすべてのサブフォルダー内のMP4ファイルをスキャンし、名前と拡張子(nxビット)を各サブフォルダー内の個別のファイルにエコー(出力)します( dpビットはドライブ文字とパスを取得します)。 >>ビットを使用すると、ファイル名がリストに追加されるため、これを2回実行すると、リストが重複します。したがって、コマンドを実行する前に、concat.txtファイルを削除してください。

次に、それらのそれぞれでffmpegを実行します。次のようなものが必要になります。

for /d %f in (*) do cd %~ff & ffmpeg -f concat -i concat.txt -c copy ..\merged\%~nf.mp4

ディレクトリ(/d)ごとに、ディレクトリ(cd)に変更し、(&)ffmpegを実行して、最上位の「マージされた」フォルダに入る結果ファイルを生成します。レベルフォルダであり、フォルダ名にちなんで名付けられています。

テストされていないので、自己責任で使用してください。 (ただし、質問せずに何も削除または上書きすることはありません。)

2
benshepherd