今回も前回に続いてRaspberry PIのカメラコマンドを使ってみます。これまでは静止画でしたが、今回は映像を撮影します。映像なので保存先の容量が少ないメディアの場合は注意が必要です。容量が不足するような場合は外付けのHDD/SSDなどを接続して、そこに保存した方がよいでしょう。

前回と同様に撮影したデータはRaspberry PIのホームディレクトリにあるPicturesディレクトリに保存します。カレントディレクトリはこのPicturesディレクトリとします。コマンドならcd ~/Picturesです。映像ならMoviesディレクトリを作成した方がいいような気もしますが、とりあえずこれまでと同じPicturesディレクトリに保存します。

映像の撮影

 映像を撮影するコマンドはrpicam-vidです。-oの後に保存する映像ファイル名を指定します。H.264形式で5秒間の映像が保存されます。なお、自動的に停止しない場合はControlキーを押したままCキーを押して停止させてください。

rpicam-vid -o 1.h264

 撮影された映像は、そのままでは再生できません。そこでffmpegコマンドを使ってMPEG4形式に変換します。Raspberry PI 5で以下のコマンドを入力します。(Full Installの場合、最初からffmpegは入っています)

ffmpeg -r 30 -i 1.h264 -c:v copy -fps_mode passthrough -movflags +faststart 1.mp4

変換はすぐに終わります。変換した映像はQuickTime PlaeryやVLC Playerで再生できます。

回転指定

 先ほどの映像は上下が180度回転していました。上下が逆になっているのは困るので調整します。180度回転させるには静止画の撮影の時と同じrotationオプションを使います。このオプションで180を指定すると上下180度回転します。90なら90度回転することになります。
 以下のようにコマンドを入力すると上下180度回転した映像が5秒間撮影されます。

rpicam-vid -o 2.h264 --rotation 180

MPEG4に変換する場合は以下のようにします。

ffmpeg -r 30 -i 2.h264 -c:v copy -fps_mode passthrough -movflags +faststart 2.mp4

なお、出力するメッセージを消去する場合は、前回までと同様以下のように指定します。

rpicam-vid -o 2.h264 --rotation 180 > /dev/null 2>&1

時間指定

 何も指定しない場合、デフォルトの撮影時間は5秒になっています。撮影時間を指定するにはtオプションを使います。以下のように指定すると10秒間撮影されます。

rpicam-vid -o 3.h264 --rotation 180 -t 10s > /dev/null 2>&1
ffmpeg -r 30 -i 3.h264 -c:v copy -fps_mode passthrough -movflags +faststart 3.mp4 > /dev/null 2>&1

時間を指定せずに録画するにはtオプションで0を指定します。この場合、Controlキーを押したままCキーを押して撮影を停止させるかKILLコマンドで停止します

rpicam-vid -o 4.h264 --rotation 180 -t 0 > /dev/null 2>&1
ffmpeg -r 30 -i 4.h264 -c:v copy -fps_mode passthrough -movflags +faststart 4.mp4 > /dev/null 2>&1

ビットレート指定

 映像データのファイルサイズは大きくなることがあります。特に高画質、長時間録画するとファイルサイズは大きくなります。しかし、ストレージ(SDカード、HDD/SSD)には容量の限界があります。この場合、画質を下げるか撮影時間を短くするか、何かを取捨選択しなければなりません。
 画質を下げることでファイルサイズは減らすことができます。これは画質を決めるビットレートを指定します。ビットレートの指定はbオプションを使います。このbオプションの後にビットレートとなる数値を指定します。1000なら1Kのビットレート、20000なら20Kのビットレート、1000000なら1Mのビットレートになります。
 以下の例では20Kのビットレートになります。

rpicam-vid -o 5.h264 --rotation 180 -b 20000 > /dev/null 2>&1
ffmpeg -r 30 -i 5.h264 -c:v copy -fps_mode passthrough -movflags +faststart 5.mp4 > /dev/null 2>&1

