昨今のスマートフォンの動画機能はすごい。高画質で長時間の動画の撮影が可能だ。そのため、ついつい長時間の動画を撮影してしまう場面も多い。しかし長時間の動画は編集が面倒だ。そこで、動画を短く分割するプログラムをPythonで作ってみよう。
動画処理に大活躍のライブラリ「FFmpeg」
FFmpegはフリーの動画・音声の変換ツールで、動画処理に欠かせない。動画や音声形式を変換したり、動画から音声を取り出したり、画像を組み合わせて動画にしたりと、様々な処理を手軽に行うことができる。しかし、FFmpegはコマンドラインから使う必要がある。加えて、高機能であるため、オプションが多く、どのように使ったら良いのか分かりにくいという欠点がある。
この欠点を補うことができるのが、Pythonのパッケージ「ffmpeg-python」だ。動画のサムネイルを作成したり、動画から音声を取り出したり、動画にカスタムフィルタをかけたりと、様々な処理をシンプルなプログラムで記述できる。
今回はこのパッケージを利用して、長時間の動画を3分ごとに分割するプログラムを作ってみよう。
ffmpeg-pythonのインストール
最初に、ffmpeg-pythonが使えるようにセットアップしよう。実際のところ、ffmpeg-pythonは、コマンドラインのFFmpegをラップしただけのライブラリであり、ffmpeg-pythonを動かすには、FFmpeg本体が必要となる。つまり、セットアップには以下の2つが必要だ。
・(1) FFmpeg本体 - ダウンロードしてインストール
・(2) ffmpeg-python - コマンドラインからインストール
FFmpegをインストールして環境変数PATHにFFmpegのインストールパスを追加するか、実行するプログラムと同じフォルダに、FFmpeg本体一式をコピーすることで動かすことができる。
FFmpeg本体は、こちらのサイトからダウンロードできる。「Get packages & executable files」という部分から各OS向けのパッケージがダウンロード可能だ。
なお、macOSならHomebrewなどのパッケージマネージャーを使って、ターミナルで「brew install ffmpeg」とコマンドを実行すれば手軽にインストールできる。Ubuntu/Debian Linuxならば「sudo apt install ffmpeg」でインストールできる。
Windowsの場合は、FFmpegのアーカイブを解凍し、binフォルダにある「ffmpeg.exe」と「ffprobe.exe」をこれから作るプログラムと同じフォルダにコピーするのが簡単だ。
そして、Pythonのpipコマンドを使って、ffmpeg-pythonをインストールしよう。ターミナルで以下のコマンドを実行しよう。WindowsならPowerShell、macOSならターミナル.appを開いて以下のコマンドを実行しよう。また、Windowsの場合、「python3」を「python」と読み替えよう。
python3 -m pip install ffmpeg-python
動画の情報を取得するプログラム
それでは、Pythonのプログラムを作ってみよう。最初に動画の情報を取得するプログラムを作ってみよう。
import ffmpeg, pprint
in_file = "test.mp4"
info = ffmpeg.probe(in_file)
pprint.pprint(info)
上記のプログラムを「get_info.py」という名前で保存しよう。そして、適当な動画ファイルを用意して、「test.mp4」という名前で同じフォルダにコピーしよう。そして、ターミナルで以下のコマンドを実行しよう。
python3 get_info.py
すると、以下のように動画に関する情報が表示される。特に注目したい情報が、info["format"]["duration"]で、これは動画の長さを表している。他にも、info["streams"][0]["height"]で動画の高さ、info["streams"][0]["width"]に動画の横幅の情報が得られる。
動画を分割するプログラム
それでは、次に動画を指定の秒数ごとに分割するプログラムを作ってみよう。以下のプログラムは、MP4動画「test.mp4」を3秒毎に分割するプログラムだ。
import ffmpeg, math
# 入力ファイルと何秒ごとに分割するのか指定 --- (*1)
in_file = 'test.mp4'
split_sec = 3.0
# 動画の長さを得る --- (*2)
info = ffmpeg.probe(in_file)
duration = float(info['format']['duration'])
print('duration=', duration)
# 指定秒で分割するとファイルいくつ分になるか --- (*3)
split_num = math.ceil(duration / split_sec)
# 繰り返し動画を分割 --- (*4)
for i in range(split_num):
start = i * split_sec
(
ffmpeg
.input(in_file, ss=start, t=split_sec)
.output('output-{}.mp4'.format(i), c='copy')
.run()
) # 分割処理 --- (*5)
上記のプログラムを「split.py」という名前で保存しよう。そして、以下のコマンドを実行しよう。
python3 split.py
すると、次の画面のように、MP4動画を3秒ごとに分割して、「output-0.mp4」のような名前で保存する。
プログラムを確認してみよう。(*1)の部分では、入力ファイルと何秒ごとに分割するのかを指定する。ここでは、3秒ごとに動画を区切るように指定しているが、実際のところ実用的ではないので、5分ごとの値であれば、5分×60秒=300秒の値、10分ごとであれば、10分×60秒=600秒の値を指定しよう。
そして(*2)で動画の長さを取得する。続く(*3)の部分では(*2)で得た動画の長さを表す変数durationの値を元にして、いくつに分割すれば良いのかを計算し、(*4)にあるfor文で指定回数だけ繰り返し動画を分割する。
なお、(*5)の部分で実際に分割する。ちょっと変わった記述方法を採用しているので見慣れない感じがあるだろうか。これは、JavaScriptなどのプログラミング言語で時々使われるメソッドチェーンと呼ばれるテクニックだ。
ffmpeg.inputメソッドが返すのはStreamオブジェクトだ。そして、このオブジェクトにはoutputメソッドがある。そして、このメソッドもStreamオブジェクトを返す。そして、そのオブジェクトにあるrunメソッドを呼び出す。このように、自身を返すメソッドを数珠つなぎに呼び出していくことで、一連の処理を行うようにするプログラミング手法だ。
なお、ffmpeg-pythonでは、入力ファイルを指定するのがinputメソッド、出力ファイルを指定するのがoutputメソッドで、指定したパラメータを元に実際にFFmpegを実行するのがrunメソッドだ。
まとめ
以上、今回は、ffmpeg-pythonパッケージを利用して、動画を指定時間で分割するプログラムを作ってみた。fmpeg-pythonには動画を分割する以外にも、動画形式を変換したり、音声を分割したり、フィルタをかけたりと様々な処理が可能だ。本家( https://github.com/kkroening/ffmpeg-python )にある、APIリファレンスも詳しいので、参考にして活用しよう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。