dummy_hcd
저는 Raspberry PI 2B의 커널 모듈을 사용하여 루프백 USB 웹캠 장치를 만들 려고 노력해 왔습니다 . 내가 취한 조치:
나는 .libcomposite
modprobe libcomposite
그런 dummy_hcd
다음 modprobe dummy_hcd
. 그러면 소프트웨어로 에뮬레이트된 UDC 칩이 생성됩니다. 내가 발견한 것 더보기여기.
그런 다음 스크립트를 사용하여 USB 웹캠 장치를 만들고 구성했습니다. 내 스크립트는 다음을 기반으로합니다.이것그리고이것. 여기있어:
#!/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
웹캠은 이를 사용하는 것 같으므로 하드웨어 UDC 칩(또는 이를 포함하는 일부 장치)을 구입하거나 해결 방법을 찾으십시오.
Linux에서 완전히 가상 루프백 웹캠을 만들 수 있는 방법이 정말 없나요? 웹캠이 작동하려면 전송을 동기화해야 합니까?
커널 수정 사항을 작성하지 않고 이를 실행할 수 있는 방법이 있습니까 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
가상 비디오 장치에서 데이터를 읽는 다른 응용 프로그램에서 볼 수 있습니다.