タイムラプス(インターバル)撮影

 前回rpicam-stillコマンドでタイムラプス(インターバル)撮影する方法を説明しました。撮影された静止画を映像にするような場合はrpicam-stillコマンドよりもrpicam-vidコマンドを使った方が手軽です。ただし、フレームレートなど若干制限があるため撮影内容によっては使い分けが必要です。
 rpicam-vidコマンドでタイムラプス(インターバル)撮影を行うにはframerateオプションを指定します。これはフレームレートで1秒あたり何フレーム撮影するかを数値で指定します。1なら1秒間に1回撮影します。2なら2回になります。以下の例では1秒間に1回撮影し、それを15秒間行います。

rpicam-vid -o 6.h264 --rotation 180 --framerate 1 -t 15s > /dev/null 2>&1
ffmpeg -r 30 -i 6.h264 -c:v copy -fps_mode passthrough -movflags +faststart 6.mp4 > /dev/null 2>&1

framerateオプションの値を大きくすると高速度撮影(ハイスピード撮影、スローモーション)もできます。以下のようにすると1秒間に120フレーム撮影されます。

rpicam-vid -o 7.h264 --rotation 180 --framerate 120 -t 2s > /dev/null 2>&1
ffmpeg -r 30 -i 7.h264 -c:v copy -fps_mode passthrough -movflags +faststart 7.mp4 > /dev/null 2>&1

映像に文字を入れる

 次に映像に文字を追加してみます。テキストの追加はrpicam-vidのpost-process-fileオプションを使います。ただ、融通がききにくいので後述するffmpegを使った方がいいかもしれません。
 post-process-fileオプションを使う場合は最初に表示するための文字情報を記述したJSONファイルを用意しておく必要があります。ここでは以下のようなJSONファイルをtext.jsonとして作成しました。これで映像の左上にRasPi Cam-01の文字が表示されるようになります。

・text.json
{
    "annotate_cv" :
    {
    "text" : "RasPi Cam-01",
    "fg" : 255,
    "bg" : 0,
    "scale" : 1.0,
    "thickness" : 2,
    "alpha" : 1.0
    }
}

text部分が表示する文字列になります。fgが文字色、bgが背景色、scaleは文字サイズ、thicknessは文字の太さで大きくすると太くなります。alphaは不透明度で1.0が完全な不透明、0.0が透明になります。

 次に以下のようにコマンドを入力します。撮影された映像を確認すると左上に文字が表示されているのが分かります。

rpicam-vid -o 8.h264 --rotation 180 --post-process-file text.json -t 2s > /dev/null 2>&1
ffmpeg -r 30 -i 8.h264 -c:v copy -fps_mode passthrough -movflags +faststart 8.mp4 > /dev/null 2>&1

ffmpegを使って文字を入れる場合はrpicam-vidで撮影した後で行います。ここでは一旦MPEG4に変換したファイルに文字を追加してみます。コマンドは以下のようになります。オプションで指定している意味は以下のようになります。

drawtext 表示する文字列
x 表示するX座標
y 表示するY座標
fontsize 文字サイズ
fontfile フォントファイルのパス
fontcolor 文字色
rpicam-vid -o 9.h264 --rotation 180 -t 2s > /dev/null 2>&1
ffmpeg -r 30 -i 9.h264 -c:v copy -fps_mode passthrough -movflags +faststart 9.mp4 > /dev/null 2>&1
ffmpeg -i 9.mp4 -vf "drawtext=text='RasPi Cam-01':x=w-text_w-10:y=h-text_h-10:fontsize=24:fontcolor=red:fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" -c:v libx264 -crf 18 -preset slow 9t.mp4 > /dev/null 2>&1

文字を追加すると以下のような結果になります。

文字は映像によっては読みにくい(視認しにくい)場合があります。そのような場合は文字に縁取りをつける方法があります。文字に縁取りをつけるには以下のオプションを追加します。

borderw 縁取りの幅
bordercolor 縁取りの色

以下のように指定すると赤文字に白い縁取りになります。

ffmpeg -i 9.mp4 -vf "drawtext=text='RasPi Cam-01':x=w-text_w-10:y=h-text_h-10:fontsize=24:fontcolor=red:fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf:borderw=2:bordercolor=white" -c:v libx264 -crf 18 -preset slow 9t2.mp4 > /dev/null 2>&1

長くなったので今回は、ここまでです。 それでは、また次回。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。