PythonでPNGを動画に変換する方法:自動化手法で手軽に実現するステップガイド
Pythonとffmpegで画像から動画を作る方法
Pythonとffmpegを使うと、静止画からMP4動画を作成できます。
たとえば、1枚の画像を数秒間表示する動画にしたり、複数の画像を順番に表示するスライドショー動画を作ったりできます。
ブログ用の解説動画、SNS用の簡易動画、YouTubeショート用の素材作成などにも応用しやすい方法です。
この記事では、Pythonからffmpegを実行して、画像からMP4動画を作る手順を紹介します。
ffmpegとは
ffmpegは、動画や音声を変換・編集するための強力なツールです。
画像を動画に変換したり、動画の形式を変換したり、音声を追加したり、動画のサイズを変更したりできます。
Pythonだけでも画像処理はできますが、動画変換の部分はffmpegを使うとかなり便利です。
ffmpegをインストールする
まずはffmpegを使えるようにします。
Macの場合は、Homebrewを使って次のようにインストールできます。
brew install ffmpeg
インストールできたら、ターミナルで次のコマンドを実行します。
ffmpeg -version
バージョン情報が表示されれば、ffmpegの準備は完了です。
1枚の画像から動画を作る
まずは、1枚の画像を使って動画を作る方法です。
たとえば、次のような画像ファイルがあるとします。
image.png
この画像を5秒間表示するMP4動画に変換してみます。
Pythonコード
import subprocess
image_path = "image.png"
output_path = "output.mp4"
command = [
"ffmpeg",
"-loop", "1",
"-i", image_path,
"-t", "5",
"-r", "30",
"-pix_fmt", "yuv420p",
output_path
]
subprocess.run(command)
このコードを実行すると、image.pngからoutput.mp4という動画ファイルが作成されます。
コードの意味
主な部分を確認しておきます。
| 指定 | 意味 |
|---|---|
-loop 1 |
画像を繰り返し表示する |
-i image.png |
入力する画像ファイル |
-t 5 |
動画の長さを5秒にする |
-r 30 |
フレームレートを30fpsにする |
-pix_fmt yuv420p |
多くの環境で再生しやすい形式にする |
output.mp4 |
出力する動画ファイル |
-tの値を変えると、動画の長さを変更できます。
たとえば10秒の動画にしたい場合は、次のようにします。
"-t", "10",
複数の画像から動画を作る
次に、複数の画像を使って動画を作る方法です。
たとえば、次のような画像ファイルがあるとします。
images/
image_001.png
image_002.png
image_003.png
このような連番画像を使うと、ffmpegで動画に変換しやすくなります。
連番画像から動画を作るPythonコード
import subprocess
input_pattern = "images/image_%03d.png"
output_path = "slideshow.mp4"
command = [
"ffmpeg",
"-framerate", "1",
"-i", input_pattern,
"-r", "30",
"-pix_fmt", "yuv420p",
output_path
]
subprocess.run(command)
このコードでは、images/image_001.png、images/image_002.png、images/image_003.pngのような画像を順番に読み込み、動画に変換します。
%03dの意味
%03dは、3桁の連番を表します。
つまり、次のようなファイル名に対応します。
image_001.png
image_002.png
image_003.png
image_004.png
もし画像名が次のようになっている場合は、
image_1.png
image_2.png
image_3.png
%dを使います。
input_pattern = "images/image_%d.png"
画像1枚あたりの表示時間を変える
先ほどのコードでは、-framerate 1を指定しています。
これは、1秒に1枚の画像を表示するという意味です。
つまり、1枚の画像が約1秒ずつ表示されます。
もし1枚の画像を2秒ずつ表示したい場合は、次のようにします。
"-framerate", "0.5",
反対に、1秒間に2枚表示したい場合は、次のようにします。
"-framerate", "2",
画像サイズをそろえて動画を作る
画像のサイズがバラバラだと、動画作成時にエラーが出たり、見た目が崩れたりすることがあります。
その場合は、ffmpeg側でサイズを指定して出力すると便利です。
たとえば、横1920px、縦1080pxの動画にしたい場合は、次のようにします。
import subprocess
image_path = "image.png"
output_path = "output.mp4"
command = [
"ffmpeg",
"-loop", "1",
"-i", image_path,
"-t", "5",
"-vf", "scale=1920:1080",
"-r", "30",
"-pix_fmt", "yuv420p",
output_path
]
subprocess.run(command)
-vfは、動画フィルターを指定するオプションです。
"-vf", "scale=1920:1080",
この部分で、動画サイズを1920×1080にしています。
画像の縦横比を保ったまま動画にする
ただし、単純にscale=1920:1080を指定すると、画像の縦横比が変わってしまう場合があります。
画像を無理やり引き伸ばしたくない場合は、次のように指定します。
import subprocess
image_path = "image.png"
output_path = "output.mp4"
command = [
"ffmpeg",
"-loop", "1",
"-i", image_path,
"-t", "5",
"-vf", "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2",
"-r", "30",
"-pix_fmt", "yuv420p",
output_path
]
subprocess.run(command)
この指定を使うと、画像の比率を保ったまま、余白を追加して1920×1080の動画にできます。
YouTube用の横長動画を作りたいときに便利です。
よくあるエラー
ffmpegが見つからない
次のようなエラーが出ることがあります。
FileNotFoundError: [Errno 2] No such file or directory: 'ffmpeg'
これは、Pythonからffmpegを実行できていない状態です。
ffmpegがインストールされているか確認しましょう。
ffmpeg -version
ターミナルでこのコマンドが動かない場合は、ffmpegのインストールが必要です。
動画が再生できない
MP4を書き出したのに、一部の環境で再生できない場合があります。
その場合は、次の指定を入れておくと改善しやすいです。
"-pix_fmt", "yuv420p",
yuv420pを指定することで、一般的なプレイヤーやブラウザで再生しやすい動画になります。
画像サイズが違ってエラーになる
複数画像から動画を作る場合、画像サイズがバラバラだとエラーになることがあります。
その場合は、先ほど紹介したscaleやpadを使って、動画サイズをそろえると安定します。
完成版コード
最後に、1枚の画像から5秒のMP4動画を作る完成版コードを載せておきます。
import subprocess
from pathlib import Path
def create_video_from_image(image_path, output_path, duration=5):
image_path = str(image_path)
output_path = str(output_path)
command = [
"ffmpeg",
"-y",
"-loop", "1",
"-i", image_path,
"-t", str(duration),
"-vf", "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2",
"-r", "30",
"-pix_fmt", "yuv420p",
output_path
]
subprocess.run(command, check=True)
image_file = Path("image.png")
output_file = Path("output.mp4")
create_video_from_image(image_file, output_file, duration=5)
-yを指定しているので、同じ名前の動画ファイルがある場合は上書きされます。
上書きしたくない場合は、"-y"を削除してください。
まとめ
Pythonとffmpegを使うと、画像から動画を簡単に作成できます。
今回紹介した内容をまとめると、次のようになります。
- 1枚の画像からMP4動画を作れる
- 複数の連番画像からスライドショー動画を作れる
-tで動画の長さを指定できる-framerateで画像の表示速度を調整できるscaleやpadで動画サイズを整えられるyuv420pを指定すると再生互換性が高くなる
静止画を動画にできるようになると、ブログ記事用の解説動画、SNS投稿用の短い動画、スライドショー動画などを自動で作れるようになります。
Pythonで処理を自動化し、ffmpegで動画を書き出す流れを作っておくと、画像から動画を大量に作成することも可能です。