[LINUX] Wie überprüfe ich, welches / dev / video ist, wenn mehrere Webkameras eingesetzt sind?

Problem

Wenn Sie nur eine Webkamera einfügen möchten, sollten Sie diese normalerweise an / dev / video0 anschließen


$ fswebcam -d /dev/video0 a.jpg
#Oder standardmäßig/dev/Weil es video0 ist
$ fswebcam a.jpg

Wenn es jedoch zwei oder mehr gibt, ist es schwierig zu wissen, welche Kamera / dev / video0 oder 2 ist.

Lösungen

Sie können eine solche Liste mit v4l2-ctl ausgeben.

Beispiel mit 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

Der hier zu beachtende Punkt ist, dass die Kamera so etwas wie "(usb-20980000.usb-1.5)" hat. Und dieser USB-1.5-Teil ist an den physischen USB-Anschluss gebunden ([Referenz] 1).

Wenn Sie also die Webkamera ständig angeschlossen lassen, wird die USB-Nummer dieser Kamera festgelegt. Wenn Sie also den ersten Pfad (/ dev / video *) verwenden, der darunter geschrieben ist, das Bild der Kamera ([Das andere sind Metadaten?] 2).

Ein einfaches Ruby-Skript, das auf diesen basiert

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

Wie überprüfe ich, welches / dev / video ist, wenn mehrere Webkameras eingesetzt sind?
So schreiben Sie eine Zeichenfolge, wenn Python mehrere Zeilen enthält
So drehen Sie die for-Anweisung, wenn das Wörterbuch mehrere Werte für einen Schlüssel enthält
So überprüfen Sie, wann Sie keine Verbindung zum Server von python-memcached herstellen können
Wie man sich verbessert, wenn Spyders Editor in Mavericks sehr schwer ist