2 gleiche Kameras - wie für udev unterscheiden?

Du kommst mit der Installation nicht voran oder willst noch was nachfragen? Schau auch in den "Tipps und Tricks"-Bereich.
Antworten
raiuns
Beiträge: 350
Registriert: 19.06.2013 12:51:34

2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von raiuns » 29.11.2020 18:07:38

Schönen 1. Advent!

Ich habe hier einen Raspberry Pi mit debian buster, und daran stecken 2 USB-Kameras. Seriennummer, und Hersteller sind gleich, das einzig unterschiedliche ist der USB-Port, wo sie dranstecken.

Aber kann der sich auch ändern ohne unstecken?

Mein Problem ist, das beim booten mal die eine und mal die andere auf /dev/video0 und /dev/video2 landet, zufällig.

(Wie) kann man die udev-Regel an USB-steckplatz festmachen?
ASRock ION 330 Nettop (Intel Atom N330 1.6GHz, 2GB RAM, 320GB HDD, nVidia 9400-Ion)

gugus
Beiträge: 385
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von gugus » 29.11.2020 18:19:38

Servus
Schau Dir das mal an, sind die Ausgaben jeweils exakt gleich ?

Code: Alles auswählen

udevinfo -a -n /dev/video0
udevinfo -a -n /dev/video2
oder

Code: Alles auswählen

udevadm info --a --name /dev/video0
udevadm info --a --name /dev/video2
gruss

raiuns
Beiträge: 350
Registriert: 19.06.2013 12:51:34

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von raiuns » 29.11.2020 20:35:47

Sieht so aus:

https://pastebin.com/3NxkK8g2

Ich weiß eben nur nicht, welche Einträge beim Booten bestehen bleiben, und welche sich spontan ändern können.

Also ich werde sie immer an den gleichen USB-buchsen stecken lassen..
ASRock ION 330 Nettop (Intel Atom N330 1.6GHz, 2GB RAM, 320GB HDD, nVidia 9400-Ion)

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von detix » 30.11.2020 09:22:13

raiuns hat geschrieben: Also ich werde sie immer an den gleichen USB-buchsen stecken lassen.
Dann sollte doch ein zusätzlicher Eintrag in deinen udev-rules reichen:

Code: Alles auswählen

KERNELS=="1-1.5:1.0"
KERNELS=="1-1.4:1.0"
siehe auch hier:
https://unix.stackexchange.com/a/533464
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

raiuns
Beiträge: 350
Registriert: 19.06.2013 12:51:34

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von raiuns » 30.11.2020 18:46:02

Also wahrscheinlich habe ich was falsch verstanden, oder mir fehlt noch eine Angabe, jedenfalls sind die Kameras noch unverändert:

Ich habe in "/etc/udev/rules.d" eine Datei "60-usbvideo.rules" angelegt, mit diesem Inhalt:

KERNEL=="video?", KERNELS=="1-1.4:1.0", SUBSYSTEMS=="usb", SYMLINK+="video0"
KERNEL=="video?", KERNELS=="1-1.5:1.0", SUBSYSTEMS=="usb", SYMLINK+="video2"

Also was an 1-1.4 steckt soll /dev/video0 heißen und was an 1-1.5 steckt, soll /dev/video2 heißen

Danach udev gestoppt und gestartet - aber keine Änderung.

Fragen: wofür ist der Kernel-Paramter (der erste)? Und muss ich noch Action=add hinzufügen, auch wenn die Kameras immer stecken bleiben?
Was ist falsch?
ASRock ION 330 Nettop (Intel Atom N330 1.6GHz, 2GB RAM, 320GB HDD, nVidia 9400-Ion)

bitschubser
Beiträge: 67
Registriert: 14.02.2011 09:45:53

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von bitschubser » 01.12.2020 04:00:37

Hi
Action=add und Action=remove ist für's einstecken / abziehen gedacht.
Wehrend des Booten und starten deines Rechner wurde von udev deinen Kameras die NAME="video0" und NAME="video2" vergeben.
Somit müssen die Symlinks anders benannt werden wie z.B. SYMLINK+="USBKAMERA1".
Danach ein Neustart und die Links sollten unter /dev erreichbar sein.

raiuns
Beiträge: 350
Registriert: 19.06.2013 12:51:34

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von raiuns » 01.12.2020 09:22:16

