我正在使用 v4l2-loopback 创建一个可以被 Chrome 识别的虚拟网络摄像头。第一次启动环回后,一切正常,但当我第一次终止环回时,它不再工作。如果我使用 ctrl-c 或通过向 ffmpeg 发送“q”来终止它,就会出现这种情况。如果我第二次使用 sudo 运行 ffmpeg,它确实可以工作,然后在 sudo 或以普通用户身份运行后就无法工作了。所以它似乎每个用户都工作一次,这让我认为每个用户都创建了一些文件,但没有正确清理。
如何有效地关闭和打开环回?
这是环回脚本:
#!/bin/bash
facecam_serial_id="/dev/v4l/by-id/usb-Elgato_Elgato_Facecam_FW42K1A07613-video-index0"
ffmpeg -v debug -f v4l2 -input_format uyvy422 -framerate 60 -video_size 1920x1080 -i $facecam_serial_id -pix_fmt yuyv422 -f v4l2 /dev/video9
这是 ffmpeg 工作时的输出: https://termbin.com/h9xb
这是 ffmpeg 不起作用时的输出: https://termbin.com/5573
第一次杀死环回后,这是journalctl中的错误:
spa.v4l2: '/dev/video0' VIDIOC_QUERYCTRL: 管道损坏 我使用此命令来测试相机当前是否正在工作:
ffplay -f v4l2 /dev/video9
这是测试命令不再工作时出现的错误:
[video4linux2,v4l2 @ 0x7ff1d4000c80] Not a video capture device.
/dev/video9: No such device
所有想法表示赞赏!
答案1
我最近使用遇到了同样的问题OBS工作室。
不是修复,而是对我有用的解决方法:
# Loopback not working or working once?
# Try removing and reloading:
#
sudo modprobe -r v4l2loopback
sudo modprobe v4l2loopback
sudo depmod -a
祝你好运!
答案2
我在这里发现了这个问题: https://thesquareplanet.com/blog/camera-webcam-on-linux/
我发现 Elgato 对于开始和停止捕捉非常挑剔。而且它很快就会变旧,每次你想要录音时都必须将其拔出并重新插入。事实证明,通过使用该程序进行“软”重置,您可以非常轻松地解决这个问题。说明在这里: https://askubuntu.com/questions/645/how-do-you-reset-a-usb-device-from-the-command-line
我自己的一点贡献:
#!/bin/bash
Sample lsusb output for Elgato Facecam
Bus 004 Device 003: ID 0fd9:0078 Elgato Systems GmbH Elgato Facecam
facecam_vendor_id="0fd9:0078"
facecam_usb_path=$(lsusb -d $facecam_vendor_id | awk '{print "/dev/bus/usb/"$2"/"$4}' | awk '{print substr($0, 0, length($0)-1)}')
<path_to_binary>/usb_reset $facecam_usb_path
答案3
我对此也有一些运气:
sudo modprobe -r v4l2loopback
sudo modprobe v4l2loopback
sudo depmod -a
这是为了让 OBS 与 Microsoft Teams 配合使用 - 解决方法,因为 Linux 上的 Teams 不支持屏幕共享。
答案4
不确定这是否仍然相关,但我能够通过将 Elgato Facecam 更改为同步模式来避免断开/重新连接 USB 的需要(在 Windows 中,在 Linux 中使用时似乎仍然如此):
https://help.elgato.com/hc/en-us/articles/4681224843917-Elgato-Facecam-如何更改USB传输模式
请注意,最近的 4.09 固件更新也可能消除了环回的需要:
https://gist.github.com/catrielmuller/71ae055871893d289476ee570fd953d8