Raspberry Piの動画撮影・録画方法――picamera2で映像をエンコードして残す。
静止画のcapture_file()をそのまま動画に応用しようとして、エラーで止まっていませんか。H264Encoderとoutputの指定から、mp4形式で保存する手順までを解説します。
目次
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形式で動画を保存するプログラムの作り方までを、初心者を対象に解説する。
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エンコーディングやカスタマイズ可能なフレームレートをサポートしていると紹介されている。
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を組み合わせるコード例が紹介されている。
04保存形式・設定方法の比較
動画の保存方法には、いくつかの選択肢がある。目的に応じて整理する。
| 項目 | A. .h264で直接保存 | B. FfmpegOutputでmp4保存 | C. ビットレートを可変にする |
|---|---|---|---|
| 再生のしやすさ | 専用プレイヤーが必要な場合がある | 多くの一般的なプレイヤーで再生可能 | Bと同様(設定次第) |
| 実装の手軽さ | 高い(出力先を文字列で指定するだけ) | 中程度(FfmpegOutputのimportが必要) | やや手間(用途ごとに調整が必要) |
| 向いている用途 | 後で自分でmp4に変換する前提の録画 | そのまま人に共有・再生したい動画 | 画質とファイルサイズを最適化したい場合 |
※各方式の特性は編集部見解を含む。動画設定の詳細なパラメータについてはpicamera2公式サンプル(mp4_capture.py)を参照。
人に共有したり、そのままダブルクリックで再生したい動画であれば、B案(FfmpegOutputでmp4保存)が扱いやすい。用途によって画質を細かく調整したい場合は、C案のようにビットレートを可変にする実装へ発展させるとよい。
05実践:mp4動画を録画するプログラムを作る5ステップ
ここでは「10秒間の動画をmp4形式で保存するプログラム」を作る手順を示す。
-
STEP1. 必要なクラスをインポートする
Picamera2本体に加えて、エンコーダーと出力用のクラスをインポートする。
例:from picamera2 import Picamera2; from picamera2.encoders import H264Encoder; from picamera2.outputs import FfmpegOutputを記述した。 -
STEP2. 動画用の設定でカメラを準備する
create_video_configuration()で動画用の設定を作り、configure()で適用する。例:video_config = picam2.create_video_configuration(); picam2.configure(video_config)を記述した。 -
STEP3. エンコーダーと出力先を用意する
H264Encoderにビットレートを指定し、FfmpegOutputに保存したいファイル名を指定する。
例:encoder = H264Encoder(10000000); output = FfmpegOutput("record.mp4")を記述した。 -
STEP4. 録画を開始し、指定時間待ってから停止する
start_recording(encoder, output)で録画を開始し、time.sleep()で待ってからstop_recording()を呼ぶ。例:picam2.start_recording(encoder, output); time.sleep(10); picam2.stop_recording()を記述した。 -
STEP5. 保存されたファイルを確認する
録画終了後、指定したファイル名のmp4ファイルが作成されているか確認する。再生できない場合は、FfmpegOutputを使わずファイルパスの文字列だけを渡していないか確認する。
例:最初はoutputに文字列”record.mp4″だけを渡していたため、拡張子はmp4なのに一般的なプレイヤーで再生できなかった。FfmpegOutputでラップするよう修正すると正しく再生できるようになった(編集部想定シナリオ)。
ここで作ったプログラムに、ボタン入力やセンサーの値をきっかけに録画を開始する処理を組み合わせれば、監視カメラのような用途にも発展させられる。
06注意点・よくある誤解
start_recording()には、エンコーダーと出力先の両方を指定する必要がある。ファイル名の文字列だけを渡そうとすると、必要な引数が不足しているというエラーになる。
出力先にFfmpegOutputを使わず、ファイルパスの文字列だけを渡した場合、拡張子が.mp4であっても中身はh264形式のまま保存されてしまうことがある。一般的な動画プレイヤーで問題なく再生したい場合は、FfmpegOutputを使ってmp4コンテナに変換する必要がある。
ライブラリのバージョンによっては、start_recording()のquality引数を指定しても、画質に違いが表れないという報告がある。画質を確実に調整したい場合は、quality引数に頼るよりも、H264Encoderのbitrate引数を直接指定する方が安定して効果を得やすい。
07FAQ
参考文献
- raspberrypi/picamera2「mp4_capture.py」picamera2公式リポジトリ, GitHub. https://github.com/raspberrypi/picamera2/blob/main/examples/mp4_capture.py
- Raspberry Pi Forumsユーザー「Problem Using start_recording with Picamera2 on Raspberry Pi」Raspberry Pi Forums, 2024年. https://forums.raspberrypi.com/viewtopic.php?t=368757
- DevelopersIO「ラズパイにカメラモジュールにセットしてPythonで写真や動画を撮る」Classmethod, 2023年. https://dev.classmethod.jp/articles/raspberrypi-camera-freenove/
- SunFounder「3.1.2 ビデオモジュール」SunFounder Ulimate Raphael Kitドキュメント. https://docs.sunfounder.com/projects/raphael-kit/ja/latest/python_pi5/pi5_3.1.2_video_module_python.html
- PiCamera2.com「PiCamera2 | Next-Gen Python Library for Raspberry Pi Cameras」picamera2.com, 2026年. https://picamera2.com/
- 本文中の具体的な原因特定エピソードは、断りのない限り編集部想定シナリオに基づく想定であり、実測データではありません。
関連記事(内部リンク)
該当なし(本記事はRaspberry Pi・picamera2がテーマであり、内部リンクプールはArduino関連記事のみで構成されているため、無理な挿入は行っていません。)
コメント