bitschubser hat geschrieben: ↑ zum Beitrag ↑
01.12.2020 04:00:37
Wehrend des Booten und starten deines Rechner wurde von udev deinen Kameras die NAME="video0" und NAME="video2" vergeben.
Ach so.. und ich dachte, ich könnte mit den udev-Regeln gezielt beeinflussen, welche Kamera den Namen "video0" oder "video2" bekommt - ist das ein Verständnisfehler?
ASRock ION 330 Nettop (Intel Atom N330 1.6GHz, 2GB RAM, 320GB HDD, nVidia 9400-Ion)

bitschubser
Beiträge: 67
Registriert: 14.02.2011 09:45:53

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von bitschubser » 01.12.2020 13:32:13

Hi
Ja mit udev kannst du Einfluss auf das Verzeichnis /dev nehmen. Aber vielleicht nicht so wie gedacht.
Vor etlicher Zeit konnte man mit "NAME==" den Namen ändern, heute ist das nur noch bei Netzwerkkarten erlaubt.
NAME
The name to use for a network interface. See
systemd.link(5) for a higher-level mechanism
for setting the interface name. The name of a
device node cannot be changed by udev, only
additional symlinks can be created.
Ich benutze diese udev Regel z.B.

Code: Alles auswählen

SUBSYSTEMS=="scsi", KERNEL=="sdb", ATTRS{model}=="ZIP 100*", RUN+="/bin/mknod -m 660 /dev/sdb4 b 8 20", RUN+="/bin/chown root:floppy /dev/sdb4"
weil ich noch alte ZIP-Disk habe und mir das Gerät /dev/sdb4 fehlt, was ja richtig ist, da ja keine Diskkette eingelegt ist/wahr zum Systemstart.

Somit kannst du mal folgendes Probieren,

Code: Alles auswählen

SUBSYSTEMS=="usb", KERNELS=="1-1.4", ATTRS{idVendor}=="12d1", SYMLINK+="usbcam0"
SUBSYSTEMS=="usb", KERNELS=="1-1.5", ATTRS{idVendor}=="12d1", SYMLINK+="usbcam1"
Nachtrag,
du kannst auch mal mit SUBSYSTEM=="video4linux" probieren

raiuns
Beiträge: 350
Registriert: 19.06.2013 12:51:34

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von raiuns » 01.12.2020 14:06:51

Also ich bekomme 2 neue Symlinks, aber ich kann sie nicht als Kamera verwenden, aber ich sehe gerade, ich habe das Attr vergessen, ich probiere gleich nochmal. Stand bis jetzt:

Code: Alles auswählen

$ cat /etc/udev/rules.d/60-usbvideo.rules 
KERNELS=="1-1.4:1.0", SUBSYSTEMS=="usb", SYMLINK+="cam0"
KERNELS=="1-1.5:1.0", SUBSYSTEMS=="usb", SYMLINK+="cam2"

$ ls -la /dev/ca*
crw------- 1 root root 10, 63 Dec  1 12:53 /dev/cachefiles
lrwxrwxrwx 1 root root     12 Dec  1 12:53 /dev/cam0 -> input/event0
lrwxrwxrwx 1 root root     12 Dec  1 12:53 /dev/cam2 -> input/event1

$ ls -la /dev/vi*
crw-rw---- 1 root video 81,  0 Dec  1 12:53 /dev/video0
crw-rw---- 1 root video 81,  1 Dec  1 12:53 /dev/video1
crw-rw---- 1 root video 81,  8 Dec  1 12:53 /dev/video10
crw-rw---- 1 root video 81,  9 Dec  1 12:53 /dev/video11
crw-rw---- 1 root video 81, 10 Dec  1 12:53 /dev/video12
crw-rw---- 1 root video 81,  4 Dec  1 12:53 /dev/video13
crw-rw---- 1 root video 81,  5 Dec  1 12:53 /dev/video14
crw-rw---- 1 root video 81,  6 Dec  1 12:53 /dev/video15
crw-rw---- 1 root video 81,  7 Dec  1 12:53 /dev/video16
crw-rw---- 1 root video 81,  2 Dec  1 12:53 /dev/video2
crw-rw---- 1 root video 81,  3 Dec  1 12:53 /dev/video3

