日本でも激安で人気の HDMI Capture USBドングルを買って、 OBS などをUbuntuでどのように使えるのか試してみました。
Hardware
淘寶で購入したのは、日本でもすっかり人気のこの商品(RMB40+送料)。HDMIへの入力は最大ほぼ4Kまで、キャプチャ出力は最大HD1080Pまで。付属のマニュアルは中英文バイリンガルで、OBSでの使い方が解説されていました。
金属筐体の入出力端面はネジ留めされているので、これを外すと中の基板を端子ごと引きずり出すことができます。
メインチップのヒートシンクはガッチリと固着していて剥がせませんでした。そして基板裏側のメインチップ付近にはスポンジが貼り付いています。
ドングルを元に戻し、Ubuntu 18.04のデスクトップPCのUSBポートに接続するとSyslogには次のようなログが出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
kernel: [20976.015211] usb 2-1.4: new high-speed USB device number 5 using ehci-pci kernel: [20976.126790] usb 2-1.4: New USB device found, idVendor=534d, idProduct=2109 kernel: [20976.126794] usb 2-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0 kernel: [20976.126797] usb 2-1.4: Product: USB Video kernel: [20976.126799] usb 2-1.4: Manufacturer: MACROSILICON kernel: [20976.127588] uvcvideo: Found UVC 1.00 device USB Video (534d:2109) kernel: [20976.128632] uvcvideo 2-1.4:1.0: Entity type for entity Processing 2 was not initialized! kernel: [20976.128636] uvcvideo 2-1.4:1.0: Entity type for entity Camera 1 was not initialized! kernel: [20976.131317] hid-generic 0003:534D:2109.0007: hiddev0,hidraw0: USB HID v1.10 Device [MACROSILICON USB Video] on usb-0000:00:1d.0-1.4/input4 mtp-probe: checking bus 2, device 5: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4" mtp-probe: bus: 2, device: 5 was not an MTP device upowerd[1507]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.3 upowerd[1507]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.1 upowerd[1507]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.4/0003:534D:2109.0007 upowerd[1507]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.4 upowerd[1507]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.2 upowerd[1507]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.0 upowerd[1507]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4 |
システムが認識したデバイスの情報は次のように。ハードウェアは名無しさんでした。
1 2 3 4 5 6 7 8 9 10 11 |
$ lsusb Bus 002 Device 003: ID 534d:2109 $ lsusb -t /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M |__ Port 3: Dev 3, If 0, Class=Video, Driver=uvcvideo, 480M |__ Port 3: Dev 3, If 1, Class=Video, Driver=uvcvideo, 480M |__ Port 3: Dev 3, If 2, Class=Audio, Driver=snd-usb-audio, 480M |__ Port 3: Dev 3, If 3, Class=Audio, Driver=snd-usb-audio, 480M |__ Port 3: Dev 3, If 4, Class=Human Interface Device, Driver=usbhid, 480M |
Software
VLC
まずはVLCで確認。画面がカクカクなのでv4l2-ctlで確認してみると、フレームレートが5fpsのまま変えらない様子。VLCの詳細設定にあるフレームレートの項目を設定しても効きません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
$ sudo apt install v4l-utils -y $ v4l2-ctl -d /dev/video0 --all Driver Info (not using libv4l2): Driver name : uvcvideo Card type : USB Video: USB Video Bus info : usb-0000:00:1d.0-1.4 Driver version: 4.15.18 Capabilities : 0x84200001 Video Capture Streaming Extended Pix Format Device Capabilities Device Caps : 0x04200001 Video Capture Streaming Extended Pix Format Priority: 2 Video input : 0 (Camera 1: ok) Format Video Capture: Width/Height : 1920/1080 Pixel Format : 'YUYV' Field : None Bytes per Line : 3840 Size Image : 4147200 Colorspace : sRGB Transfer Function : Default (maps to sRGB) YCbCr/HSV Encoding: Default (maps to ITU-R 601) Quantization : Default (maps to Limited Range) Flags : Crop Capability Video Capture: Bounds : Left 0, Top 0, Width 1920, Height 1080 Default : Left 0, Top 0, Width 1920, Height 1080 Pixel Aspect: 1/1 Selection: crop_default, Left 0, Top 0, Width 1920, Height 1080 Selection: crop_bounds, Left 0, Top 0, Width 1920, Height 1080 Streaming Parameters Video Capture: Capabilities : timeperframe Frames per second: 5.000 (5/1) Read buffers : 0 brightness 0x00980900 (int) : min=-128 max=127 step=1 default=-11 value=-11 contrast 0x00980901 (int) : min=0 max=255 step=1 default=148 value=148 saturation 0x00980902 (int) : min=0 max=255 step=1 default=180 value=180 hue 0x00980903 (int) : min=-128 max=127 step=1 default=0 value=0 |
加えて、音声ストリームが得られなかったのですが、こちらのフォーラムにヒントを見付けて解決。オプションに明示する必要があるようです。
1 |
:input-slave=alsa:// |
フレームレートについても何かオプションが無いか、デバイスの対応するピクセルフォーマットを出力してみると、高いフレームレートで映像を得るにはピクセルフォーマット形式をMJPGにする必要があることが判りました。
- Pixel Format: MJPG Max 60fps @1080P
- Pixel Format: YUYV Max 5fps @1080P
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
$ v4l2-ctl -d /dev/video0 --list-formats-ext ioctl: VIDIOC_ENUM_FMT Index : 0 Type : Video Capture Pixel Format: 'MJPG' (compressed) Name : Motion-JPEG Size: Discrete 1920x1080 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Size: Discrete 1600x1200 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Size: Discrete 1360x768 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Size: Discrete 1280x1024 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Size: Discrete 1280x960 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.020s (50.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Size: Discrete 1024x768 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.020s (50.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Size: Discrete 800x600 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.020s (50.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Size: Discrete 720x576 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.020s (50.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Size: Discrete 720x480 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.020s (50.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Size: Discrete 640x480 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.020s (50.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Index : 1 Type : Video Capture Pixel Format: 'YUYV' Name : YUYV 4:2:2 Size: Discrete 1920x1080 Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1600x1200 Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1360x768 Interval: Discrete 0.125s (8.000 fps) Size: Discrete 1280x1024 Interval: Discrete 0.125s (8.000 fps) Size: Discrete 1280x960 Interval: Discrete 0.125s (8.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.100s (10.000 fps) Size: Discrete 1024x768 Interval: Discrete 0.100s (10.000 fps) Size: Discrete 800x600 Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 720x576 Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 720x480 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) |
VLCではこれをクロマ形式で次のように指定することで、MJPGでの受信が可能になります。
1 |
:v4l2-chroma=mjpg |
以上より、VLCで必要なオプションをコマンドライン形式でまとめると以下の通りです。
1 |
$ cvlc v4l2:///dev/video0:chroma=mjpg :v4l2-fps=30 :v4l2-width=1920 :v4l2-height=1080 --input-slave alsa:// |
VLCでキャプチャ録画 (2021.03.12追記)
キャプチャを表示させながら録画するには、「キャプチャデバイスを開く」ウィンドウ下方、「再生で」はなく「変換」を選択します。
続いて現れる変換設定ウィンドウでは必ず「出力の表示」にチェックを入れます(チェック外れていると表示されずに黙々と録画)。出力先のファイル名をセットし、開始ボタンを押すと録画及び表示が始まります。
開始前に「プロファイル」欄のスパナアイコンを押すと次のコーデック関連の設定画面が開きます。デフォルトでは「オリジナルを保持」にチェックが入っているので、これを外せば任意のコーデックやビットレートを指定することが可能です。
実際に録画してみましたが、MJPGでは数分録画しただけで数GBと出力ファイルがかなり肥大すること、h264等のコーデックで変換しようとするとファイル出力が追いついていないように感じられました。VLCは閲覧用と割り切った方が良さそうです。
GUVCView
次にGUVCViewを使ってみます。インストールは次のようにPPAを登録してから。
1 2 |
$ sudo add-apt-repository ppa:pj-assis/ppa $ sudo apt install guvcview -y |
VLCの時と違い、特に何も設定を変えずともフレームレートを上げられるのでとてもスムース。スクリーンキャプチャや録画も簡単ですが、音声をモニタ出力する方法が見つからず不安なのですが、録画ファイルには正常に音声も記録されていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
$ v4l2-ctl -d /dev/video0 --all Driver Info (not using libv4l2): Driver name : uvcvideo Card type : USB Video: USB Video Bus info : usb-0000:00:1d.0-1.4 Driver version: 4.15.18 Capabilities : 0x84200001 Video Capture Streaming Extended Pix Format Device Capabilities Device Caps : 0x04200001 Video Capture Streaming Extended Pix Format Priority: 2 Video input : 0 (Camera 1: ok) Format Video Capture: Width/Height : 1920/1080 Pixel Format : 'MJPG' Field : None Bytes per Line : 0 Size Image : 4147200 Colorspace : sRGB Transfer Function : Default (maps to sRGB) YCbCr/HSV Encoding: Default (maps to ITU-R 601) Quantization : Default (maps to Full Range) Flags : Crop Capability Video Capture: Bounds : Left 0, Top 0, Width 1920, Height 1080 Default : Left 0, Top 0, Width 1920, Height 1080 Pixel Aspect: 1/1 Selection: crop_default, Left 0, Top 0, Width 1920, Height 1080 Selection: crop_bounds, Left 0, Top 0, Width 1920, Height 1080 Streaming Parameters Video Capture: Capabilities : timeperframe Frames per second: 30.000 (30/1) Read buffers : 0 brightness 0x00980900 (int) : min=-128 max=127 step=1 default=-11 value=-11 contrast 0x00980901 (int) : min=0 max=255 step=1 default=148 value=148 saturation 0x00980902 (int) : min=0 max=255 step=1 default=180 value=180 hue 0x00980903 (int) : min=-128 max=127 step=1 default=0 value=0 |
OBS
最後にYoutubeなどの配信で定番のOBSを試してみます。Ubuntu 18.04標準で入れられるのは少し古いバージョン。
1 2 3 4 5 |
$ obs --version OBS Studio - 21.0.2 (linux) $ sudo apt search obs-studio obs-studio/bionic,now 21.0.2+dfsg1-1 amd64 [インストール済み] recorder and streamer for live video content |
公式レポジトリを追加して現行版にアップグレードしてみます。旧版が入っていると、パッケージ保留でアップグレード出来なかったので、一度アンインストールしてからインストールし直す必要がありました。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ sudo add-apt-repository ppa:obsproject/obs-studio $ sudo apt search obs-studio obs-studio/bionic 26.1.1-0obsproject1~bionic amd64 [21.0.2+dfsg1-1 からアップグレード可] recorder and streamer for live video content $ sudo apt update -y $ sudo apt remove obs-studio -y $ sudo apt autoremove -y $ sudo apt install obs-studio -y $ obs --version OBS Studio - 26.1.1 (linux) |
活用法
特に動画配信に全く興味もない自分にとって、このデバイスの便利な使い方は「簡易仮想ディスプレイ」でしょう。ヘッドレスで使うRaspberry Piのスタンドアロン状態でのセットアップや、トラブルシューティングでコンソール画面を直接見たい場合や、TVセットボックスをメインPCの傍らで使いたい場合など、わざわざ物理的なディスプレイを用意するほどではないこうしたケースに重宝しそうです。
私それかったんだ~