初めに
機械学習で動画関係のデータセット準備に当たって必要な箇所のみの動画に抜き出したりなどの加工をしたかったため書きました
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
の動画を画像化します
fps
は5
で画像化するようにします
こちらも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)