今日は、Python×ffmpegで複数の動画ファイルを一つにまとめる方法をご紹介します。
やりたいこと
こんなイメージです。すでに用意してある動画を一つの動画としてまとめます。
動画を結合するときに気を付けたいこと
ffmpegで動画を結合する方法はいくつかありますが今回はファイルリストを使用して動画を結合する方法をご紹介します。
ファイルリストを使用して動画を結合する場合、ffmpegではこのように記述します。
ffmpeg -f concat -i 結合したい動画のリスト -y 出力ファイル名
FFmpegのconcatは、複数の動画ファイルを連結するための方法です。同じコーデックを持つファイルを連結する場合、ファイルリストを作成する方法が便利です。この方法は、動画のコーデックやフレームレートなどが同じ場合に利用できます。
動画のコーデックとは、映像や音声を圧縮に使用されているプログラムのことです。代表的な動画コーデックには、H.264、AV1、VP9、MPEG-4などがあります。フレームレートやサンプリング周波数などのパラメータで表されます。
フレームレートやオーディオサンプルレートが異なる場合、ffmpegとしてのエラーとはなりませんが、作成した動画がおかしなデータになります。(開けなかったり、音と映像がずれていたり)実行してみてエラーが出る場合は結合するデータの形式を確認してみてください。ちなみに、自分はフレームレートは事前に確認しても、よくオーディオサンプルレートが異なっていることに気が付かずにハマっていたりします。フレームレートやオーディオサンプルレートはffmpegを使用して確認することもできますが、Windowsを使用している場合はファイルのプロパティから確認することもできます。
動かしてみよう
引数として指定するファイルリストはテキストファイルです。その内容はこのようになっています。
fililist.txt
file CAT0699.mp4
file CAT0700.mp4
file CAT0706.mp4
file CAT0710.mp4
「file」+「半角スペース」+「ファイル名」です。まずはこのファイルリストをpythonで作成していくことになります。
今回は「concat」というフォルダをあらかじめ作っておき、そのフォルダの中に結合するファイルリストを作成します。
その後subprocessからffmpegを実行して動画の結合を行います。
import glob
import os
import subprocess
#結合したい動画を入れておくフォルダ
target_dir = "concat/"
#結合後のファイル名
merge_filename = "concat_cat.mp4"
#フォルダ内の動画を取得
videos = glob.glob(target_dir + '*.mp4')
count = 0
with open(target_dir+'filelist.txt', 'w',encoding='UTF-8') as f:
for video in videos:
f.write("file " + os.path.basename(video) +"\n")
count = count+1
print('{} file'.format(count))
subprocess.run('ffmpeg -f concat -i ' +target_dir + 'filelist.txt -c copy -y '+ merge_filename)
こちらのコードを実行すると一つのファイルになります。
この方法は「同じ形式でなければ結合できない」「ファイルリストを作成しなければならない」など制約がありますが、逆に言えば同じ形式のファイルならば簡単かつ高速に結合することができます。
30以上ある動画ファイルも一瞬で結合することができます。これは便利!動画を編集するときは動作に時間がかかることが多いですが、条件がそろっていればこの方法で結合するのは効果的ですね。
今回は、Python×ffmpegで複数動画を結合する方法をご紹介しました。ぜひ活用してみてくださいね。