[Amazon Kinesis Video Streams] Docker+RasPi+USB接続Webカメラでの配信
1 はじめに
こんにちは、AIソリューション部の平内(SIN)です。
前回、RaspberryPiでDockerイメージのプロデューサーライブラリを使用した動画配信を試してました。
この時、当初目論んでした、USB接続のWebカメラの使用に失敗してしまったので、今回、再挑戦してみました。
結果的には、1280×960 7FPSまでは、うまく動作できました。動画は、そのようすです。
今回、いろいろ切り分けるために、Dockerを使用しないで、RaspberryPi上でのコンパイルも実施しましたが、やっぱり4時間以上はかかって、Dockerでなんとかしたいと強く思いました。
2 スペック
今回、うまく動作した諸元等を列挙しておきます。
(1) 3 Model B+
$ cat /proc/cpuinfo | grep Revision Revision : a020d3
(2) Raspbianイメージ
昨年11月の最新版(Raspbian GNU/Linux 9 (stretch)) 2018-11-13-raspbian-stretch.img を使用しました。
Linux OSのディストリとバージョン
$ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 9.8 (stretch) Release: 9.8 Codename: stretch
カーネル
$ uname -a Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux
(3) Webカメラ
BUFFALOの320万画素Webカメラ( BSW32KM01HBK)です。
http://buffalo.jp/product/multimedia/web-camera/bsw32km01h/
3 Dockerセットアップ
前回作業した手順に変化はありません。
[Amazon Kinesis Video Streams] Dockerイメージのプロデューサーライブラリで動画配信(Raspberry Pi編)
4 解像度
下記のように、特に指定せず、kinesis_video_gstreamer_sample_appを使用すると、今ひとつ、鮮明でないように感じたので、解像度の指定をいろいろ試してみました。
AWS_ACCESS_KEY_ID=XXX AWS_SECRET_ACCESS_KEY=XXX ./kinesis_video_gstreamer_sample_app stream-name
解像度を指定した表示例は、以下のとおりです。
(1) 160✕120 30FPS
./kinesis_video_gstreamer_sample_app stream-name -w 160 -h 120 -p 30
(2) 1280×960 7FPS
./kinesis_video_gstreamer_sample_app stream-name -w 1280 -h 960 -p 7
5 対応解像度
今回使用したカメラで指定できる解像度は、次の手順で確認しました。
(1) 動画取り込みでサポートされている形式
いったん、Dockerから抜けて、v4l2-ctlで、Webカメラが対応していフォーマットを確認しました。
$ v4l2-ctl --list-formats-ext ioctl: VIDIOC_ENUM_FMT Index : 0 Type : Video Capture Pixel Format: 'YUYV' Name : YUYV 4:2:2 Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 352x288 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 320x240 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 176x144 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 160x120 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1280x960 Interval: Discrete 0.133s (7.500 fps) Size: Discrete 2048x1536 Interval: Discrete 0.286s (3.500 fps) Size: Discrete 1920x1080 Interval: Discrete 0.286s (3.500 fps) Size: Discrete 960x720 Interval: Discrete 0.067s (15.000 fps) Size: Discrete 1600x1200 Interval: Discrete 0.200s (5.000 fps) Index : 1 Type : Video Capture Pixel Format: 'MJPG' (compressed) Name : Motion-JPEG Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 352x288 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 320x240 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 176x144 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 160x120 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1280x960 Interval: Discrete 0.067s (15.000 fps) Size: Discrete 2048x1536 Interval: Discrete 0.067s (15.000 fps) Size: Discrete 1920x1080 Interval: Discrete 0.067s (15.000 fps) Size: Discrete 960x720 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1600x1200 Interval: Discrete 0.067s (15.000 fps)
上記の結果から、対応可能な(はずの)各種の解像度を指定してみたところ、下記のような結果となりました。
解像度 | FPS | 結果 |
---|---|---|
2048x1536 | 3.5 | ✕ |
1920x1080 | 3.5 | ✕ |
1600x1200 | 5 | ✕ |
1280x960 | 7.5 | OK (-f 7を指定) |
960x720 | 15 | OK |
640x480 | 30 | OK |
352x288 | 30 | OK |
320x240 | 30 | OK |
176x144 | 30 | OK |
160x120 | 30 | OK |
1600x1200以上で、うまく行かなかったのは、今一つ考慮が足りないのかも知れません。
6 最後に
やっと、RasPI+Webカメラで配信できる環境が出来ました。やっぱ、この最小パターンが欲しいです。 今度は、パーサー側の勉強しなければ・・・