dummy_hcd
私はRaspberry PI 2Bのカーネルモジュールを使用してループバックUSBウェブカメラデバイスを作成しようとしてきました。私が取ったアクション:
私はlibcomposite
。modprobe libcomposite
それdummy_hcd
からmodprobe dummy_hcd
。これにより、ソフトウェアでエミュレートされたUDCチップが作成されます。私が見つけたものをもっと見るここ。
その後、スクリプトを使用してUSB Webカメラデバイスを作成して設定しました。私のスクリプトは以下に基づいています。これそしてこれ。ここにいる:
#!/bin/bash
GADGET_NAME=virtcam
GADGET_ROOT=/sys/kernel/config/usb_gadget/$GADGET_NAME
mkdir $GADGET_ROOT
cd $GADGET_ROOT
echo 0x1d6b > idVendor
echo 0x0104 > idProduct
echo 0x0100 > bcdDevice
echo 0x0200 > bcdUSB
echo 0xEF > bDeviceClass
echo 0x02 > bDeviceSubClass
echo 0x01 > bDeviceProtocol
mkdir strings/0x409
cd strings/0x409
echo 100000000d2386db > serialnumber
echo "Samsung" > manufacturer
echo "Webcam" > product
cd $GADGET_ROOT
mkdir configs/c.1
mkdir configs/c.1/strings/0x409
cd configs/c.1/strings/0x409
echo "UVC" > configuration
cd $GADGET_ROOT/configs/c.1
echo 500 > MaxPower
cd $GADGET_ROOT
mkdir functions/uvc.usb0
cd functions/uvc.usb0
echo 2048 > streaming_maxpacket
mkdir control/header/h
cd control
ln -s header/h class/fs
ln -s header/h class/ss
cd $GADGET_ROOT/functions/uvc.usb0/streaming/uncompressed
mkdir -p u/720p
cd u/720p
cat <<EOF > dwFrameInterval
666666
1000000
5000000
EOF
cat <<EOF > wWidth
1280
EOF
cat <<EOF > wHeight
720
EOF
cat <<EOF > dwMinBitRate
29491200
EOF
cat <<EOF > dwMaxBitRate
29491200
EOF
cat <<EOF > dwMaxVideoFrameBufferSize
1843200
EOF
mkdir $GADGET_ROOT/functions/uvc.usb0/streaming/header/h
cd $GADGET_ROOT/functions/uvc.usb0/streaming
ln -s uncompressed/u header/h
ln -s header/h class/fs
ln -s header/h class/hs
ln -s header/h class/ss
cd $GADGET_ROOT
ln -s functions/uvc.usb0 configs/c.1/uvc.usb0
# ln -s functions/acm.usb0 configs/c.1/acm.usb0
udevadm settle -t 5 || :
テストした両方のコンピュータ(5.15.16-1-MANJARO
およびraspberrypi 5.10.94-v7+
)の両方でスクリプトがエラーなしで完了しますが、生成されたUSBデバイスを仮想UDCに実際に接続しようとするとエラーが発生します。
cd $GADGET_ROOT
echo "dummy_udc.0" > UDC
# it returns 'bash: echo: write error: Invalid argument'
これは、基本的にデバイスがUDCチップに接続できないことを意味します。これを行うと、dmesg -Tw
次のようになります。
[Fri Feb 4 00:00:00 2022] configfs-gadget gadget: uvc: uvc_function_bind()
[Fri Feb 4 00:00:00 2022] configfs-gadget gadget: uvc: Unable to allocate streaming EP
[Fri Feb 4 00:00:00 2022] configfs-gadget dummy_udc.0: failed to start virtcam: -22
エラーは両方のデバイスで同じであるため、デバイスごとに変わりません。そのため、このエラーが発生してGoogleにアクセスする必要がありました。見つけました。これスレッドで一人がこう言いました。
遅れていることはわかりますが、dummy_hcdでg_webcamまたはuvc configfsを使用したい他の人にとっては、UVC機能は同期転送を使用するため、機能しません。
実際に見てみるとソースコード、コメントにこんな感じです。
注:シミュレーションには同期転送は含まれていません!
だから私は基本的に本当に閉じ込められています。アイソクロナス転送をサポートdummy_hcd
していないことがわかりましたが、ウェブカメラはそれを使用しているようです。
Linuxで完全に仮想ループバックWebカメラを作成する方法は本当にありませんか? Webカメラが機能するために転送を同期する必要がありますか?
カーネル修正を作成せずにこれを実行する方法はありますかdummy_hcd.c
?それともハードウェアを購入し、正しく動作することを望むだけですか?
答え1
私はあなたがこれを間違った方向から見ていると信じています。 dummy_hcdモジュールはUSBウェブカメラを作成するために必要な機能を提供していませんが、すでにv4l2 ループバックループバックウェブカメラデバイスを作成する機能を提供します。
とにかくv4l2はLinuxの世界のウェブカメラ標準なので、すべてのUSB関連の問題を解決することができます。
v4l2loopbackモジュールを使用すると、仮想ビデオデバイスを作成し、これらのデバイスをユーザースペースで制御できます。簡単な例は、ウェブカメラから来たかのようにローカルビデオファイルを再生することです。これは以下のようにffmpegを使って簡単に行うことができます。
sudo ffmpeg -i video.mp4 -vf format=yuv420p -f v4l2 /dev/video2
この例では、再生は、video.mp4
ウェブカメラからのように/dev/video2
仮想ビデオデバイスからデータを読み取る他のアプリケーションで見ることができる。