ffmpeg-pythonでエンコード処理したときの使い方メモ

 ffmpegで行う処理を自動化したかったけど、pythonから直接subprocessで実行するのは苦労しそうなので パッケージのffmpeg-pythonを使用することにした。
 ドキュメントを見るとクリエイティビティあふれるサンプルしかなくてただエンコードするだけの使い方がよく分からなかったので残しとく。

 確認はUbuntu 18.04で実施。
 スクリプト例はPython2を想定。

参考

インストール

Python2の場合

sudo apt install python-pip
sudo pip install ffmpeg-python

Python3の場合

sudo apt install python3-pip
sudo python3 -m pip install ffmpeg-python

 日本語のファイル名とか扱う場合はデフォルトでユニコード処理するpython3のほうが何も考えなくていいので楽かも。

エンコードする簡単なスクリプト

#!/usr/bin/python

import ffmpeg

(
    ffmpeg
    .input('./test.avi')
    .output('./test.mp4', vcodec='libx264', crf=23, preset='slow')
    .run()
)

エンコードのオプションを辞書で指定する

#!/usr/bin/python

import ffmpeg

in_video = './test.avi'
out_video = './test.mp4'

in_options = {}
out_options = {'vcodec':'libx264', 'crf':23, 'preset':'slow'}

(
    ffmpeg
    .input(in_video, **in_options)
    .output(out_video, **out_options)
    .run()
)

 オプションは辞書にして渡すことで動的に変えるのが楽になる。

動画の情報を取得する

#!/usr/bin/python

import ffmpeg
import json

video_info = ffmpeg.probe('./test.avi')

print(json.dumps(video_info, indent=2))

video_stream = next((stream for stream in video_info['streams'] if stream['codec_type'] == 'video'), None)
print('bitrate : ' + video_stream['bit_rate'])

 ffprobeを使って取得した動画情報をJSONで返してくれる。
 「streams」内に雑多に動画や音声や字幕が入り順番もまちまちなため、「codec_type」で判別するといいらしい。

コメント