Si vous souhaitez insérer une seule caméra Web, vous devez généralement la connecter à / dev / video0
$ fswebcam -d /dev/video0 a.jpg
#Ou par défaut/dev/Parce que c'est de la vidéo0
$ fswebcam a.jpg
Cependant, s'il y en a deux ou plus, il est difficile de savoir quelle caméra est / dev / video0 ou 2.
Vous pouvez générer une telle liste en utilisant v4l2-ctl.
Exemple avec raspberryPi
$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
/dev/video10
/dev/video11
/dev/video12
bcm2835-isp (platform:bcm2835-isp):
/dev/video13
/dev/video14
/dev/video15
/dev/video16
BUFFALO BSW32KM03 USB PC Camera (usb-20980000.usb-1.3):
/dev/video0
/dev/video1
UVC Camera (046d:0825) (usb-20980000.usb-1.5):
/dev/video2
/dev/video3
Le point à noter ici est que la caméra a quelque chose comme (usb-20980000.usb-1.5)
.
Et cette partie de ʻusb-1.5` est liée au port USB physique ([Référence] 1).
Donc, si vous gardez la caméra Web branchée tout le temps, le numéro USB de cette caméra sera fixe, donc si vous utilisez le premier chemin (/ dev / video *
) écrit en dessous, l'image de la caméra ([L'autre est les métadonnées?] 2).
require "./video_paths"
VideoPaths.paths # => {"1.3"=>"/dev/video0", "1.5"=>"/dev/video2"}
require "memoist"
require "active_support/core_ext/object/blank"
class VideoPaths
USB_NUMBER_REG = /\.usb\-([\d\.]+)/
class << self
extend Memoist
def paths
new.to_h
end
memoize :paths
end
def initialize
@output = `v4l2-ctl --list-devices`
clean_output
end
def to_h
camera_names.to_h do |camera_name|
key, valid_path, *other_paths = group_by_camera_name[camera_name]
[extract_usb_number(camera_name), valid_path]
end
end
private
attr_reader :output
def group_by_camera_name
key = :not_yet
output.group_by do |line|
key = line if line.end_with?(":")
key
end
end
# BUFFALO BSW32KM03 USB PC Camera (usb-20980000.usb-1.3):
# ^^^^^^^^
def camera_names
group_by_camera_name.keys.select { |key| key.match?(/camera/i) }
end
# BUFFALO BSW32KM03 USB PC Camera (usb-20980000.usb-1.3):
# ^^^^^^^^
def extract_usb_number(camera_name)
camera_name.match(USB_NUMBER_REG)[1]
end
def clean_output
@output = output.lines.collect(&:strip).delete_if(&:blank?)
end
end
Recommended Posts