ffmpeg-pythonを試してみる。

python コンピュータ
python
pythonでffmpegを扱う場合もっぱら外部コマンドとしてffmpeg.exeを呼び出していましたが、ffmpeg-pythonというパッケージがあるようなので試してみたいと思います。
動画から静止画を出力し拡大処理を行い再び動画を作成するアップコンバートするスクリプトを組みたいので、それに必要がありそうな機能を重点的に調べてみました。

パッケージのインストール

ffmepg.exeがインストールされていてパスが切られている環境が前提。

pip install ffmpeg-python

フレームレートを取得

#!/usr/bin/env python3
import ffmpeg

path = './sample.mp4'

info = ffmpeg.probe(path)
r_frame_rate = info['streams'][0]['r_frame_rate']

print(r_frame_rate)

ビデオコーデックを取得

#!/usr/bin/env python3
import ffmpeg

# ビデオコーデックを取得

path = './sample.mp4'

info = ffmpeg.probe(path)

codec_name = ""
for stream in info['streams']:
    if (stream['codec_type'] == 'video'):
        codec_name = stream['codec_name']
print(codec_name)

連番画像を出力

#!/usr/bin/env python3
import ffmpeg
import os
import shutil

# 連番画像を出力

in_file = './sample.mp4'

out_dir = './temp'
if os.path.isdir(out_dir):
    shutil.rmtree(out_dir)
os.mkdir(out_dir)

(
    ffmpeg
        .input(in_file)
        .output("{0}/img%05d.png".format(out_dir))
        .run()
)

連番画像から動画を作成

#!/usr/bin/env python3
import ffmpeg
import os

# 連番画像から動画を作成

in_file = './sample.mp4'
temp_dir = './temp'
dir, file = os.path.split(in_file)
vidoe_file = "{0}/{1}".format(temp_dir, file)
print(vidoe_file)
if os.path.isfile(vidoe_file):
    os.remove(vidoe_file)

video_codec = "h264"
frame_rate = "24000/1001"

(
    ffmpeg
        .input("{0}/img%05d.png".format(temp_dir), framerate=frame_rate)
        .output(vidoe_file, vcodec=video_codec, r=frame_rate, vb="5000k")
        .run()        
)

動画から音声を出力

#!/usr/bin/env python3
import ffmpeg
import os

# 動画から音声を出力

in_file = './sample.mp4'
_, filename = os.path.split(in_file)
basename, ext = os.path.splitext(filename)
temp_dir = './temp'

audio_file = "{0}/{1}.aac".format(temp_dir, basename)
if os.path.isfile(audio_file):
    os.remove(audio_file)
print(audio_file)

(
    ffmpeg
        .input(in_file)
        .output(audio_file, acodec="copy")
        .run()  
)

動画と音声を結合

#!/usr/bin/env python3
import ffmpeg
import os

# 動画と音声を結合

video_file = "./temp/sample.mp4"
audio_file = "./temp/sample.aac"
out_file = "./sample.mp4"

if (os.path.isfile(out_file)):
    os.remove(out_file)

(
    ffmpeg
        .output(ffmpeg.input(video_file), ffmpeg.input(audio_file), out_file, vcodec="copy", acodec="copy")
        .run()
)
ffmpeg.exeのラッパーのようなのでオプション類はffmpeg.exeのオプションがそのまま使える感じです。

コメント