LoginSignup
0
0

More than 1 year has passed since last update.

FreeBSDでUVCカメラ

Last updated at Posted at 2022-02-28

AcerのノートについているUVCなWEBCAMを試してみました。

こちらのSAITOU Toshihideさんのコードを使わせてもらいます。

uvc_device_listに以下を追加します。

        /* XPA9S1JG8 1.3M WebCam */
        { 0x0402, 0x9665, 0, 1, 1,  0, 0x81, 1, 0x0400, 0x0100 },

コンパイルして実行してみます。640x480(1)では動かなくて、320x240(2)では動きました。

% sudo ./ex41 2 test
1: 640x480
2: 320x240
XferType: 1
dwMaxPayloadTransferSize: 00000400
153600
1
153600
2
153600
3
153600
4
153600
5
153600
6
153600
7
153600
8
153600
9
153600
10
153600
11
^Ctime lapse: 989651
fps: 11
% sudo cat test | ffmpeg -f rawvideo -pix_fmt yuyv422 -s 320x240 -i - tmp.avi

このWEBCAMにはbFrameIndexは1から4まであるのですが2だけが使えるようです。

Windowsにtmp.aviをコピーして再生します。

image.png

640x480が処理できないのはdwMaxPayloadTransferSizeが関係しているようです。SAITOUさんのコードはMINの0x400(1Kbyte)で処理しているのですが、これだと320x240しか送れないみたいです。大きくすると640x480のEOFが拾えるようになるのですが、データがかけてしまいます。他のパラメータの調整も必要なのだと思われます。

640x480といってもyuyv422が1ピクセル16bitで5Mbit/frameくらいで、秒間30フレームだと150Mbit/secになり結構な量です。

dwMaxPayloadTransferSize(22-25)とFrame interval(4-7)をMINの二倍にしたら640x480でもキャプチャできました。Frame intervalは三倍にすると効かなくなるようなので、設定できる値に制限があるようです。

libuvcも試してみたのですが、まったくコールバックが呼ばれず、調べてみたら転送のsubmitのところでエラーになっていて動いていませんでした。デフォルトではエラーログも出さないし、クリーニングしてSUCCESSで返すし、DEBUGでビルドするとcore dumpするし、あまり品質のよくないプロジェクトみたいです。

ただ、どうもUVCなカメラはいろいろなようで、共通コードを作るのは結構大変で、いろいろ取り揃えて時間かけてやらないとダメそうな感じです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0