dummy_hcd 环回网络摄像头。不可能的?

dummy_hcd 环回网络摄像头。不可能的?

我一直在尝试借助dummy_hcdRaspberry 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-MANJAROraspberrypi 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

两种设备上的错误都是相同的,因此它不是特定于设备的。所以我不得不用这个错误去谷歌。我找到了线程,其中一个人说:

我知道已经晚了,但仅适用于尝试使用 g_webcam 或 uvc configfs 与 dummy_hcd 的其他人... 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,并且可以从从虚拟视频设备读取数据的任何其他应用程序中查看。

相关内容