ffmpegで動画を結合する
- 複数のファイルを結合する (フォルダ内のファイルを結合する)
- フォルダが複数あるのでpython(ffmpy)でまとめて処理する
目次
ffmpegで実行する
ffmpegで結合するメソッドは3つあるそうです。
3つのメソッドについて
https://stackoverflow.com/questions/7333232/how-to-concatenate-two-mp4-files-using-ffmpeg
今回は、フォーマットがmp4であり、再エンコードしたくない(無劣化で結合したい)ため, concat demuxerを使用する。
ffmpeg concat demuxer の使用方法
インデックスファイルを作成
元となる動画のパスのインデックスファイルを作成する
indexfile.txt
file '/path/to/file1.mp4' file '/path/to/file2.mp4' file '/path/to/file3.mp4'
コマンドラインで実行
ffmpeg -f concat -i indexfile.txt -c copy output.mp4
ffmpyで実行する
- 複数のディレクトリに格納されたvideo_dataがある。
- ディレクトリごとに結合ファイルを作成する。
ffmpyのインストール方法は以下の記事参照。
#!/usr/bin/python3 import ffmpy import glob # top_dir以下のsub_dir内にvideo_dataあり top_dir = '/home/user/Videos/testdata' sub_dirs = glob.glob(top_dir + '/*m') # sub_dir毎にインデックスファイルを作成し、videoを結合する for sub_dir in sub_dirs: videos = glob.glob(sub_dir + '/*.mp4') # 書き込み要素の整形 lines = [] for video in videos: line = "file '{}'".format(video) lines.append(line) lines.sort() # インデックスファイルの作成 text_path = sub_dir + '/videolist.txt' with open(text_path,'w') as f: f.writelines('\n'.join(lines)) # ffmpegの設定 ffmpeg_cmd = '-safe 0 -f concat -i {} -c:v copy'.format(text_path) output_path = sub_dir + "/concat.mp4" ff = ffmpy.FFmpeg( outputs={output_path: ffmpeg_cmd} ) ff.run() print('Finished')
ffmpegのオプションについて
- -safe 0 : パスを絶対パスで指定する場合に必要。無いとUnsafeエラーになる。
- -c:v copy : ビデオコーデックのみを無劣化でコピーする。今回は音はいらないため。
以上。