Raspberry Pi + webcam + ffmpeg + 無限 G Drive => 監視カメラ
やりたいこと
ウェブカメラ買ってみたので、監視カメラのように日付を画面に付与しながら録画し、G Drive に上げ続けてみたい気持ちがある(無限ドライブを埋めたいという気持ちがデカくて、外の風景とか適当に撮ろうかなと) -- @public_yusuke
ffmpeg のコマンド
code:sh
ffmpeg -use_wallclock_as_timestamps 1 -loglevel error -thread_queue_size 4096 -itsoffset -0.45 -f v4l2 -rtbufsize 300M -video_size 1920x1080 -input_format h264 -i /dev/video0 -f alsa -ac 1 -i hw:1,0 -c:v copy -c:a libmp3lame -flags +global_header -b:v 2000k -r 30 -f tee -map 0:v -map 1:a -s 1920x1080 -async 1 "f=flv:onfail=ignorertmp://a.rtmp.youtube.com/live2/<key>|f=segment:segment_time=14400:reset_timestamps=1:strftime=1/mnt/hdd/%Y-%m-%d/cameratest-%Y-%m-%d-%H-%M-%S.mp4" audio と video でズレが発生するので、それを -itsoffset -0.45 で video 側を 0.45 秒だけ先に進めることで修正をかけている
これで日付が画面左上に黄色で付与されるようになり、14400秒(4時間)ごとに分割されながら録画されるようになる。
再エンコが必要になるのでやめた
詳細な時間が知りたい場合は、画角の中にあるタイミングで時計を映して、それと動画のタイムスタンプを参考にして特定すれば多分ok
cameratest-%Y-%m-%d-%H-%M-%S.mp4の例: cameratest-2020-09-04-12-05-15.mp4
保存先は日付が付いたフォルダの中になっているが、ffmpeg はディレクトリが存在しないときに自動的に作ったりはしてくれないようなので、cron とかで自動で作成するようにする必要がある。
そうすれば、このコマンドの実行のみを延々とするだけで監視カメラの録画は完成する。
crontab
毎日、最後に日を跨いだ録画ファイルもしっかり rclone move できるようなタイミングで実行すれば、転送が終了した後自動的にそのディレクトリが削除される。(--delete-empty-src-dirs オプションのおかげで)
↑消えないが何?
code:crontab
0 0 * * * mkdir "/mnt/hdd/$(date +\%Y-\%m-\%d)"
0 6 * * * rclone --delete-empty-src-dirs --fast-list --drive-chunk-size 512M move "/mnt/hdd/$(date +\%Y-\%m-\%d --date '1 day ago')" "al:videos/camera/$(date +\%Y-\%m-\%d --date '1 day ago')"
crontab の中の % は \% のようにエスケープする必要がある
リアルタイムで確認できるように YouTube Live で配信する
2秒ぐらいの遅延で確認可能
現状の問題点
音声と動画で若干のズレが生じる
YouTube Live への送信が止まるときがある(ビットレートが低すぎる?)
夜の暗い部屋とかだとこれが起きやすくて、外の風景では大丈夫っぽい?
Broken Pipe とほざくときがある。何?
YouTube Live での視聴者がある程度の時間存在しないと勝手に打ち切られたりする可能性がありそう
Raspberry Pi のセットアップ
code:sh
$ passwd
# pi ユーザーのパスワードは必ず変更しましょう!
$ sudo apt install ffmpeg mailutils postfix git-core samba rclone
$ sudo adduser yusuke
$ sudo gpasswd -a yusuke sudo
$ sudo gpasswd -a yusuke audio
$ sudo gpasswd -a yusuke video
# ↑ これをすることによって ffmpeg で自分のユーザーでも /dev/video0 などに触れるようになる
$ sudo blkid /dev/sda1
$ sudo nano /etc/fstab
# ↑ここで fstab の設定をして、起動時に自動的に外付け HDD をマウントさせるようにする
$ rclone config
# ↑ここで rclone の設定をして、Google Drive にアップロードできるようにする
$ crontab -e
# ↑ここで crontab の設定をして、自動的に録画ファイルをアップロードさせるようにする