FreeBSD で USB 接続の HDMI キャプチャが使えた

この投稿は [FreeBSD Advent Calendar 2024](https://qiita.com/advent-calendar/2024/freebsd) 9 日目の記事です。
ずいぶん前に USB 接続の HDMI キャプチャを買っていました。 SBC やサーバの画面をディスプレイを切り替えて作業するのが面倒でメインマシンのデスクトップに表示できたら楽だなと思ったのと、記録用に手軽にキャプチャができると良いなと思ったのが購入のきっかけです。  
しかし、当時どうしても FreeBSD で動かすことができず、ずっと放置していました。  
先日、ふと思い立って FreeBSD で使ってみたら動くではないですか!  
というわけで、私が調べた限りでは動かし方が見当たらなかったので記録として残しておきます。

# 今回の主役
4 年前に買った USB 接続の HDMI キャプチャです。 USB 接続で FullHD でキャプチャできます。FreeBSD は 12.2 とか 11.4 の頃です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/d2da000a-3723-3328-6e6f-144edb59bc56.png)

# 認識状況
環境は FreeBSD 14.1 です。先日 14.2 が出ましたが、まだアップグレードしていません。  
このデバイスは以下のように認識しています。

- dmesg  
  ```
  ugen1.11: <MACROSILICON USB3. 0 capture> at usbus1
  uaudio0 on uhub4
  uaudio0: <MACROSILICON USB3. 0 capture, class 239/2, rev 2.00/21.00, addr 10> on usbus1
  uaudio0: No playback.
  uaudio0: Record[0]: 96000 Hz, 1 ch, 16-bit S-LE PCM format, 2x4ms buffer. (selected)
  uaudio0: No MIDI sequencer.
  pcm11 on uaudio0
  uaudio0: No HID volume keys found.
  uhid1 on uhub4
  uhid1: <MACROSILICON USB3. 0 capture, class 239/2, rev 2.00/21.00, addr 10> on usbus1
  ```  
- usbconfig list  
  ```
  ugen1.11: <MACROSILICON USB3. 0 capture> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (500mA)
  ```
  
この頃の 2000 円以下で売られていたデバイスは MS2109 というチップを使っていることが多いそうなので、おそらくこのデバイスも同じチップを使っていると思われます。最近は MS2130 というデバイスを使っていることが多いようですが、持っていないので同じように使えるかは分かりません。

dmesg を見る限りではオーディオデバイスと HID に見えるようです。 HDMI キャプチャなのにビデオっぽいデバイスはなくて、 HID を持っているようです。オーディオは当然として、 HID は何に使うのだろう...。  

# Mac や Windows だとどう見える?
Mac や Windows だとカメラデバイスとして見えます。よって、Windows ならばカメラアプリでキャプチャした画像を見られます。 Mac ならば QuickTIme Player で良さそうです。
- デバイスマネージャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/34a4baa1-ca88-19f7-999f-48285b2fccd1.png)
- カメラアプリでキャプチャした画像を表示を表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/0708de3a-2b51-a2e5-ec81-aa1dc67c14b0.png)
*NanoPi R5S に Ubuntu を入れてあります*

# FreeBSD はどうする?
Mac や Windows ではカメラとして見えるので、 FreeBSD も同じようにカメラとして見えないか試してみます。

## カメラを使うなら cuse
キャラクタデバイスとして見えるようにする必要があるらしいので、 cuse をロードします。  
```
> sudo kldload cuse
```

## カメラなので webcamd
カメラとして扱うので、 webcamd を使います。以前はこれを使ってもうまくいかなかった気がします...。
```
> sudo pkg install webcamd
> sudo webcamd -d ugen1.11
webcamd 4763 - - Attached to ugen1.11[0]
webcamd 4763 - - Creating /dev/video0
webcamd 4763 - - Creating /dev/video1
```
*-d は認識している USB ポートを指定します*

video0, video1 と 2 つのデバイスを認識しますが、使うのは video0 のみです。このデバイスは webcamd ユーザしか使えない状態になっているので、一般ユーザでも読めるようにします。
```
> ls -al /dev/video*
crw-rw----  1 webcamd webcamd  0xef 12月  8 23:59 /dev/video0
crw-rw----  1 webcamd webcamd  0xf0 12月  8 23:59 /dev/video1
> sudo chmod -v 666 /dev/video*
```

## 任意のビューワーで表示する
とりあえず pwcview で表示してみます。 
Windows で表示した画像と同じ画像が表示されずはずです。
```
> pwcview -d /dev/video0 -f 30
```
無事に表示できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/7a2e737a-4001-0cf8-65ea-2b83a8e6e607.png)

# 気になるところ

他にも、 VLC や OBS, mplayer でも表示できました。  
ただ、音を出せたのは mplayer だけだったのですが、音を出すと音は途切れ途切れでキャプチャ画面もカクカクになって使い物にならなかったです。 VLC は音が出ないし画面もカクカクでやはり使い物にならないです。原因までは追いかけていません。
このデバイス、結構熱を持ちます。筐体がアルミ製なのは納得ができます。

# まとめ

4 年間放置しましたがいつの間にか使えるようになっていました。不便だなと思っていた部分が解消されて快適に過ごせそうです。挿したらサクッと使えるように devd を設定をしておくとさらに快適になりそうです。