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」で判別するといいらしい。
コメント