raspberrypiとffmpegと私

前の記事ではタイトルに「ラズパイを置いた」、タグに ffmpeg の文字があるにもかかわらず、なななんと全くそれらに触れていなかった。
我ながら驚愕である。

SwitchBot温湿度計の話は、「こうやって簡単に温度や湿度が取れるよ」とさらっと書くつもりだったのだが
思いのほか苦戦した結果、本来書きたかったラズパイとffmpegの話を綺麗に忘れてしまったらしい。

改めて。今日書くのはラズパイにUSB Webカメラを接続し、ffmpegを使ってYoutubeにライブ配信するまでの話である。
他の誰かの役に立つようにと言うよりはいずれ全て忘れるであろう自分のための記事なのでうっかり読んだ人はその点ご理解いただきたい。

ちょうど最近立て続けに台風が来て、その度に実家が壊れないか監視をするのにこの仕組みを使った。

… と言う内容でもともと 9月半ばにこの記事を書くつもりだったがすっかり忘れていた。

新鮮味も記憶も失せてしまったので history からコマンドを引っ張り出し、頑張って思い出しながら自分の記憶をここにセーブしたい。

1
2
3
4
5
6
7
8
while :;do
timeout 898s ffmpeg -thread_queue_size 65535 \
-f alsa -ac 1 -i hw:1,0 -framerate 5 \
-f v4l2 -thread_queue_size 65535 -pix_fmt uyvy422 -i /dev/video0 -vcodec libx264 -preset ultrafast -tune zerolatency \
-vf drawtext="fontfile=HackGen_NF_v2.7.1/HackGen35ConsoleNFJ-Regular.ttf:x=8:y=8:fontsize=24:fontcolor=white:box=1:boxcolor=black@0.2:textfile='temp.txt':reload=1" \
-vsync 1 -f flv rtmp://a.rtmp.youtube.com/live2/${rtmp_secret_path} || break
sleep 1
done

history に残っていた最新の ffmpeg コマンド。

前提として version は ffmpeg version 4.1.6-1~deb10u1+rpt1

解説

1
2
3
4
while :;do
timeout 898s ffmpeg (...) || break
sleep 1
done

当時、ffmpegを使ってYoutubeのLIVE配信を行っていると開始から10分から15分程度経過した時点で映像の遅延が大きくなっていた。
そこで900s(15分)の少し前にffmpegを終了させ、1秒sleepした後再びffmpegを実行させる、というのを無限ループさせるためこのように書いた。

YoutubeのLIVE配信では、短時間のストリームの途切れは許容される(終了扱いにならない)ので 15分ごとに2秒程度止めて1日中屋根を監視することを行っていた。

1
2
-f alsa -ac 1 -i hw:1,0 -framerate 5 \
-f v4l2 -thread_queue_size 65535 -pix_fmt uyvy422 -i /dev/video0 -vcodec libx264 -preset ultrafast -tune zerolatency \

この辺りはぐぐるといろんな人のまともな解説が出てくる。
arecord -l でオーディオデバイスの一覧を確認して音源にどのデバイスを使うか指定する、とか
v4l2-ctl --list-devices でカメラの一覧を確認するとか。

-thread_queue_size については -f format 毎に必要だった気がする。
ヘルプには set the maximum number of queued packets from the demuxer と書かれており
スレッドがデータのバッファに使うパケットの最大数ということか。

1
-vf drawtext="fontfile=HackGen_NF_v2.7.1/HackGen35ConsoleNFJ-Regular.ttf:x=8:y=8:fontsize=24:fontcolor=white:box=1:boxcolor=black@0.2:textfile='temp.txt':reload=1"

長い。
映像に文字を重ねる設定である。
fontfile で ttfファイル名を、x,y で描画開始位置を指定。
fontsize fontcolor もそのまま。サイズと色。

box、boxcolor 文字の背景の指定。文字の幅・高さに合わせて四角く背景が出来るのでboxってことなのかな。
textfile このファイルに書かれている内容を出力してくれる。

reload=1 1秒毎に更新。

もう少しいろいろあったはずなのだけれど、思い出せないのでひとまずここまで。
思い出したらまた書きます。