Kinaconの技術ブログ

Ubuntuはじめました。

ffmpegで動画を結合する

f:id:m-oota-711:20190222214559p:plain


  • 複数のファイルを結合する (フォルダ内のファイルを結合する)
  • フォルダが複数あるので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のインストール方法は以下の記事参照。

www.kinacon-blog.work


#!/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 : ビデオコーデックのみを無劣化でコピーする。今回は音はいらないため。


以上。