How to selecting a video4linux camera based on its serial number from gst-launch?
Henning Larsen
henning.e.larsen at gmail.com
Tue Mar 5 21:40:14 UTC 2024
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/20240229/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/20240229/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
> ***********************************************
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20240305/45bb44ba/attachment-0001.htm>
More information about the gstreamer-devel
mailing list