How to selecting a video4linux camera based on its serial number from gst-launch?

jam jam at tigger.ws
Wed Mar 6 02:51:14 UTC 2024


Naw Wurries 
I'm glad you have a solution
But as I recall you can set permissions with udev

Cheers
James

(The salutation is Aussie speak !)

On Wednesday, March 6, 2024 5:40:14 AM AWST Henning Larsen via gstreamer-devel 
wrote:
> Thanks James
> for suggesting to use udev rules to map specific cameras to specific device
> names.
> It is certainly powerful and flexible as it can filter on numerous
> attributes. But as often - this comes with a cost of bigger complexity. And
> sure enough it does not work for me. I will go back to use the
> /dev/v4l/by-id/... which worked with no problem.
> In case someone is interested, below is what I have tried and failed. But
> as mentioned I am ok with the by-id solution.
> Thanks for your help.
> Henning
> 
> I did manage to create a /dev/video_53112 using this rule
> *SUBSYSTEM=="usb", ATTR{serial}=="53112", ATTR{idVendor}=="09cb",
> ATTR{idProduct}=="4007", SYMLINK+="video_53112"*
> in a file with this path
> */etc/udev/20-uvc-cam-mappings.rules*
> to activate the rule - called $ sudo udevadm trigger
> 
> Unfortunately the command and response I get when testing is
> hl at pi92:/dev $ gst-launch-1.0 -v v4l2src device=/dev/video_53112 !
> videoconvert ! autovideosink
> Setting pipeline to PAUSED ...
> ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Could not
> open device '/dev/video_53112' for reading and writing.
> Additional debug info:
> ../sys/v4l2/v4l2_calls.c(622): gst_v4l2_open ():
> /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
> system error: Permission denied
> ERROR: pipeline doesn't want to preroll.
> Failed to set pipeline to PAUSED.
> Setting pipeline to NULL ...
> Freeing pipeline ...
> 
> Message: 1
> 
> > Date: Fri, 1 Mar 2024 05:29:33 +0800
> > From: James Linder <jam at tigger.ws>
> > To: Discussion of the development of and with GStreamer
> > 
> >         <gstreamer-devel at lists.freedesktop.org>
> > 
> > Subject: Re: How to selecting a video4linux camera based on its serial
> > 
> >         number from gst-launch?
> > 
> > Message-ID: <9EB716AD-D8C3-41EF-9243-43B52907A32F at tigger.ws>
> > Content-Type: text/plain;       charset=utf-8
> > 
> > > On Mar 1, 2024, at 03:39, Henning Larsen via gstreamer-devel <
> > 
> > gstreamer-devel at lists.freedesktop.org> wrote:
> > > A command like this launches /dev/video0
> > > gst-launch-1.0 -v v4l2src device=/dev/video0 ! videoconvert !
> > 
> > autovideosink
> > 
> > > But when you have multiple cameras and they are enumerated in a random
> > 
> > order you usually need to be able to identify each camera on - say its
> > serial number.
> > 
> > > It is easy to find the serial number including many other properties
> > 
> > using the command
> > 
> > > $udevadm info /dev/video0
> > > The serial number for example, would be called
> > > ID_SERIAL_SHORT=12345
> > > 
> > > How to use this serial number in the gst-launch string instead of the
> > 
> > /dev/videoX id?
> > 
> > > I tried
> > > gst-launch-1.0 -v v4l2src device=$(python find_camera_by_sn.py 12345) !
> > 
> > videoconvert ! autovideosink
> > 
> > > And it works - inside a shell, but not inside a MediaMTX.yml
> > 
> > configuration file, and I need it to work there. I suspect it is because
> > it
> > does not support the shell command. In any case it is not an elegant
> > method
> > - better to stick with what is provided by gstreamer - if possible.
> > 
> > > I would think this must be a fairly common issue so does there exist a
> > 
> > plugin/filter for gstreamer to achieve this device selection based on a
> > specific property?
> > 
> > I?d totally isolate the problem by using udev to ensure camera A was
> > always video0, B was (whatever is next ie video1, video4)
> > Then gstreamer always uses videoN
> > 
> > James
> > 
> > PS udev rules allow you to choose SN or Bus ID or ...
> > 
> > ------------------------------
> > 
> > Message: 2
> > Date: Thu, 29 Feb 2024 23:29:11 +0100
> > From: Henning Larsen <henning.e.larsen at gmail.com>
> > To: gstreamer-devel at lists.freedesktop.org
> > Subject: Re: How to selecting a video4linux camera based on its serial
> > 
> >         number from gst-launch?
> > 
> > Message-ID:
> >         <
> > 
> > CANhudML-9_+Qm2748EwEM+iQyLh3gVLV-Ybzy-8AuFz9iai3pw at mail.gmail.com>
> > Content-Type: text/plain; charset="utf-8"
> > 
> > Hej Peter, Hi Nicolas
> > Thank you so much for your swift replies.
> > 
> > I have only tested Peter's suggestion so far and it works nicely!
> > 
> > So to recap for other readers - the command used is
> > gst-launch-1.0 v4l2src
> > device=/dev/v4l/by-id/usb-FLIR_Boson_53112-video-index0 ! videoconvert !
> > autovideosink
> > where the device path obviously will vary on the last part.
> > It also works in the MediaMTX.yml context, albeit with an encoding element
> > downstream of the device.
> > The device string is unique for this camera - which is what I needed.
> > 
> > Again Thanks for your help - it is very appreciated!
> > I will investigate Nicolas' suggestion later.
> > br henning
> > 
> > I found a small heads-up:
> > Dont do
> > $cd /dev/v4l/
> > and investigate the devices while testing plugging and unplugging because
> > the folder gets deleted if there are no devices. The result is that the
> > shell $ls shows an empty folder.
> > So do $cd .. out and back in and it gets populated.
> > Bottom line - list devices from outside the folder and you'll be good
> > 
> > 
> > ------------------------------
> > 
> > > Message: 2
> > > Date: Thu, 29 Feb 2024 21:58:31 +0100
> > > From: Peter Maersk-Moller <pmaersk at gmail.com>
> > > To: Discussion of the development of and with GStreamer
> > > 
> > >         <gstreamer-devel at lists.freedesktop.org>
> > > 
> > > Subject: Re: How to selecting a video4linux camera based on its serial
> > > 
> > >         number from gst-launch?
> > > 
> > > Message-ID:
> > >         <
> > > 
> > > CAGf_jGnQ6sXm2Lpwp-HTXt8AfA2-OSyMjesX_9mGr9iu08fU2g at mail.gmail.com>
> > > Content-Type: text/plain; charset="utf-8"
> > > 
> > > Hi Henning.
> > > 
> > > Try take a look into /dev/v4l/by-id/ directory. Maybe you can use the id
> > > there to obtain the functionality you want.
> > > 
> > > Regards
> > > Peter Maersk-Moeller
> > > 
> > > On Thu, Feb 29, 2024 at 8:39?PM Henning Larsen via gstreamer-devel <
> > > 
> > > gstreamer-devel at lists.freedesktop.org> wrote:
> > > > A command like this launches /dev/video0
> > > > *gst-launch-1.0 -v v4l2src device=/dev/video0 ! videoconvert !
> > > > autovideosink*
> > > > But when you have multiple cameras and they are enumerated in a random
> > > > order you usually need to be able to identify each camera on - say its
> > > > serial number.
> > > > 
> > > > It is easy to find the serial number including many other properties
> > > 
> > > using
> > > 
> > > > the command
> > > > *$udevadm info /dev/video0*
> > > > The serial number for example, would be called
> > > > ID_SERIAL_SHORT=12345
> > > > 
> > > > *How to use this serial number in the gst-launch string instead of the
> > > > /dev/videoX id?*
> > > > 
> > > > I tried
> > > > *gst-launch-1.0 -v v4l2src device=$(python find_camera_by_sn.py 12345)
> > 
> > !
> > 
> > > > videoconvert ! autovideosink*
> > > > And it works - inside a shell, but *not *inside a MediaMTX.yml
> > > > <https://github.com/bluenviron/mediamtx>configuration file, and I need
> > > 
> > > it
> > > 
> > > > to work there. I suspect it is because it does not support the shell
> > > > command. In any case it is not an elegant method - better to stick
> > > > with
> > > > what is provided by gstreamer - if possible.
> > > > 
> > > > I would think this must be a fairly common issue so *does there exist
> > > > a
> > > > plugin/filter for gstreamer to achieve this device selection based on
> > > > a
> > > > specific property?*
> > > > 
> > > > Any hints are appreciated.
> > > > Thanks
> > > > henning
> > > > 
> > > > 
> > > > *Should someone need it: This is the python code find_camera_by_sn.py*
> > > > import sys
> > > > import pyudev
> > > > 
> > > > def find_camera_by_serial(serial):
> > > >     context = pyudev.Context()
> > > >     
> > > >     for device in context.list_devices(subsystem='video4linux'):
> > > >         if 'ID_SERIAL_SHORT' in device.properties:
> > > >             if device.properties['ID_SERIAL_SHORT'] == serial:
> > > >                 return device.device_node
> > > >     
> > > >     return None
> > > > 
> > > > if __name__ == '__main__':
> > > >     # Example: Find camera with serial number 'ABC123'
> > > >     # manual command to list video4linux cameras
> > > >     # udevadm info /dev/video0,   etc for 0,1,,3
> > > >     default_dev = "/dev/video0"
> > > >     
> > > >     if len(sys.argv) == 2:
> > > >         camera_device = find_camera_by_serial(sys.argv[1])
> > > >         
> > > >         if camera_device:
> > > >             print(camera_device)
> > > >         
> > > >         else:
> > > >             print(default_dev)
> > > >     
> > > >     else:
> > > >         print(default_dev)
> > > 
> > > -------------- next part --------------
> > > An HTML attachment was scrubbed...
> > > URL: <
> > 
> > https://lists.freedesktop.org/archives/gstreamer-devel/attachments/2024022
> > 9/918560c3/attachment-0001.htm> 
> > > ------------------------------
> > > 
> > > Message: 3
> > > Date: Thu, 29 Feb 2024 16:10:22 -0500
> > > From: Nicolas Dufresne <nicolas at ndufresne.ca>
> > > To: Discussion of the development of and with GStreamer
> > > 
> > >         <gstreamer-devel at lists.freedesktop.org>
> > > 
> > > Cc: Henning Larsen <henning.e.larsen at gmail.com>
> > > Subject: Re: How to selecting a video4linux camera based on its serial
> > > 
> > >         number from gst-launch?
> > > 
> > > Message-ID:
> > >         <3490e94f2d7bb015e9559e1eed676d368263fed4.camel at ndufresne.ca>
> > > 
> > > Content-Type: text/plain; charset="utf-8"
> > > 
> > > Hi,
> > > 
> > > Le jeudi 29 f?vrier 2024 ? 20:39 +0100, Henning Larsen via
> > 
> > gstreamer-devel
> > 
> > > a
> > > 
> > > ?crit?:
> > > > A command like this launches /dev/video0
> > > > gst-launch-1.0 -v v4l2src device=/dev/video0 ! videoconvert !
> > > 
> > > autovideosink
> > > 
> > > > But when you have multiple cameras and they are enumerated in a random
> > > 
> > > order
> > > 
> > > > you usually need to be able to identify?each camera on - say its
> > > > serial
> > > > number.
> > > > 
> > > > It is easy to find the serial number including many other properties
> > > 
> > > using the
> > > 
> > > > command
> > > > $udevadm info /dev/video0
> > > > The serial number for example, would be called?
> > > > ID_SERIAL_SHORT=12345
> > > 
> > > In the UVC space, were cheap Chinese market too over, you'll quickly
> > > find
> > > that
> > > serial number can be unreliable. You may have 0, or the same serial for
> > > all cams
> > > of the same model/brand. libcamera made up a proper ID generator, though
> > > it will
> > > change if you change the actual USB port.
> > > 
> > > > How to use this serial number in the gst-launch string instead of the
> > > > /dev/videoX id?
> > > 
> > > Its not support directly. Instead, we offer a tool (for software to use)
> > > that is
> > > called GstDeviceMonitor, and V4L2 plugin offer a matching
> > > DeviceProvider.
> > > There
> > > is a command line to excersize that tool:
> > > 
> > > gst-device-monitor-1.0 Video/Source
> > > Device found:
> > > 
> > > name : Integrated Camera: Integrated C
> > > class : Video/Source
> > > caps : video/x-raw, format=YUY2, width=1280, height=720,
> > > pixel-aspect-ratio=1/1,
> > > framerate=10/1
> > > video/x-raw, format=YUY2, width=960, height=540, pixel-aspect-ratio=1/1,
> > > framerate=15/1
> > > video/x-raw, format=YUY2, width=848, height=480, pixel-aspect-ratio=1/1,
> > > framerate=20/1
> > > video/x-raw, format=YUY2, width=640, height=480, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > video/x-raw, format=YUY2, width=640, height=360, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > video/x-raw, format=YUY2, width=424, height=240, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > video/x-raw, format=YUY2, width=352, height=288, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > video/x-raw, format=YUY2, width=320, height=240, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > video/x-raw, format=YUY2, width=320, height=180, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > image/jpeg, parsed=true, width=1280, height=720, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > image/jpeg, parsed=true, width=960, height=540, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > image/jpeg, parsed=true, width=848, height=480, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > image/jpeg, parsed=true, width=640, height=480, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > image/jpeg, parsed=true, width=640, height=360, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > image/jpeg, parsed=true, width=424, height=240, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > image/jpeg, parsed=true, width=352, height=288, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > image/jpeg, parsed=true, width=320, height=240, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > image/jpeg, parsed=true, width=320, height=180, pixel-aspect-ratio=1/1,
> > > framerate=30/1
> > > properties:
> > > udev-probed = true
> > > device.bus_path = pci-0000:05:00.4-usb-0:2.1:1.0
> > > sysfs.path =
> > > /sys/devices/pci0000:00/0000:00:08.1/0000:05:00.4/usb4/4-2/4-2.1/4-
> > > 2.1:1.0/video4linux/video0
> > > device.bus = usb
> > > device.subsystem = video4linux
> > > device.vendor.id = 04ca
> > > device.vendor.name = 8SSC20F27068L1GZ9AN7T85
> > > device.product.id = 7070
> > > device.product.name = Integrated Camera: Integrated C
> > > device.serial = 8SSC20F27068L1GZ9AN7T85_Integrated_Camera
> > > device.capabilities = :capture:
> > > device.api = v4l2
> > > device.path = /dev/video0
> > > v4l2.device.driver = uvcvideo
> > > v4l2.device.card = Integrated Camera: Integrated C
> > > v4l2.device.bus_info = usb-0000:05:00.4-2.1
> > > v4l2.device.version = 395013 (0x00060705)
> > > v4l2.device.capabilities = 2225078273 (0x84a00001)
> > > v4l2.device.device_caps = 69206017 (0x04200001)
> > > gst-launch-1.0 v4l2src ! ...
> > > 
> > > 
> > > When programming the returned Device, can be use to create and configure
> > > the
> > > source element correctly, without having to know about the device
> > > property. You
> > > can see that it also provides bunch of information imported from udev,
> > > including
> > > the serial number if that is what you want to use. An alternative is to
> > > install
> > > libcamera with the gstreamer element, in there the camera names are
> > 
> > unique
> > 
> > > and
> > > reusable. The other options is to create udev rules that alias you
> > > camera
> > > device
> > > names to a unique name instead of the auto-generated one.
> > > 
> > > Nicolas
> > 
> > -------------- next part --------------
> > An HTML attachment was scrubbed...
> > URL: <
> > https://lists.freedesktop.org/archives/gstreamer-devel/attachments/2024022
> > 9/bd1a4a5c/attachment-0001.htm
> > 
> > 
> > ------------------------------
> > 
> > Subject: Digest Footer
> > 
> > _______________________________________________
> > gstreamer-devel mailing list
> > gstreamer-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
> > 
> > 
> > ------------------------------
> > 
> > End of gstreamer-devel Digest, Vol 158, Issue 1
> > ***********************************************






More information about the gstreamer-devel mailing list