結論
とりあえず最終版のシェルスクリプト。
※ご存知かとは思いますが、念のため。パスの通った場所へ。
私は~/usr/binにぶち込んであります。
#! /bin/bash
CACHE_DIR=/tmp/hls_cache
if [ ! -e $CACHE_DIR ];
then
mkdir $CACHE_DIR
fi
ffmpeg -f alsa -thread_queue_size 16384 -i hw:1,0 \
-f v4l2 -thread_queue_size 16384 -s 640x480 -r 30 -vsync 2 -i /dev/video0 \
-c:v h264_omx -b:v 1000k -bufsize 1000k -g 60 \
-c:a aac \
-flags +cgop+global_header \
-f hls \
-hls_wrap 10 \
-hls_time 2 \
-hls_list_size 3 \
-hls_allow_cache 0 \
-hls_segment_filename $CACHE_DIR/stream_%06d.ts \
-hls_base_url stream/ \
$CACHE_DIR/playlist.m3u8
動機
会社から自宅が遠いこともあり昨今のリモートワークブーム(?)の影響で極力自宅で仕事がしたいという思いが日に日に増してきている今日この頃です。ただ、担当が下回りFWの開発で実機を触らないと開発が進まないということもあり、リモートでタッチパネルを操作できるロボット(中華プロッタ)を購入して日曜プログラミングで絶賛構築中です。
しかしロボットで操作したはいいけど実機がロボットによってどんな状態になってるか分からん!と思うと不安で寝れなくなることはを見るより明らかです。
はい、ということで前置きが長くなりましたが、要はストリーミングを行うということです
構成
- RaspberryPi3 or 4
- カメラ:ロジクールC920
$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
/dev/video10
/dev/video11
/dev/video12
HD Pro Webcam C920 (usb-0000:01:00.0-1.2):
/dev/video0
/dev/video1
$
$ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: C920 [HD Pro Webcam C920], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
参考記事
ほぼ丸パクリです。。。@fujino-fpuさんありがとうございます
参考記事へのリンク
少し改造させていただきました
tsファイルの保存先の変更
よほどRAMにキャッシュされると思うので大丈夫かとは思いますが、保存先をRAMディスクへ。
将来的にはWebサーバーのキャッシュディレクトリに移動させます(もちろんその場合もRAMディスクへ)が、とりあえず/tmpへ
オーディオ系のエラー対策
[alsa @ 0x1b8d3f0] cannot set channel count to 1 (Invalid argument)
と怒られた。ffmpegのドキュメントにはオーディオのチャンネルを指定せいと書いてあり、問題なさそうですが…
よーわからんけどオプションごと無かった事としてこそっと削除したら動作したので良しとします。
生成されるtsファイルに制限を設ける
無尽蔵にtsファイルが生成されるので「-hls_wrap」オプションを付与。
ここでは10を指定して10ファイルごとにリングされるようにしています。
ご自身の環境に合わせて調整してください。