NanoPi NEOでウェブカメラ

ウェブカメラ

NanoPi NEOの続き。
この手のシングルボードコンピュータを買ってやりたいことの1つは監視カメラ。
シングルボードコンピュータとUSBのウェブカメラがあれば取り敢えずは動画を取得してネットワークに撒くことはできる。しかも非常に低消費電力。

以前にOpenSUSE用ウェブカメラの記事でも書いたがLinuxでウェブカメラを使うのはとても簡単。UVC対応なら特に考えずに接続するだけ。なのでNanoPi NEO + armbian (Linux)でもUVC対応のウェブカメラをUSBポートに繋ぐだけ。

この記事を書く時に実際に使用したウェブカメラ(の広告)

一応接続後に認識されているか確認。

$ ls /dev

video0というのが存在すれば認識されていると思って良い。

それだけじゃ雑すぎだろということならlsusbで見る。

$ lsusb
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 003: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 004 Device 002: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

上の例だとDevice003にWebcam C270というのが認識されている。

ソフトウエア側は今回はVLCを使うことに。

# apt-get install vlc

おそらく素のarmbianだとドッサリとパッケージを入れられるだろうけど待ち時間はそんなでもない。

あとはVLCを実行するだけの筈が、ここからが大変。

とりあえずVLCを実行する。

$ cvlc -vvv v4l2:///dev/video0 --sout '#transcode{vcodec=jpeg,acodec=none}:rtp{sdp=rtsp://:8554/}'

おそらくベースとなるコマンドはこんな感じ。
なお、VLCはrootユーザーでは実行できないのでroot以外のユーザーになって実行するか、rootであるならsudoで他のユーザー指定で実行。もっともLinuxの流儀だと基本的にrootでオペレーションしない筈。
上の指定は、入力は/dev/video0 (ウェブカメラ)、ビデオエンコードはMotion JPEG、音声無し、出力はRTSP、ポート番号は本来のRTSPの554ではなく取り敢えず8554。

実行してから他の端末でRTSPで受信して動画を表示する。
例えばWindowsやLinuxにVLCが入っていてそれで表示するなら

$ vlc -vvv rtsp://192.168.0.82:8554/

上はNanoPiのIPアドレスが192.168.0.82の場合
Windowsの場合はVLCのPath付きで実行してやらないとおそらくVLCが起動しない筈。

若しくはVLCプレーヤーを起動して[メディア][ネットワークストリームを開く]を選択、「ネットワークURLを入力して下さい」にrtsp://192.168.0.82:8554/ を入力する。なお、192.168.0.82の部分はNanoPiのIPアドレスを指定。ポート番号の後の / を忘れずに指定。

Motion JPEGなので軽い方ではあるけどNanoPiで動かすとそうでもない不思議。
あと、Motion JPEGでは動画の幅が640pxまで。

armbian用に作られたVLCはPC用の普通とは少し違う様で、VLCで良く使うコーデック名を指定しても殆どがエラーになる。いろいろ試して使えたのはjpeg, mpgv, h264, theoだけ。
次はMPGV (MPEG-2)で実行

$ cvlc -vvv v4l2:///dev/video0 --sout '#transcode{vcodec=mpgv,vb=1200,width=640,height=360,acodec=none}:rtp{sdp=rtsp://:8554/}'

vcodecにmpgvを指定すると共にvb = 帯域、width,height = 動画の横幅,高さを指定。

MPGVは軽いかと思ったがMotion JPEGで遅いくらいなので全然重い (動画が表示されるまでの時間は短い)。そしてなんか扱いにくい。上の指定では帯域を1200Kbps取っているがこれでも画像はかなり荒い。値をもっと大きくするか指定を外すと綺麗。

次はH.264。

$ cvlc -vvv v4l2:///dev/video0 --sout '#transcode{vcodec=h264,width=640,height=360,acodec=none}:rtp{sdp=rtsp://:8554/}'

VLC 1
三角コーンが表示されたままなので失敗かなと思うくらい待たされる。

VLC 2
やっと映ったかなと思ったら暫くこんなの。また、頻繁に動画からこの状態になる。

VLC 3
映った。(上の画像はイメージです)

予想はしてたがアホみたいに重い。動画が表示されるまでに数十秒待たされて、灰色か緑一面が表示されてしばらくしてやっと正常に表示されたかなと思うとすぐに灰色。これじゃ全然使い物にならない。遅延も酷すぎ。
decoder/packetizer fifo full (data not consumed quickly enough), resetting fifo! というメッセージ多発。

