動画を撮影、保存する
まずは、ワークショップで行った方法で、カメラが正常にラズパイに接続されていることを確認してください。
動画を撮影する
ラズパイのカメラで動画を撮るには、Terminalで以下コマンドを実行します。
libcamera-vid -n -o Videos/video.h264
「-o」を使って、動画を出力(output)、保存する先のファイル名を指定します。ここでは、「Videos」というサブ・ディレクトリ(サブ・フォルダ)の中の「video.h264」というファイルとして保存しています。デフォルトで、動画の長さは5秒、解像度は1920x1080、フレームレートは30 fpsになります。「-n」の説明は省略しますが、必ず付けておく必要のあるオプションだと理解して下さい。
動画の長さを調節するには、以下のように「-t」を追加します。
libcamera-vid -n -t 3000 -o video.h264
時間の単位はミリ秒です。「-t 3000」は、動画を3秒(3,000ミリ秒)撮るための指定です。動画の保存先は「video.h264」というファイルで、これは「現在のディレクトリ」に置かれます。
撮影する動画の品質を調節する
撮影する動画の品質を調節するには、解像度とフレームレートを変更します。動画の解像度を調節するには、以下のように「–width」と「–height」を使います。
libcamera-vid -n -t 3000 --width 640 --height 480 -o video.h264
「–width」が横幅、「–height」が縦幅のサイズの指定です。ここでは640x480の解像度を設定しています。他にも、800x600や1280x720など、基本的に自由に解像度を指定可能です。最大の解像度は1920x1080です。動画の仕組みはパラパラ漫画(写真)と同じです。パラパラめくる写真のそれぞれがどのくらい高精細かを表すのが解像度です。この数値が高いと精細度が高くなります。
ただし、高精細な美しい動画を撮ることが目的ではなく、何かの記録を動画として残すことが目的なら(つまりIoT機器らしい目的では)、640x480か800x600程度が妥当だと思います。解像度を大きくすると、データ(ファイル)のサイズが巨大化するので、何枚も動画を撮る場合や、動画をインターネット上で共有する場合(Kintoneなどを使う場合)は、小さな解像度がおすすめです。小さく始めて、小さすぎると実感したら、大きいものへ移行するのがよいと思います。
撮影する動画のフレームレートを調節するには、以下のように「–framerate」を追加します。
libcamera-vid -n -t 3000 --width 640 --height 480 --framerate 20 -o video.h264
ここではフレームレートを20 fps(frames per second)に設定しています。動画の仕組みはパラパラ漫画(写真)と同じです。フレームレートは、1秒間に何枚の写真を連続的に表示するかを示すものです。この数値が高いと滑らかな動画、低いとカクカクした動画になります。テレビはだいたい30 fps、映画は24 fpsです。上記コマンドで、フレームレートを指定しないと(–framerateの設定を省略すると)30 fpsが使われます。
美しく流れるような動画を撮ることが目的ではなく、何かの記録を動画として残すことが目的なら(つまりIoT機器らしい目的では)、25 fpsか20 fpsで十分です。フレームレートを高くすると、データ(ファイル)のサイズが巨大化するので、何度も動画を撮る場合や、動画をインターネット上で共有する場合(Kintoneなどを使う場合)は、低いフレームレートがおすすめです。低いもので始めて、動画がカクカクしすぎると実感したら、高いものへ移行するのがよいと思います。ちなみに私は、自分用のアプリでは15 fpsをよく使います。さらに余談ですが、防犯カメラのフレームレートは大抵5 fpsです。防犯カメラの動画がスローモーションのように(コマ送りのように)見えるのはフレームレートが低いからです。
H.264とは
ラズパイで動画を撮ると、H.264(エイチ・にいろくよん)というデータ形式で記録されます。ファイルに保存するときには、.h264という拡張子がよく使われます。H.264は、小さいデータ(ファイル)サイズで高画質の動画を記録するための技術(動画データの圧縮技術規格)です。ラズパイに限らず、あちこちで非常によく使われています。H.264は、音声を含まない純粋な動画だけを対象にしています。
MP4とは
H.264は動画のデータ形式として定番ですが、.h264ファイルだけを「単品」で使うことはほとんどありません(.h264ファイルを配布・共有することはほとんどない)。通常は、.h264ファイル(動画データ)と音声データ(MP3やAACなど)を組み合わせて、音声付きの動画にします。
このように動画と音声のデータを組み合わせる仕掛けが「コンテナ・ファイル」と呼ばれるものです。これは、内部に動画と音声のデータを格納したファイルのことで、音声付きの動画を利用(配布・共有)するのによく使われます。H.264の動画データを格納できるコンテナ・ファイル形式として定番なのが、MP4(エム・ピー・フォー)です。.mp4という拡張子がよく使われます。ちなみにMP4には、動画と音声以外に、字幕(テキスト)や静止画なども格納可能です。
H.264ファイルの再生
上記のように、.h264ファイルだけを「単品」で使う用途が(一般的には)ほとんどないので、これを直接再生できるアプリも数は多くありません。QuickTime Playerなどの有名な動画再生アプリでは、.h264ファイルの再生はできません。ラズパイで撮った動画を.h264ファイルとして再生するには、VLC Media Playerを使うのがよいと思います。VLCはラズパイに最初からインストールされており、ラズパイのファイルマネージャで.h264ファイルをダブルクリックすると、VLCがデフォルトで使われます。VLCにはWindows版、Mac版、iOS版、Android版もあります。
H.264を使ったMP4ファイルの生成
.h264ファイルは、VLCを使えば再生できますが、使い勝手のよいファイル形式ではありません。ラズパイでないマシンで動画再生する場合や、Kintoneにアップロードして携帯端末で再生する場合、他人と動画を共有する場合には、MP4にしておいた方が何かと便利です(仮に音声のない動画であっても)。
ラズパイ上で.h264ファイルを.mp4ファイルに変換するには、ffmpegというツールを使うのが便利です(ラズパイに最初からインストールされています)。Terminalで以下のコマンドを実行してください。
ffmpeg -r 20 -i video.h264 video.mp4
ここで、「-i video.h264」は、変換前の(入力:input)ファイルがvideo.h264であることを意味し、最後のvideo.mp4が変換後の.mp4ファイル名です。「-r 20」の部分は、変換前の動画(H264動画)のフレームレートが20 fpsであることを意味しており、変換後の動画(MP4データ)も同じフレームレートを使うよう指示しています。ラスパイで動画撮影したときに選んだフレームレートと同じ数字を使ってください。この数字を正しく設定しないと、変換後の動画は正しく再生されません。早送りのように再生されたり、スローモーションのように再生されることがあります。
また、以下のように「-y」というオプションをつけると、変換後のファイルがすでに存在する場合に上書き保存を許可できます。
ffmpeg -y -r 20 -i video.h264 video.mp4
また、コマンドがデータ変換中に出力する各種メッセージを最低限のものに限るには、以下のように「-v quiet」を追加します。
ffmpeg -v quiet -y -r 20 -i video.h264 video.mp4
.h264ファイルを.mpファイルに変換したら、.h264ファイルはたいてい必要なくなります。Terminalからコマンドでファイルを削除したい場合には、以下のようにします。
rm video.h264
「rm」は、removeの略です。
もし、既存の動画のフレームレートが分からない(忘れた)場合には、以下のようにして調べることができます。
ffmpeg -i video.h264
ffmpeg -i video.mp4
コマンドを実行した後に出力されるメッセージの最後の部分に、例えば
640x480, 20 fps
というような記述が見つかります。これは、フレームレートが20 fpsであること、そして解像度が640x480であることを示しています。
プログラムを使って動画を撮影、保存する
動画を撮ってH264からMP4への変換を行うPythonプログラムが、video.pyです。先に紹介したコマンドをそれぞれsubprocess.run()に渡して実行しています。subprocess.run()はワークショップ2日目でも使ったので、配布資料とサンプルプログラムを参照してください。
video.pyでは、文字列が長くなりすぎる行をバックスラッシュ(\
)を使って改行して複数行に分けています。例えば以下の部分です。
command1 = "libcamera-vid -n -t 3000 --width 640 --height 480 --framerate 20 -o "\
+ videoFile
Pythonで、バックスラッシュ(\
)は「継続文字」で、行末におくとその後の改行が無視されて行が継続しているとみなされます。つまり、上記プログラムは以下と同じものだと解釈されます。
command1 = "libcamera-vid -n -t 3000 --width 640 --height 480 --framerate 20 -o " + videoFile
また、以下のように、長い一行を複数回改行しても問題ありません。
command2 = "ffmpeg -y -r 20 -i "\
+ videoFile + " "\
+ mp4File
[自習プロジェクトの目次に戻る](../../