Python
ffmpeg
python3

ffmpeg-pythonを使ってみた

初めに

機械学習で動画関係のデータセット準備に当たって必要な箇所のみの動画に抜き出したりなどの加工をしたかったため書きました
openCVはなぜがffmpegをうまく読み込んでくれないので、ffmpegを直接いじろうとしたところ、ffmpeg-pythonというライブラリを見つけたので、そちらを使って見る事にしました

ffmpegはほぼ使った事ない初心者です

使用ライブラリ

ffmpeg-pythonを利用します

pip install ffmpeg-python

でインストール

動画の一部をクリップする

動画は自分のiphoneの中にあった、うまい棒で某友人釣る動画をinput.MOVという名前で保存しています
5秒間の動画ですので、2~4秒目を抜き出す事にします

公式ドキュメントを見ると

ffmpeg.trim(parent_node, **kwargs)
Trim the input so that the output contains one continuous subpart of the input.

trimがあったのでこれを使えばできると思い色々試しましたが、これが罠でした

正解は

import ffmpeg

# 入力
stream = ffmpeg.input('input.MOV')


# 出力
stream = ffmpeg.output(stream, 'output.mov',t=2,ss=2)

# 実行
ffmpeg.run(stream)


ffmpeg.outputの中で指定する事でした

ss=2で2秒目からt=2で2秒間抜き出すという指定をするだけです

動画を画像化する

input.MOVの動画を画像化します
fps5で画像化するようにします

こちらもffmpeg.outputで指定します

import ffmpeg

# 入力
stream = ffmpeg.input('input.MOV')


# 出力

stream = ffmpeg.output(stream, 'images/%05d.jpg',r=5 ,f='image2')

# 実行
ffmpeg.run(stream)

f='image2'で画像化をするフォーマットを指定し
imagesフォルダーの中に画像を保存したいので、images/%05d.jpgと保存するファイル名の前にフォルダを指定しています

画像名は%05d.jpgとなっているので5桁の整数で(桁が足りない分は0で埋める)連番になっているファイル名をjpg形式で保存しています

注意点

ffmpeg-pythonではフォルダーを作ることができないようです
なので、os.mkdir(フォルダー名)を使いffmpeg.runを実行する前に事前にフォルダーを作っておきましょう

二つの処理を重ねて

もちろん指定した秒数抜き出すのと、画像化する処理は同時にすることができます

import ffmpeg

# 入力
stream = ffmpeg.input('input.MOV')


# 出力
stream = ffmpeg.output(stream, 'images2/%04d.jpg',t=2,ss=2,r=5 ,f='image2')

# 実行
ffmpeg.run(stream)