Pythonとffmpegで画像から動画を作る方法|静止画をMP4動画に変換する手順

Pythonで画像から動画を作ることってできるのかなぁ…。静止画をMP4に変換できたら、ブログ用の動画素材とかも作れそうだけど…難しそう…。
猫男
猫男
catman
catman
それならcatmanに任せておくんだ。Pythonとffmpegを使えば、画像から動画を作る処理は意外とシンプルにできるよう。

Pythonとffmpegで画像から動画を作る方法

Pythonとffmpegを使うと、静止画からMP4動画を作成できます。

たとえば、1枚の画像を数秒間表示する動画にしたり、複数の画像を順番に表示するスライドショー動画を作ったりできます。

ブログ用の解説動画、SNS用の簡易動画、YouTubeショート用の素材作成などにも応用しやすい方法です。

この記事では、Pythonからffmpegを実行して、画像からMP4動画を作る手順を紹介します。

 

ffmpegとは

ffmpegは、動画や音声を変換・編集するための強力なツールです。

画像を動画に変換したり、動画の形式を変換したり、音声を追加したり、動画のサイズを変更したりできます。

Pythonだけでも画像処理はできますが、動画変換の部分は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",

 

画像1枚でも動画にできるんですね!スライドの表紙画像を動画化するだけでも使えそうです。
猫男
猫男
catman
catman
そうなんだ。まずは1枚画像から動画化できると、次に複数画像のスライドショー動画にも応用できるよう。

 

複数の画像から動画を作る

次に、複数の画像を使って動画を作る方法です。

たとえば、次のような画像ファイルがあるとします。

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.pngimages/image_002.pngimages/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",
スライドショーのようにゆっくり見せたい場合は、framerateを小さくします

 

画像サイズをそろえて動画を作る

画像のサイズがバラバラだと、動画作成時にエラーが出たり、見た目が崩れたりすることがあります。

その場合は、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を指定することで、一般的なプレイヤーやブラウザで再生しやすい動画になります。

 

画像サイズが違ってエラーになる

複数画像から動画を作る場合、画像サイズがバラバラだとエラーになることがあります。

その場合は、先ほど紹介したscalepadを使って、動画サイズをそろえると安定します。

 

完成版コード

最後に、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で画像の表示速度を調整できる
  • scalepadで動画サイズを整えられる
  • yuv420pを指定すると再生互換性が高くなる

静止画を動画にできるようになると、ブログ記事用の解説動画、SNS投稿用の短い動画、スライドショー動画などを自動で作れるようになります。

Pythonで処理を自動化し、ffmpegで動画を書き出す流れを作っておくと、画像から動画を大量に作成することも可能です。

 

画像から動画を作れると、ブログやSNS用の素材作成にも使えそうですね!
猫男
猫男
catman
catman
その通りだよう。Pythonとffmpegを組み合わせれば、動画作成の自動化まで広げられるんだ。まずは1枚の画像からMP4を作るところから試してみるんだ。

 

EARTHPG 自動化研究所

「その作業、仕組みにできます。」

Google Apps Script、Python、スプレッドシート自動化、WordPress開発、 API連携、AI活用まで対応。 小さな自動化から業務全体の設計まで、研究所が支援します。