web-dev-qa-db-ja.com

ビデオをWebカメラとしてストリーミングする仮想UVCデバイスを作成する

ビデオファイルを使用してストリーミングする方法を探しているので、本物のUVCデバイスのように見えます。

調べてみたところ vc-gadget だが、これが自分の望みどおりに機能するかどうかはわからない。受信機に追加のソフトウェアをインストールせずに、他のデバイスからUSB経由でビデオをストリーミングできるようにしたいので、UVCを使用する必要があります。しかし今のところ、同じデバイスで実行してUVCデバイスをエミュレートできるツールだけが機能します。

これを行うことができるツールはありますか?

4
Sam

USBは非対称です:USBマスター(PC)とUSBスレーブ(デバイス)があります。 USBコネクターには、マスター用のタイプAとスレーブ用のタイプBの2種類のタイプがありますが、ハードウェア設計者がどこでもタイプAを使用することで区別が曖昧になり、USB OTGは両方を実行できるのはそのためです。

Linux USBガジェットデバイスは、USBスレーブコントローラー上のUSBデバイスを表すカーネルモジュールです。接続する(スレーブ)ホストコントローラー(HC)が必要です。デバイスを表す組み込みLinuxシステムでは、USBコントローラーのドライバーになります。 PCにはハードウェアはありません。

しかし、次のカーネルモジュールがありますシミュレート USBスレーブコントローラ:dummy_hcd。このモジュールは、ガジェットが接続する仮想(スレーブ)ホストコントローラーと、それらのデバイスが表示される追加のUSBバスを提供する仮想(マスター)ホストコントローラーを提供します。

例:

# modprobe dummy_hcd
# lsusb
...
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
# modprobe g_serial
# lsusb
...
Bus 005 Device 002: ID 0525:a4a7 Netchip Technology, Inc. Linux-USB Serial Gadget (CDC ACM mode)
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

また、ガジェットの/dev/ttyGS0からのg_serialと、デバイスを表す自動的に読み込まれる/dev/ttyACM0モジュールからのcdc_serialの2つの新しいデバイスノードを取得します。片方に書き込み、もう片方から読み取ることで、彼らが通信していることをテストできます。

ガジェットUVCドライバーg_webcamもあります。新しい/dev/video*デバイスを作成し、上記の/dev/ttyGS0と同様に、ビデオをストリーミングできますintoこのデバイスでガジェットを使用できます。そして、それがuvc-gadgetユーザー空間プログラムが行うことです。静的画像を取得するか、別の既存の「実際の」UVCデバイスを入力して、新しく作成された/dev/video*にストリーミングするので、 USBデバイスの実際のデータ。このデバイスを使用するUSB​​マスターで正しく出力されるかどうかを確認します。

ただし、dummy_hcdバスでは動作しないようです(今すぐ試しました)。上記と同様に、USBカーネルによってsecond/dev/video*デバイスを作成する必要がありますマスター側のモジュール使用ウェブカメラ。それは起こりません。代わりに、しばらくするとUSBシステムが混乱し、キーボードとマウスが使用できなくなります。

そのため、g_webcamにバグがあるか、ビデオサブシステムが同じ識別子を使用して両方のデバイスを作成しようとしてから中断するか、別の何かが発生する可能性があります。知りません。

したがって、実際の(スレーブ)ホストコントローラーを備えた実際の組み込みシステムでのみ機能する可能性があります。

そう、そうです、これを行うことができるツールが利用可能ですが、残念ながら、シミュレーションされたデバイスを同じコンピューター(通常のPC)に表示したい場合、シミュレーションはバグがあります。組み込みシステムでも動作する可能性があります(エミュレートされたデバイスをどこでどのように使用するかについては言いませんでした)。

2
dirkt