Raspberry Piの動画撮影・録画方法|picamera2とH264Encoderでmp4を作るPythonコード例【2026年版】

プログラミング・電子工作






Raspberry Piの動画撮影・録画方法|picamera2とH264Encoderでmp4を作るPythonコード例【2026年版】|YOFUKASI AI




Raspberry Pi / Python

Raspberry Piの動画撮影・録画方法――picamera2で映像をエンコードして残す。

静止画のcapture_file()をそのまま動画に応用しようとして、エラーで止まっていませんか。H264Encoderとoutputの指定から、mp4形式で保存する手順までを解説します。

YOFUKASI AI編集部 | 更新日:2026年8月18日 | 読了目安:約12分

Chapter 01 — Introduction

01動画撮影は静止画撮影と「考え方」が違う

結論から言えば、picamera2で動画を録画するには、静止画撮影にはなかった2つの部品――エンコーダー出力先(output)――を明示的に指定する必要がある。静止画はcapture_file()を呼ぶだけで済んだが、動画は連続したフレームを圧縮しながらファイルに書き出す必要があるため、その圧縮方式(エンコーダー)と書き出し先を別途用意しなければならない。

実例として、start_recording()を呼び出した際に「必要な位置引数outputが足りない」というエラーに遭遇した相談が、Raspberry Pi公式フォーラムに投稿されている。Problem Using start_recording with Picamera2 on Raspberry Pi(Raspberry Pi Forums)では、エンコード方式(H264Encoderなど)を指定すべきであり、mp4として出力したい場合はFfmpegOutputを使ってh264ファイルをmp4としてパッケージ化する必要があると回答されている

編集部見解:静止画のコードに慣れていると、動画も同じ感覚で「1行で撮れるはず」と思いがちである。しかし動画は「録り始め」と「録り終わり」、そして「どう圧縮するか」という3つの意思決定が必要になる点で、静止画とは根本的に扱い方が異なると理解しておくとつまずきにくい。
― YOFUKASI AI編集部

本記事では、picamera2で動画を録画するための基礎知識から、エンコーダーとビットレートの仕組み、そして実際にmp4形式で動画を保存するプログラムの作り方までを、初心者を対象に解説する。



Chapter 02 — Background

02動画録画プログラムの基礎知識

picamera2で動画を録画する最小構成のコードは、公式のサンプルとして次のように公開されている。

import time
from picamera2 import Picamera2
from picamera2.encoders import H264Encoder
from picamera2.outputs import FfmpegOutput

picam2 = Picamera2()
video_config = picam2.create_video_configuration()
picam2.configure(video_config)

encoder = H264Encoder(10000000)
output = FfmpegOutput('test.mp4')

picam2.start_recording(encoder, output)
time.sleep(10)
picam2.stop_recording()

このコードはmp4_capture.py(picamera2公式リポジトリ / GitHub)で公開されているサンプルとほぼ同じ構成である。H264Encoderで映像の圧縮方式を、FfmpegOutputでmp4への変換込みの出力先を指定し、start_recording()からstop_recording()までの間が録画される。

用語の整理

  • H264Encoder:映像をH.264という方式で圧縮するエンコーダー。カッコ内の数字はビットレート。
  • FfmpegOutput:ffmpegというソフトウェアを使って、映像データをmp4などの形式にまとめて出力するクラス。
  • ビットレート(bitrate):1秒あたりにどれだけのデータ量を使うかを表す数値。大きいほど高画質になりやすいが、ファイルサイズも大きくなる。

picamera2は、静止画だけでなく動画についても幅広い機能を備えている。PiCamera2 | Next-Gen Python Library for Raspberry Pi Camerasでは、複数のフォーマット・解像度での動画録画に対応しており、H.264エンコーディングやカスタマイズ可能なフレームレートをサポートしていると紹介されている

Chapter 03 — Mechanism

03エンコーダーとビットレートの仕組み