そこで、少しはまともに使えるようにオプションを追加。

  • transcodeにthreads=4を追加。これで4コア使う?
  • transcodeにfps=10を追加。動画の動きの滑らかさはなくなるが監視カメラとしては実用的に。
  • transcodeにvenc=x264指定を追加。(以下)
  • vencのx264にpreset=ultrafastを追加。綺麗さより動き最優先。
  • vencのx264にtune=zerolatencyを追加。遅延の少ないチューニング。
  • vencのx264に他幾つか。

こうなった。

$ cvlc -vvv v4l2:///dev/video0 --sout '#transcode{vcodec=h264,venc=x264{preset=ultrafast,tune=zerolatency,intra-refresh,lookahead=10,keyint=15},width=640,height=360,threads=4,fps=10,acodec=none}:rtp{sdp=rtsp://:8554/}'

FPSを10に抑えたこととスレッドを4にしたのがかなり効いたようで移動する被写体の消滅やワープはなくなった。また、遅延も2秒以内と実用に耐える範囲。解像度が640x360でこの程度ならまぁまぁじゃないかな?

できればもっと軽くて柔軟な指定が可能なコーデックを使いたいところだが良い方法あるかな?VLCを作り直す?

2017年2月28日追記
次の記事のクロック変更を行ってCPUを高速化させた上でFPSを10から5~6 (7はギリギリダメかも)程度に落とすと1280x720の解像度でFIFOバッファの溢れ&リセットが発生せずに安定して動くことを確認。ただし、画像は1280x720の解像度を疑いたくなるほどはっきりしない。要するにボケた感じ。

関連記事:

NanoPi NEOベンチマーク

NanoPi NEO
画像は前回の使い回し

そういえばNanoPi NEOの性能はどの程度なものだろうか、ということでベンチマーク。
使ったのはUnixBench。
armbianは基本的なものは一通り揃っているのでUnixBench以外は特に事前に準備する必要は無し。

$ wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/byte-unixbench/UnixBench5.1.3.tgz
$ tar -zxvf UnixBench5.1.3.tgz
$ cd ./UnixBench
$ ./Run -c 1 -c 4

UnixBenchの実行は ./Run でも良いが、今回は4コアのCPUなので単独実行の-c 1と4パラレル実行の-c 4を追加指定している。
なお、UnixBenchは計測に時間がかかる。NanoPi NEOでは大戸屋で食事して歯を磨いてトイレに行くくらいは余裕。

make[1]: Entering directory '/home/foobar/UnixBench'
Checking distribution of files
./pgms  exists
./src  exists
./testdir  exists
./tmp  exists
./results  exists
make[1]: Leaving directory '/home/foobar/UnixBench'
sh: 1: 3dinfo: not found

   #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
   #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
   #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
   #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
   #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
    ####   #    #  #  #    #          #####   ######  #    #   ####   #    #

   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark

   Multi-CPU version                  Version 5 revisions by Ian Smith,
                                      Sunnyvale, CA, USA
   January 13, 2011                   johantheghost at yahoo period com


1 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

1 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

1 x Execl Throughput  1 2 3

1 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

1 x File Copy 256 bufsize 500 maxblocks  1 2 3

1 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

1 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

1 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

1 x Process Creation  1 2 3

1 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

1 x Shell Scripts (1 concurrent)  1 2 3

1 x Shell Scripts (8 concurrent)  1 2 3

4 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

4 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

4 x Execl Throughput  1 2 3

4 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

4 x File Copy 256 bufsize 500 maxblocks  1 2 3

4 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

4 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

4 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

4 x Process Creation  1 2 3

4 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

4 x Shell Scripts (1 concurrent)  1 2 3

4 x Shell Scripts (8 concurrent)  1 2 3

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: nanopineo: GNU/Linux
   OS: GNU/Linux -- 3.4.113-sun8i -- #28 SMP PREEMPT Thu Feb 2 02:01:28 CET 2017
   Machine: armv7l (unknown)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   10:27:43 up 4 min,  1 user,  load average: 0.20, 0.51, 0.28; runlevel 5