$ ffmpeg -i /dev/cam2 -t 8 -v "debug" test.mp4
ffmpeg version 4.1.6-1~deb10u1+rpt1 Copyright (c) 2000-2020 the FFmpeg developers
...
Opening an input file: /dev/cam2.
[NULL @ 0x1f5c1c0] Opening '/dev/cam2' for reading
[file @ 0x1f5c950] Setting default whitelist 'file,crypto'
/dev/cam2: Permission denied

ASRock ION 330 Nettop (Intel Atom N330 1.6GHz, 2GB RAM, 320GB HDD, nVidia 9400-Ion)

raiuns
Beiträge: 350
Registriert: 19.06.2013 12:51:34

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von raiuns » 01.12.2020 14:14:54

jetzt habe ich ATTR mit drin, aber dafür keine links mehr..?

Code: Alles auswählen

$ ls -la /dev/ca*
crw------- 1 root root 10, 63 Dec  1 13:09 /dev/cachefiles

$ cat /etc/udev/rules.d/60-usbvideo.rules 
KERNELS=="1-1.4:1.0", SUBSYSTEMS=="usb", ATTRS{idVendor}=="12d1", SYMLINK+="cam0"
KERNELS=="1-1.5:1.0", SUBSYSTEMS=="usb", ATTRS{idVendor}=="12d1", SYMLINK+="cam2"
Das ist aber auch was kompliziert.. :-) Was muss ich korrigieren?
ASRock ION 330 Nettop (Intel Atom N330 1.6GHz, 2GB RAM, 320GB HDD, nVidia 9400-Ion)

Benutzeravatar
Tintom
Moderator
Beiträge: 3066
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von Tintom » 01.12.2020 14:25:47

Wenn du es so schreibst muss es anstelle von SUBSYSTEMS dann SUBSYSTEM=="video4linux" heißen.

raiuns
Beiträge: 350
Registriert: 19.06.2013 12:51:34

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von raiuns » 01.12.2020 14:36:25

hilft nicht.. welcher Parameter muss denn womit übereinstimmen? Bzw. wie kann ich noch debuggen? So sieht es jetzt aus

Code: Alles auswählen

$ ls -la /dev/ca*
crw------- 1 root root 10, 63 Dec  1 13:27 /dev/cachefiles

$ cat /etc/udev/rules.d/60-usbvideo.rules 
KERNELS=="1-1.4:1.0", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="12d1", SYMLINK+="cam0"
KERNELS=="1-1.5:1.0", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="12d1", SYMLINK+="cam2"
ASRock ION 330 Nettop (Intel Atom N330 1.6GHz, 2GB RAM, 320GB HDD, nVidia 9400-Ion)

Benutzeravatar
Tintom
Moderator
Beiträge: 3066
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von Tintom » 01.12.2020 14:43:07

Subsystem muss al erstes stehen
EDIT: Du mixt jetzt mit KERNELS und ATTRS Attribute von zwei verschiedenen parent devices. Das ist imho nicht möglich. Nimm die ATTRS-Regel raus, die ist eh als Unterscheidungskriterium ungeeignet.

raiuns
Beiträge: 350
Registriert: 19.06.2013 12:51:34

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von raiuns » 01.12.2020 15:15:42

Jetzt sieht es wieder anders (besser) aus, aber ich kann damit noch nicht filmen - was feht jetzt noch? Ist doch so gemeint, dass ich dann den symlink verwende, oder?:

Code: Alles auswählen

$ ls -la /dev/ca*
crw------- 1 root root 10, 63 Dec  1 14:02 /dev/cachefiles
lrwxrwxrwx 1 root root      6 Dec  1 14:02 /dev/cam0 -> video0
lrwxrwxrwx 1 root root      6 Dec  1 14:02 /dev/cam2 -> video2

$ cat /etc/udev/rules.d/60-usbvideo.rules 
SUBSYSTEM=="video4linux", KERNELS=="1-1.4:1.0", SYMLINK+="cam0"
SUBSYSTEM=="video4linux", KERNELS=="1-1.5:1.0", SYMLINK+="cam2"