ビットレートの数値は、実際にどのくらい画質に影響するのだろうか。この点を実験で検証した記事がある。ラズパイにカメラモジュールにセットしてPythonで写真や動画を撮る(DevelopersIO)では、ビットレートを1000000(低)・5000000(中)・10000000(高)の3段階に変えながら動画を撮影する実験を行っている。同記事ではさらに踏み込んだ検証も行っており、start_recordingの”quality”という引数を指定する方式も試したが撮影した動画に違いが見られず、実装を調査した結果この引数が機能していないことが分かったと報告されている

実務での教訓
ドキュメントに書かれている引数(quality)が、必ずしも期待通りに動くとは限らない、という実例である。画質を確実にコントロールしたい場合は、quality引数よりも、この記事のようにH264Encoderのbitrate引数を直接指定する方法の方が、より確実な効果を得やすいと考えられる。

録画時の解像度やフレームレートも、create_video_configuration()の引数で細かく指定できる。3.1.2 ビデオモジュール(SunFounder Ulimate Raphael Kit ドキュメント)では、サイズやフレームレートなどを指定した動画設定を作り、controls引数でFrameRateを40に指定するといった構成でH264Encoderとbitrateを組み合わせるコード例が紹介されている。



Chapter 04 — Comparison

04保存形式・設定方法の比較

動画の保存方法には、いくつかの選択肢がある。目的に応じて整理する。

項目 A. .h264で直接保存 B. FfmpegOutputでmp4保存 C. ビットレートを可変にする
再生のしやすさ 専用プレイヤーが必要な場合がある 多くの一般的なプレイヤーで再生可能 Bと同様(設定次第)
実装の手軽さ 高い(出力先を文字列で指定するだけ) 中程度(FfmpegOutputのimportが必要) やや手間(用途ごとに調整が必要)
向いている用途 後で自分でmp4に変換する前提の録画 そのまま人に共有・再生したい動画 画質とファイルサイズを最適化したい場合

※各方式の特性は編集部見解を含む。動画設定の詳細なパラメータについてはpicamera2公式サンプル(mp4_capture.py)を参照。

人に共有したり、そのままダブルクリックで再生したい動画であれば、B案(FfmpegOutputでmp4保存)が扱いやすい。用途によって画質を細かく調整したい場合は、C案のようにビットレートを可変にする実装へ発展させるとよい。

Chapter 05 — Practice

05実践:mp4動画を録画するプログラムを作る5ステップ

ここでは「10秒間の動画をmp4形式で保存するプログラム」を作る手順を示す。

  1. STEP1. 必要なクラスをインポートする

    Picamera2本体に加えて、エンコーダーと出力用のクラスをインポートする。

    例:from picamera2 import Picamera2; from picamera2.encoders import H264Encoder; from picamera2.outputs import FfmpegOutputを記述した。
  2. STEP2. 動画用の設定でカメラを準備する

    create_video_configuration()で動画用の設定を作り、configure()で適用する。

    例:video_config = picam2.create_video_configuration(); picam2.configure(video_config)を記述した。
  3. STEP3. エンコーダーと出力先を用意する

    H264Encoderにビットレートを指定し、FfmpegOutputに保存したいファイル名を指定する。

    例:encoder = H264Encoder(10000000); output = FfmpegOutput("record.mp4")を記述した。
  4. STEP4. 録画を開始し、指定時間待ってから停止する

    start_recording(encoder, output)で録画を開始し、time.sleep()で待ってからstop_recording()を呼ぶ。

    例:picam2.start_recording(encoder, output); time.sleep(10); picam2.stop_recording()を記述した。
  5. STEP5. 保存されたファイルを確認する

    録画終了後、指定したファイル名のmp4ファイルが作成されているか確認する。再生できない場合は、FfmpegOutputを使わずファイルパスの文字列だけを渡していないか確認する。

    例:最初はoutputに文字列”record.mp4″だけを渡していたため、拡張子はmp4なのに一般的なプレイヤーで再生できなかった。FfmpegOutputでラップするよう修正すると正しく再生できるようになった(編集部想定シナリオ)。

