#はじめに
自分なりにffmpeg-pythonの使い方をまとめる
ffmpeg.exe
をsubprocess
で操作するよりは目に優しそうだったので…
#ffmpeg-pythonの取得
pipでインストール。
pip install ffmpeg-python
※ちなみに、似たようなラッパーがいくつかあるので注意。2ミス。
○ pip install ffmpeg-python
------------------------------
× pip install ffmpeg
× pip install python-ffmpeg
#ffmpegの取得
ffmpeg-pythonはただのラッパーなので、ffmpeg.exe本体がないと使えない。FFmpeg.exeが見つからなくてもFileNotFoundになるので、事前に公式サイトから取得しておくこと。
※ちなみに、動画の編集だけならffmpeg.exeだけでいいが、動画ファイルから動画情報を取得するffmpeg.probe()という処理を実行するためにはffprobe.exe
も必要なので注意。
利用方法
環境変数
「パスを通せ」と他の紹介記事では書かれていたが、スクリプトと同一フォルダに.exeを配置すればよさそう
##動画をトリミングする
以下をやってみる。
- 5秒目から10秒間を切り取り
- FPSを落として
- 画質を落として、出力する(crfは数値:小=高画質、数値:大=低画質)
- 出力ファイルがあった場合は上書きする。
imort ffmpeg
ffmpeg.input('input.mp4',ss=5,t=10)\ #動画開始後、5秒目から、10秒間の動画を切り出す。
.filter('fps', fps=15, round='up')\ #FPSを変換する。FPS:10に落とす。
.output('output.mp4',crf=30)\ #動画をエンコードする。画質をcrf=30に指定
.run(overwrite_output=True) #もし既存ファイルがあっても上書き保存する
動画を10秒ごとに分割する
動画ファイルの長さを抽出して、10秒ごとに分割するForループを作ってみた。
# %%
#動画の長さをffmpeg.probeで取得して小数切り上げ
info=ffmpeg.probe('input.mp4')
t=float(info["format"]["duration"])
t=int(-(-t // 1))
#0秒から動画の長さまで10秒刻みの数列を作成
start,stop,step=0,t,10
li=list(range(start,stop,step))+[stop]
li
#%%
#10秒おきに動画を分けて保存。
for i in range(len(li[:-1])):
FILEIN="input.mp4"
param={
"FILEOUT":"{}_output_{}_{}.mp4".format(FILEIN[:-4],li[i],li[i+1]),
"TIME_START":li[i],
"TIME_END":li[i+1],
"FPS":10,
}
ffmpeg.input(FILEIN,ss=param["TIME_START"],t=param["TIME_END"]-param["TIME_START"])\
.filter('fps', fps=param["FPS"], round='up')\
.output(param["FILEOUT"],crf=30)\
.run(overwrite_output=True)
#おわりに
必要十分な気がする。
#参考記事
もし結合がしたければ以下の記事が参考になりそう。
https://blog.shikoan.com/ffmpeg-python-concat/