$ ffmpeg -i /dev/cam2 -t 8 -v "debug" video/test.mp4
ffmpeg version 4.1.6-1~deb10u1+rpt1 Copyright (c) 2000-2020 the FFmpeg developers
...
...
Splitting the commandline.
Reading option '-i' ... matched as input url with argument '/dev/cam2'.
Reading option '-t' ... matched as option 't' (record or transcode "duration" seconds of audio/video) with argument '8'.
Reading option '-v' ... matched as option 'v' (set logging level) with argument 'debug'.
Reading option 'video/test.mp4' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option v (set logging level) with argument debug.
Successfully parsed a group of options.
Parsing a group of options: input url /dev/cam2.
Successfully parsed a group of options.
Opening an input file: /dev/cam2.
[NULL @ 0x18281c0] Opening '/dev/cam2' for reading
[file @ 0x1828950] Setting default whitelist 'file,crypto'
[AVIOContext @ 0x1830b20] Statistics: 0 bytes read, 0 seeks
/dev/cam2: Invalid argument
ASRock ION 330 Nettop (Intel Atom N330 1.6GHz, 2GB RAM, 320GB HDD, nVidia 9400-Ion)

Benutzeravatar
Tintom
Moderator
Beiträge: 3066
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von Tintom » 01.12.2020 15:21:42

Hast du das richtige Gerät verwendet? Also funktioniert es wenn du direkt auf die Datei anstatt auf den Symlink zugreifst?

raiuns
Beiträge: 350
Registriert: 19.06.2013 12:51:34

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von raiuns » 01.12.2020 15:33:42

Ich denke schon - also wenn ich in dieser Programmzeile statt /dev/cam2
/dev/video0 oder /dev/video2 einsetze, dann bekomme ich ein Video:

Code: Alles auswählen

$ ffmpeg -i /dev/cam2 -t 8 -v "debug" video/test.mp4
und zugeordnet sollte auch richtig sein:

Code: Alles auswählen

$ ls -la /dev/cam*
lrwxrwxrwx 1 root root 6 Dec  1 14:02 /dev/cam0 -> video0
lrwxrwxrwx 1 root root 6 Dec  1 14:02 /dev/cam2 -> video2
Vielleicht funktioniert das udev jetzt, aber ffmpeg kann mit den Symlinks nicht umgehen?
ASRock ION 330 Nettop (Intel Atom N330 1.6GHz, 2GB RAM, 320GB HDD, nVidia 9400-Ion)

raiuns
Beiträge: 350
Registriert: 19.06.2013 12:51:34

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von raiuns » 02.12.2020 10:33:00

Ich habe jetzt noch ein paar mal gebootet, und die Zuordnung scheint nun stabil.

Für ffmpeg werde ich einen extra Thread aufmachen. Danke an alle.
ASRock ION 330 Nettop (Intel Atom N330 1.6GHz, 2GB RAM, 320GB HDD, nVidia 9400-Ion)

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von detix » 02.12.2020 15:45:10

raiuns hat geschrieben:Vielleicht funktioniert das udev jetzt, aber ffmpeg kann mit den Symlinks nicht umgehen?
Bei meinen Versuchen mit einer Mikroskopkamera musste ich leider auch feststellen das hier keiner der in irgendeiner Art und Weise erzeugten Symlinks funktioniert, weder mit ffmpeg, vlc, smplayer oder mpv.
Jeder erstellte SYMLINK hat volle Zugriffsrechte, dennoch ist darüber nichts zu sehen/aufzunehmen...
Abhilfe schafften ein paar Zeilen Skript in der $HOME/.bashrc, bei dir vielleicht so:

Code: Alles auswählen

for i in $(ls /dev/video*); do
    Knl=$(udevadm info -a $i | awk -F'"' '/KERNEL/{print $2}')
    Vid=$(echo $Knl | awk '{print $1}')
    VNr=$(echo $Knl | awk '{print $2}')
    case $VNr in
        "1-1.5:1.0") export cam0=/dev/$Vid;;
        "1-1.4:1.0") export cam1=/dev/$Vid;;
    esac
done
Schau halt ob die awk-Ausgaben mit den gewünschten Links bei dir übereinstimmen und dieses wäre dauerhaft,
dann sollte die ausgewählte Kamera auch immer so ansprechbar sein: ffmpeg -i cam0 oder cam1
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

raiuns
Beiträge: 350
Registriert: 19.06.2013 12:51:34

Re: 2 gleiche Kameras - wie für udev unterscheiden?

Beitrag von raiuns » 03.12.2020 08:43:33

Vielen Dank für das Script!

Wenn meine Zuordnung jetzt nicht stabil bleibt, werde ich es so probieren.
ASRock ION 330 Nettop (Intel Atom N330 1.6GHz, 2GB RAM, 320GB HDD, nVidia 9400-Ion)

Antworten