ここで作ったプログラムに、ボタン入力やセンサーの値をきっかけに録画を開始する処理を組み合わせれば、監視カメラのような用途にも発展させられる。

Chapter 06 — Pitfalls

06注意点・よくある誤解

!誤解1. start_recording()はファイル名だけ渡せば動画を撮ってくれる

start_recording()には、エンコーダーと出力先の両方を指定する必要がある。ファイル名の文字列だけを渡そうとすると、必要な引数が不足しているというエラーになる。

!誤解2. 拡張子を.mp4にすれば中身も自動的にmp4になる

出力先にFfmpegOutputを使わず、ファイルパスの文字列だけを渡した場合、拡張子が.mp4であっても中身はh264形式のまま保存されてしまうことがある。一般的な動画プレイヤーで問題なく再生したい場合は、FfmpegOutputを使ってmp4コンテナに変換する必要がある。

!誤解3. quality引数を指定すれば画質を自由にコントロールできる

ライブラリのバージョンによっては、start_recording()のquality引数を指定しても、画質に違いが表れないという報告がある。画質を確実に調整したい場合は、quality引数に頼るよりも、H264Encoderのbitrate引数を直接指定する方が安定して効果を得やすい。



Chapter 07 — FAQ

07FAQ

Q.picamera2で動画を録画する最低限のコードはどう書けばよいですか。
A.Picamera2オブジェクトを作成し、H264Encoderでエンコーダーを、FfmpegOutputで出力先を指定したうえで、start_recording(encoder, output)を呼び出します。指定した秒数だけtime.sleep()で待ってからstop_recording()を呼ぶと、その間の映像が保存されます。

Q.start_recording()を呼んだら「output引数が足りない」というエラーが出ました。原因は何ですか。
A.start_recording()には、エンコーダーに加えて出力先(output)を指定する必要があります。出力先を省略すると、この引数が不足しているというエラーになります。H264形式でそのまま保存する場合はファイルパスの文字列を、mp4として保存したい場合はFfmpegOutputオブジェクトを渡してください。

Q.動画をmp4形式で保存するにはどうすればよいですか。
A.picamera2.outputsモジュールのFfmpegOutputクラスを使います。H264Encoderで生成した映像データを、FfmpegOutput(‘ファイル名.mp4’)に渡すことで、mp4形式のファイルとして保存できます。単にファイルパスの文字列だけを渡すと、拡張子がmp4であっても中身はh264形式のまま保存されてしまうことがあります。

Q.H264Encoderのbitrateはどのように決めればよいですか。
A.bitrateの数値を大きくするほど、一般的には画質が向上しますが、ファイルサイズも大きくなります。用途に応じて調整する必要があり、まずは10000000(10Mbps)程度から試して、画質とファイルサイズのバランスを見ながら増減させるのが実務的な進め方です。

Q.start_recording()のquality引数は使えますか。
A.ライブラリのバージョンによっては、quality引数を指定しても画質に違いが表れないという報告があります。確実に画質をコントロールしたい場合は、quality引数よりもH264Encoderのbitrate引数を直接指定する方が安定して効果が得られると考えられます(編集部見解)。

Q.動画撮影と静止画撮影を同じプログラムの中で両方行うことはできますか。
A.できます。ただし、静止画用の設定(create_still_configuration)と動画用の設定(create_video_configuration)は別物であるため、それぞれの用途に応じて設定を切り替える必要があります。プレビューを表示しながら、キー操作などをきっかけに静止画・動画それぞれの処理を呼び分ける設計にするのが一般的です。

参考文献

関連記事(内部リンク)

該当なし(本記事はRaspberry Pi・picamera2がテーマであり、内部リンクプールはArduino関連記事のみで構成されているため、無理な挿入は行っていません。)


関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP
CLOSE