Python 如何制作具有/dev/video9的虚拟视频设备进行测试和调试?
我正在做一个机器人项目,在那里我用两个网络摄像头来拍摄眼睛 我有两个网络摄像头通过USB连接到我的电脑,它创建了/dev/video0和/dev/video1,现在的问题是,当摄像头被Skype或其他软件使用时,有时会出现故障。因为Linux的制造商驱动程序本身可能是使/dev/video0或/dev/video1消失的问题(除非手动拔下并重新插入,否则在某些情况下是不可能的,例如远程/机器人项目,我需要100%的摄像头可用性才能将其用作眼睛) 为了解决这个问题,我编写了一个脚本:Python 如何制作具有/dev/video9的虚拟视频设备进行测试和调试?,python,linux,bash,video-processing,vlc,Python,Linux,Bash,Video Processing,Vlc,我正在做一个机器人项目,在那里我用两个网络摄像头来拍摄眼睛 我有两个网络摄像头通过USB连接到我的电脑,它创建了/dev/video0和/dev/video1,现在的问题是,当摄像头被Skype或其他软件使用时,有时会出现故障。因为Linux的制造商驱动程序本身可能是使/dev/video0或/dev/video1消失的问题(除非手动拔下并重新插入,否则在某些情况下是不可能的,例如远程/机器人项目,我需要100%的摄像头可用性才能将其用作眼睛) 为了解决这个问题,我编写了一个脚本: ### Lo
### Logitech camera lost
target="/dev/video99"
foundon="none"
warn="[WARNING]:"
ok="[OK]:"
for i in 0 1 2 3 4
do
tmp="/dev/video$i"
if [ -e $tmp ]
then
foundon="/dev/video$i"
else
echo "no $i"
fi
done
b="none"
if [ "$foundon" = "$b" ]
then
echo "$warn No camera is found"
echo "$warn Auto restarting /var/tmp/runme.sh"
/var/tmp/runme.sh &
else
echo "$ok ln -s $foundon $target"
echo password | sudo -S ln -sf $foundon $target
echo password | sudo -S chmod -R 777 $target
fi
ls /dev/vid*
但这仍然不够,我需要制作一个虚拟1映像或基于空映像的虚拟视频设备接口,它永久地位于/dev/video9中。一旦我有了那个虚拟视频设备,我就可以调试/识别是什么原因导致原始摄像机突然丢失
问:当任何应用程序将一个虚拟/dev/video9用作视频源输入时,我如何制作一个虚拟/dev/video9来真正充当显示一个jpeg或视频剪辑的相机源?(例如:skype或其他..)它可以工作
步骤1:
$ apt-get install linux-headers-3.5.0-17-generic
$ apt-get install v4l2loopback-dkms
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
module-assistant v4l-utils
Use 'apt-get autoremove' to remove them.
Suggested packages:
v4l2loopback-utils
The following NEW packages will be installed:
v4l2loopback-dkms
0 upgraded, 1 newly installed, 0 to remove and 506 not upgraded.
Need to get 0 B/24.7 kB of archives.
After this operation, 115 kB of additional disk space will be used.
Selecting previously unselected package v4l2loopback-dkms.
(Reading database ... 201818 files and directories currently installed.)
Unpacking v4l2loopback-dkms (from .../v4l2loopback-dkms_0.6.1-1_all.deb) ...
Setting up v4l2loopback-dkms (0.6.1-1) ...
Loading new v4l2loopback-0.6.1 DKMS files...
First Installation: checking all kernels...
Building only for 3.5.0-17-generic
Building initial module for 3.5.0-17-generic
Done.
v4l2loopback:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.5.0-17-generic/updates/dkms/
depmod....
DKMS: install completed.
root@sun-M14xR2:~# modprobe v4l2loopback video_nr=5
or
echo "v4l2loopback video_nr=0" >> /etc/modules
root@sun-M14xR2:~# v4l2-sysfs-path
Video device: video0
Video device: video3
Alsa playback device(s): hw:1,3 hw:0,0 hw:0,3
步骤2:
#!/bin/bash
while true
do
target="/dev/video99"
foundon="none"
warn="[WARNING]:"
ok="[OK]:"
for i in 1 2 3 4
do
tmp="/dev/video$i"
if [ -e $tmp ]
then
foundon="/dev/video$i"
else
echo "no $i"
fi
done
b="none"
if [ "$foundon" = "$b" ]
then
echo "$warn No camera is found"
echo "$warn Auto restarting /var/tmp/runme.sh"
pp=$(ps aux | grep "sink" | grep -v "grep" | awk '{print $2}')
if [ -z "$pp" ]
then
export DISPLAY=:0.0 && sink device=/dev/video0 &
fi
echo pass | sudo -S ln -sf /dev/video0 /dev/video99
echo pass | sudo -S chmod -R 777 /dev/video99
else
echo "$ok ln -s $foundon $target"
ps aux | grep "sink" | grep -v "grep" | awk '{print $2}' | xargs kill -9;
echo pass | sudo -S ln -sf $foundon $target
echo pass | sudo -S chmod -R 777 $target
fi
ls /dev/video*
sleep 1
done
也许您可以将您的
udev
配置为使用USB ID?@BasileStarynkevitch:我正在使用v4l2loopback dkms
。也许你可以分享如何使用udev,我可以使用它,但我看到它非常复杂和凌乱,所以没有尝试。我在答复中公布了工作版本。如何对udev进行同样的操作?“modprobe”和“echo…”>/etc/modules”不应该对“video\u nr=…”?modprobe v4l2loopback video\u nr=5或echo“v4l2loopback video\u nr=0”>/etc/modules使用相同的值吗