どうも、めかぶです。

Switch2で使えるWebカメラ・キャプチャボードについて、色々な憶測が飛び交っているのと、自分が気になっているので、実際に調査してみることにしました。

はじめに

まず、Switch2で使用できるWebカメラ・キャプチャボードは、UVC(USB Video Class) に対応している必要があります。

ただし、UVCにも、1.0, 1.1, 1.5といったバージョンがあります。

この中で、Switch2はどのバージョンまで対応しているのか?というのを確認する必要があります。

また、対応するUVCバージョンでも、UVCデバイスが渡す 映像として渡せる映像フォーマット・解像度・フレームレート がSwitch2の仕様に収まっている必要があります。

通常、UVCデバイスは複数の映像フォーマット・解像度・フレームレートに対応しており、それを接続時に全てホスト側(ここではSwitch2)に伝え、ホスト側はその中から使いたい解像度・フレームレートを選択します。

この一覧の中に、Switch2が対応しているフォーマット・解像度・フレームレートが無い場合、映像を渡すことができません。

なので、調査内容としては、以下になります。

  • Switch2が対応しているUVCバージョン
  • Switch2が対応している映像フォーマット・解像度・フレームレート

純正カメラの調査

純正カメラであれば、確実にSwitch2が対応しているUVCバージョン・映像フォーマット・解像度・フレームレートが確認できるはずです。

PCに接続して、USB Device Tree Viewerで確認してみます。

USBディスクリプタ

UVCバージョンは1.50ですね。

UVCバージョン1.0以外のキャプチャボードだと使用できないという話もありますが、純正は1.50なので、UVCバージョンのせいで認識されないということは考えづらいと思います。

気になるのはDefault Video Modesで、特定の解像度に対してMJPEGで送るよという設定がされているように見えます。

これらの解像度はカメラやキャプボでは主要な解像度になるので、この解像度に対してMJPEGではなくYUV(無圧縮)等で送るようになっていると認識されないという可能性があるかもしれません。

 

おまけとして、Linuxの方が詳細な情報が見やすく確認できるので、一応Linuxで確認した結果も載せておきます(長いです)。

Linuxでの確認結果

UVCバージョン

mekabu@DESKTOP:~$ dmesg | grep -i uvc
[60267.883545] usb 1-1: Found UVC 1.50 device Camera Device (057e:206d)
[60267.893639] usbcore: registered new interface driver uvcvideo

対応するフォーマット・解像度・フレームレート

mekabu@DESKTOP:~$ v4l2-ctl --device=/dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'YUYV' (YUYV 4:2:2)
                Size: Discrete 640x360
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.043s (23.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.083s (12.000 fps)
                        Interval: Discrete 0.091s (11.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.111s (9.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                        Interval: Discrete 0.143s (7.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                        Interval: Discrete 0.333s (3.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.043s (23.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.083s (12.000 fps)
                        Interval: Discrete 0.091s (11.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.111s (9.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                        Interval: Discrete 0.143s (7.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                        Interval: Discrete 0.333s (3.000 fps)
                Size: Discrete 360x640
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.043s (23.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.083s (12.000 fps)
                        Interval: Discrete 0.091s (11.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.111s (9.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                        Interval: Discrete 0.143s (7.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                        Interval: Discrete 0.333s (3.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.111s (9.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                        Interval: Discrete 0.143s (7.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                        Interval: Discrete 0.333s (3.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.008s (120.000 fps)
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.043s (23.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.083s (12.000 fps)
                        Interval: Discrete 0.091s (11.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.111s (9.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                        Interval: Discrete 0.143s (7.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                        Interval: Discrete 0.333s (3.000 fps)
                Size: Discrete 320x180
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.043s (23.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.083s (12.000 fps)
                        Interval: Discrete 0.091s (11.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.111s (9.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                        Interval: Discrete 0.143s (7.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                        Interval: Discrete 0.333s (3.000 fps)
                Size: Discrete 180x320
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.043s (23.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.083s (12.000 fps)
                        Interval: Discrete 0.091s (11.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.111s (9.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                        Interval: Discrete 0.143s (7.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                        Interval: Discrete 0.333s (3.000 fps)
        [1]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.043s (23.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.083s (12.000 fps)
                        Interval: Discrete 0.091s (11.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.111s (9.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                        Interval: Discrete 0.143s (7.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                        Interval: Discrete 0.333s (3.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.043s (23.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.083s (12.000 fps)
                        Interval: Discrete 0.091s (11.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.111s (9.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                        Interval: Discrete 0.143s (7.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                        Interval: Discrete 0.333s (3.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.043s (23.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.083s (12.000 fps)
                        Interval: Discrete 0.091s (11.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.111s (9.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                        Interval: Discrete 0.143s (7.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                        Interval: Discrete 0.333s (3.000 fps)
                Size: Discrete 960x540
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.043s (23.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.083s (12.000 fps)
                        Interval: Discrete 0.091s (11.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.111s (9.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                        Interval: Discrete 0.143s (7.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                        Interval: Discrete 0.333s (3.000 fps)
                Size: Discrete 480x272
                        Interval: Discrete 0.008s (120.000 fps)
                        Interval: Discrete 0.017s (60.000 fps)

とりあえず、上記の結果から、以下のフォーマット・解像度・フレームレートに対応していそうです。

フレームレートは最大を記載しています。

  • YUYV
    • 640x360@30
    • 640x480@30
    • 360x640@30
    • 1280x720@10
    • 320x240@120
    • 320x180@30
    • 180x320@30
  • MJPEG
    • 1920x1080@30
    • 640x480@60
    • 1280x720@30
    • 960x540@30
    • 480x272@120

純正カメラの調査から見えてきたこと

純正カメラの調査結果から、「良いキャプボだとむしろ使用できない」というのは、おそらく特定解像度に対してMJPEG対応していないことと、それ以外の解像度に対しては、解像度が低すぎて対応していないことが原因ではないかと思います。

良いキャプボでは、MJPEGの代わりに無圧縮のYUVやエンコードが効率的なH.264/HEVCなどの圧縮フォーマットがサポートされることが多いです。

逆にWebカメラではMJPEGが一般的なため、「高級なキャプボは認識されないが、激安キャプボやWebカメラは認識される」という状況が発生しているのかと思います。

UVC1.1のキャプボが使えなかったという話もあるので、もしかすると1.0と1.5にのみ対応しているという可能性もありますが、あえてそのような実装にする必要もないので、可能性は低いかと考えています。

つぎにやること

手元にUSB-OTGに対応しているRaspberry Pi Zero 2 Wがあるので、こいつをUVCデバイスとして振る舞わせて、純正カメラで調査した結果が正しいのかどうかを確認したいと思います。