------------------------------------------------------------------------
Benchmark Run: Fri Feb 24 2017 10:27:44 - 11:08:57
0 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables        2944908.5 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                      423.9 MWIPS (10.0 s, 7 samples)
Execl Throughput                                399.6 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks         72919.0 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           22225.5 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        173730.8 KBps  (30.0 s, 2 samples)
Pipe Throughput                              186981.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  22891.7 lps   (10.0 s, 7 samples)
Process Creation                                896.5 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   1126.3 lpm   (60.1 s, 2 samples)
Shell Scripts (8 concurrent)                    313.2 lpm   (60.2 s, 2 samples)
System Call Overhead                         501993.8 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    2944908.5    252.3
Double-Precision Whetstone                       55.0        423.9     77.1
Execl Throughput                                 43.0        399.6     92.9
File Copy 1024 bufsize 2000 maxblocks          3960.0      72919.0    184.1
File Copy 256 bufsize 500 maxblocks            1655.0      22225.5    134.3
File Copy 4096 bufsize 8000 maxblocks          5800.0     173730.8    299.5
Pipe Throughput                               12440.0     186981.1    150.3
Pipe-based Context Switching                   4000.0      22891.7     57.2
Process Creation                                126.0        896.5     71.2
Shell Scripts (1 concurrent)                     42.4       1126.3    265.6
Shell Scripts (8 concurrent)                      6.0        313.2    522.0
System Call Overhead                          15000.0     501993.8    334.7
                                                                   ========
System Benchmarks Index Score                                         164.1

------------------------------------------------------------------------
Benchmark Run: Fri Feb 24 2017 11:08:57 - 11:51:07
0 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       11743019.5 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     1696.8 MWIPS (10.0 s, 7 samples)
Execl Throughput                               1350.9 lps   (29.6 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks         96558.8 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           37054.1 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        274432.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                              742384.9 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  92727.9 lps   (10.0 s, 7 samples)
Process Creation                               3428.3 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   2500.0 lpm   (60.1 s, 2 samples)
Shell Scripts (8 concurrent)                    329.9 lpm   (60.5 s, 2 samples)
System Call Overhead                        1895488.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   11743019.5   1006.3
Double-Precision Whetstone                       55.0       1696.8    308.5
Execl Throughput                                 43.0       1350.9    314.2
File Copy 1024 bufsize 2000 maxblocks          3960.0      96558.8    243.8
File Copy 256 bufsize 500 maxblocks            1655.0      37054.1    223.9
File Copy 4096 bufsize 8000 maxblocks          5800.0     274432.0    473.2
Pipe Throughput                               12440.0     742384.9    596.8
Pipe-based Context Switching                   4000.0      92727.9    231.8
Process Creation                                126.0       3428.3    272.1
Shell Scripts (1 concurrent)                     42.4       2500.0    589.6
Shell Scripts (8 concurrent)                      6.0        329.9    549.8
System Call Overhead                          15000.0    1895488.7   1263.7
                                                                   ========
System Benchmarks Index Score                                         429.0

1パラレル(つまりシングル、オプション無しの./Runと同じ)でIndex Scoreが164.1、4パラレルで429.0というのは他所の人が掲載しているUnixBenchの結果で見る限りはRaspberryPi2 ModelBに数字上は僅かに及ばないものの事実上「ほぼ匹敵」といってよいレベル。僅か$7.99という最低グレードのNanoPi NEOがこれだけの結果を出すとは正直意外。違った、メモリ512MBモデルは$9.99だった。

NanoPi NEOのUnixBenchでこちらのページでは4パラレルが342.6と書かれているが約25%も結果が違うのは何でだろう。個々の結果も全然違うっぽいけど・・
メモリ搭載量が違うモデルだからとか?

ところで、UnixBenchでは何故かCPUの認識が正しくなくて「0 CPUs in system;」という表示が出ている。

# cat /proc/cpuinfo
Processor       : ARMv7 Processor rev 5 (v7l)
processor       : 0
BogoMIPS        : 2400.00

processor       : 1
BogoMIPS        : 2400.00

processor       : 2
BogoMIPS        : 2400.00

processor       : 3
BogoMIPS        : 2400.00

Features        : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5

Hardware        : sun8i
Revision        : 0000
Serial          : 2400****************

Serialの*の部分は伏せている。
なんとなく4コアあるらしげな表示ではあるが情報がいろいろ足りないように思う。これが原因でUnixBenchでもCPUの情報が変なのかな。

関連記事:

Up