Comment vérifier quel est / dev / video ?? lorsque plusieurs caméras Web sont insérées

problème

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.

Solution

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).

Un simple script ruby basé sur ces

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

Comment vérifier quel est / dev / video ?? lorsque plusieurs caméras Web sont insérées
Comment écrire une chaîne de caractères lorsqu'il y a plusieurs lignes en python
Comment activer l'instruction for lorsqu'il existe plusieurs valeurs pour une clé dans le dictionnaire
Comment vérifier quand le serveur python-memcached n'a pas pu être connecté
Comment s'améliorer lorsque l'éditeur de Spyder est très lourd dans Mavericks