ffmpegで行う処理を自動化したかったけど、pythonから直接subprocessで実行するのは苦労しそうなので パッケージのffmpeg-pythonを使用することにした。
ドキュメントを見るとクリエイティビティあふれるサンプルしかなくてただエンコードするだけの使い方がよく分からなかったので残しとく。
確認はUbuntu 18.04で実施。
スクリプト例はPython2を想定。
目次
参考
- GitHub – https://github.com/kkroening/ffmpeg-python
- ドキュメント – https://kkroening.github.io/ffmpeg-python/
インストール
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」で判別するといいらしい。
コメント