[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カメラで配信できる環境が出来ました。やっぱ、この最小パターンが欲しいです。 今度は、パーサー側の勉強しなければ・・・

7 参考リンク


Raspberry Pi で GStreamer(gst-launch)
raspberry pi で USB camera から h.264 動画

コメントは受け付けていません。