ffmpeg-pythonを使って動画の一区画を切り取り(クロッピング・トリミング)する。


はじめに

pythonで動画をいじりたいとき、一区画を切り取り(クロッピング・トリミング)するのに手こずったのですが、
ffmpeg-pythonを使ってうまくいったのでメモです。

環境

OS:MacOS Mojave 10.14.4
python:3.6
ffmpeg-python:0.2.0

準備

ffmpeg-pythonをインストールします。

$ pip install ffmpeg-python

コード

cropvideo.py
import ffmpeg

upper_left_x = XX
# 切り取りたい区画のx座標(px)
upper_left_y = XX
# 切り取りたい区画のy座標(px)
width = XX
# 切り取りたい区画の幅(px)
height = XX
# 切り取りたい区画の高さ(px)

stream = ffmpeg.input('sample.mp4')
# sample.mp4に切り取りたい動画を入れる

stream = ffmpeg.crop(stream, upper_left_x, upper_left_y, width, height)

stream = ffmpeg.output(stream, 'cropoutput.mp4')
# cropoutput.mp4が切り取った動画で出てきます。

ffmpeg.run(stream, overwrite_output=True)
# overwrite_output=Trueとすることで同じファイル名の動画がすでにあっても上書きします。

upper_left_x, upper_left_y, width, heightはそれぞれ切り出したいところを自分でpxで指定する必要があります。

「pxの位置なんか分からんやん!」という場合

動画から静止画を取り出して、それをGIMPで表示されることで目視確認ができます。

まず、動画から静止画を1フレーム取り出します。

getimage.py
import ffmpeg

tpoint = XX
# 取り出したい静止画の時間(tpoint = 10 なら動画の10秒時点の静止画が取れる)

imagename = 'hogehoge.jpg'
#取り出したい静止画のファイル名を指定

stream = ffmpeg.input('sample.mp4')
# sample.mp4に切り取りたい動画を入れる

stream = ffmpeg.output(stream, imagename, ss=tpoint, vframes=1, f='image2')
ffmpeg.run(stream)

取り出した静止画をGIMPで開きます。


そしてまず、切り取りたい部分の左上にマウスカーソルを合わせます。(画像にカーソルが表示されていませんが、大体赤丸が付いているとこらへんを指しています。)
そうするとGIMP画面左下に「x座標,y座標」がpxで表示されます。
この座標がupper_left_x, upper_left_yに対応します。


次に切り取りたい部分の右下にマウスカーソルを合わせます。
同様にGIMP画面左下にある座標を確認し、
width = 右下のx座標 - 左上のx座標
height = 右下のy座標 - 左上のy座標
とすればOKです。

おわりに

上記の手順を踏むことで動画の一区画の切り取りができたのですが、
切り取られた動画の画質が元の画質より低いような気がしているのが現状難点です。

「もっと上手くできるだろ!」っていうのあれば、教えて頂けると嬉しいです。