Raspberry Pi Zero WH + 互換品カメラでストリーミング

Raspberry Pi Zeroに互換品のカメラを乗っけてストリーミングする話。使ったカメラはこれ

はじめに

Raspberry piはh264のハードウェアエンコードに対応しているため非力なcpuに頼らずh264の動画をエンコードすることができる。で、このピンで挿す系のカメラ(語彙…)を使った場合、v4l2経由でアクセスする際にh264でデータを吐くことを要求すると、あたかもカメラモジュール自体がハード的に対応しているかのように自動でハードエンコをかけて動画を取り出してくれる。それをそのまま吐き出せばCPUに全く頼らずエンコードできているので、Pi zeroでも問題なく動画配信できるよという話。

やりかた

本当はvlc単体でできるはずなんだけど、なぜかできなかったのでffmpeg + vlcで。

ffmpeg -hide_banner -loglevel panic -input_format h264 -video_size 1280x720 -framerate 30 -i /dev/video0 -vcodec copy -an -f vob - | cvlc stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}'

これで、rtsp://IPアドレス:8554/からアクセスができるようになった。ただし、デフォルトのbitrateは高すぎてデータの転送とかでCPU使用率が100%に張り付いてしまう。そこでbitrateを下げてやるとよい。5Mbpsくらいまでなら問題なさそうだったけど、まあ1Mとか2Mで十分でしょう。ffmpeg経由ではできないらしいので、

sudo v4l2-ctl --set-ctrl video_bitrate=2000000

とかする。

応用

cvlcに通さずyoutubeにあげたりとかも原理的にはできるはず。留守のときに日中配信させてみようと思いつべのアカウントでライブ配信を申請してみた。通ったらsystemd化のメモも書こう。

つべの配信設定

ようつべでもほとんど同じで配信できるんだけど、オーディオストリームをつけないとハネられる。そこで、

ffmpeg -hide_banner -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -input_format h264 -video_size 1280x720 -framerate 30 -i /dev/video0 -vcodec copy -acodec aac -ab 16k -strict experimental -f flv rtmp://a.rtmp.youtube.com/live2/$YOUTUBE_KEY

とかしてあげるとよい。

その他

なお、解像度を1080pにしたいならGPUに割り当てるメモリを増やさないとハードエンコーダがエラーを吐く。具体的には/boot/config.txtの最後のセクションが

[all]
#dtoverlay=vc4-fkms-v3d
start_x=1
gpu_mem=192

となるように、割当を例えば192MBにしてやればよい。なお、互換モジュールを使ったからか解像度をあげると画角が狭くなるという謎の挙動が発生したため、720pでがまんしている。

Comments

comments powered by Disqus