測定コマンドの備忘録的に書こうと思ったのですが、折角なので Raspberry Pi Advent Calendar 2016 に参加するつもりで書きました。
http://www.adventar.org/calendars/1341
USBカメラだと出なかった720p 30fps
人によってはゴミ記事です。オチがあるので、最後まで読んでください。
なんのこっちゃ?って思う人が多いと思うんですが。僕は比較的新しいWeb規格であるWebRTCのNative ClientをRaspberry Piで動かそうとしています。そうすると少ない遅延でブラウザに映像/音声を送る事ができて自己満足出来るんですが、なかなかフレームレートが出ないんです。
RasPi専用カメラという選択肢
この子はやはり専用インターフェイスというだけあって、720p 30fpsが簡単に出るイメージです。Camera moduleもv1は残念画質でしたがv2は劇的に綺麗になりましたよね。
でも使いたいUSBカメラ
しかし、やはりUSBカメラを使いたいんです。解像度よりレンズの品質による影響が大きい事は Logicool C920 が示してくれました。ちなみに C920r からは謎のガラスレンズですが、その前まではカールツァイスでした。画質の差は素人にはちょっと解りませんが。。。
USBカメラだと出ない720p 30fps
さて、最初の話に戻ってきました。コレを検証する容易な方法があります。USBカメラはVideo4LinuxというLinux向けのドライバで繋がっていますので、このコントロールツールを使うんです。
取りあえずカメラの対応フォーマット一覧
コマンド一個で対応フォーマットは一覧表示されます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ v4l2-ctl --list-formats ioctl: VIDIOC_ENUM_FMT Index : 0 Type : Video Capture Pixel Format: 'YUYV' Name : YUYV 4:2:2 Index : 1 Type : Video Capture Pixel Format: 'H264' (compressed) Name : H.264 Index : 2 Type : Video Capture Pixel Format: 'MJPG' (compressed) Name : Motion-JPEG |
このIndexは後で指定要素に使います。このサンプルはC920でやりました。
下記の様にたたくと、対応解像度と対応フレームレートの一覧がでます。行数が多いので割愛しますが、高解像度はフレームレートが出なくなるのが解ります。
1 2 3 |
$ v4l2-ctl --list-formats-ext |
参考までに
YUYV
YUYVと書かれたのはRAWの画像です。RAWも色の並びとbit数でいろんな種類があります。ちなみにI420と言われるRAWはビデオ系のエンコーダーにポン投げ出来て素敵です。ただ、高画質の世界にはこの色表現が入ってくるので何が素敵かは人それぞれですね。リアルタイムが重要な僕はスピード狂なのでI420だとハッピーです。ただ、データ量が多いのでフレームレートは一番でません。C920は720pだと、この形式では10fpsが限界です。
H264
はい、言わずと知れた動画圧縮規格ですね。カメラに対すると相対的に狭いとも言えるUSBに高画質を押し込むべくカメラ側でエンコードして転送します。フレームレートは一番でます。え、カメラ側でH264にしてくれるなら、そのまま送ればストリーミング完了じゃん!と思ったあなた。帯域推定で動的に解像度、FPS、ビットレートが変わるリアルタイムストリーミングの世界へお越しください。トランスコードが必要になる嫌なやつです。C920は1080pまで30fpsで出せます。
MJPG
おまえ、生きてたのか!って行っちゃう懐かしの動画形式です。まぁ、しかしながら720pだとこの規格なら30fps出る事になってます。ありがたい規格です。
30fpsならMJPG使えば良いんじゃん!
そうその通り!と言うわけでカメラを720p,MJPG,30fpsに指定してみます。
1 2 3 4 |
$ v4l2-ctl --set-fmt-video=width=1280,height=720,pixelformat=2 $ v4l2-ctl -p 30 |
目の良い方ならお気づきでしょうが、30fps出てないんです。下記のコマンドで計る事ができます
1 2 3 4 5 6 7 8 |
$ v4l2-ctl --stream-mmap=3 --stream-count=300 >>>>>>>>>>>>>>>>>>>>>>>>>>>> 26 fps >>>>>>>>>>>>>>>>>>>>>>> 22 fps >>>>>>>>>>>>>>>>>>>>>> 22 fps >>>>>>>>>>>>>>>>>>>>>>> 23 fps >>>>>>>>>>>>>>>>>>>>>>>> 22 fps |
あれ?。。。ちなみにH264だとどうでしょう?
1 2 3 4 5 6 7 8 9 |
$ v4l2-ctl --set-fmt-video=width=1280,height=720,pixelformat=1 $ v4l2-ctl --stream-mmap=3 --stream-count=300 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 fps >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 fps >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 fps >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 fps >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 fps |
余裕の30fpsです。おまけはYUYV。まぁ、10fpsは出る事になってます。
1 2 3 4 5 6 7 8 9 |
$ v4l2-ctl --set-fmt-video=width=1280,height=720,pixelformat=0 $ v4l2-ctl --stream-mmap=3 --stream-count=300 >>>>>> 5 fps >>>> 4 fps >>>>> 5 fps >>>>> 5 fps >>>>> 4 fps |
10fpsの半分しか出ませんでした。
カメラが不良品なんじゃ。。。
いえ、そんな事はないです。ちゃんとx86なマシンにつなぐと公称値を発揮します。
原因はなんなの?
Raspberry PiのUSB転送レートが遅い事がおそらく原因です。この話題は比較的ホットなようでUSBおせー。イーサネットおせー(RaspberryPiのイーサネットはUSB接続)。という記事が公式コミュニティには散見されます。
USBが遅い問題への対策
/boot/cmdline.txt の末尾に
1 2 3 |
dwc_otg.fiq_enable=0 dwc_otg.fiq_fsm_enable=0 dwc_otg.nak_holdoff=0 |
を追記するのが良くとられる対策です。比較してみましょう。
おや?。。。検証用のrasbianは既に入っている。。。まぁいいや。。。
外して比較して入れ替えよう。。。と、外したところ。。。
1 2 3 4 5 6 7 8 9 |
$ v4l2-ctl --set-fmt-video=width=1280,height=720,pixelformat=2 $ v4l2-ctl --stream-mmap=3 --stream-count=300 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 fps >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 fps >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 fps >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 fps >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 fps |
ほげぇぇぇ!パラメータ外したら30fps出たよ!なんで、なんでぇぇぇぇ。
というわけで、最近のraspbianはMJPGだと30fpsがデフォルトで出るそうです。
むしろパラメーターは邪魔っぽい。。。
あれ、記憶違いだったのか?あれぇ?あれぇぇぇ?出なかったと思うんだけどなぁ。。。
以上、残念な記事でした。firmwareが改善されたの?なんで?なぜ・・・
ピンバック: ラズパイ USBカメラ – ラズパイFAN
ピンバック: 【Raspberry Pi】Webカメラを接続してみる【Logicool C920】 – お部屋でモバイル