<div dir="ltr"><div dir="ltr"><br></div><div class="gmail_quote"><div>Hej Peter, Hi Nicolas</div><div>Thank you so much for your swift replies.</div><div><br></div><div>I have only tested Peter's suggestion so far and it works nicely!</div><div><br></div><div>So to recap for other readers - the command used is</div><div>gst-launch-1.0 v4l2src device=/dev/v4l/by-id/usb-FLIR_Boson_53112-video-index0 ! videoconvert ! autovideosink<br></div><div>where the device path obviously will vary on the last part.</div><div>It also works in the MediaMTX.yml context, albeit with an encoding element downstream of the device. </div><div>The device string is unique for this camera - which is what I needed.</div><div><br></div><div>Again Thanks for your help - it is very appreciated!<br></div><div>I will investigate Nicolas' suggestion later.</div><div>br henning</div><div><br></div><div><div>I found a small heads-up:</div><div>Dont do </div><div>$cd /dev/v4l/</div><div>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.</div><div>So do $cd .. out and back in and it gets populated. </div><div>Bottom line - list devices from outside the folder and you'll be good</div><div><br></div></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">------------------------------<br>
<br>
Message: 2<br>
Date: Thu, 29 Feb 2024 21:58:31 +0100<br>
From: Peter Maersk-Moller <<a href="mailto:pmaersk@gmail.com" target="_blank">pmaersk@gmail.com</a>><br>
To: Discussion of the development of and with GStreamer<br>
        <<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank">gstreamer-devel@lists.freedesktop.org</a>><br>
Subject: Re: How to selecting a video4linux camera based on its serial<br>
        number from gst-launch?<br>
Message-ID:<br>
        <<a href="mailto:CAGf_jGnQ6sXm2Lpwp-HTXt8AfA2-OSyMjesX_9mGr9iu08fU2g@mail.gmail.com" target="_blank">CAGf_jGnQ6sXm2Lpwp-HTXt8AfA2-OSyMjesX_9mGr9iu08fU2g@mail.gmail.com</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Hi Henning.<br>
<br>
Try take a look into /dev/v4l/by-id/ directory. Maybe you can use the id<br>
there to obtain the functionality you want.<br>
<br>
Regards<br>
Peter Maersk-Moeller<br>
<br>
On Thu, Feb 29, 2024 at 8:39?PM Henning Larsen via gstreamer-devel <<br>
<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank">gstreamer-devel@lists.freedesktop.org</a>> wrote:<br>
<br>
> A command like this launches /dev/video0<br>
> *gst-launch-1.0 -v v4l2src device=/dev/video0 ! videoconvert !<br>
> autovideosink*<br>
> But when you have multiple cameras and they are enumerated in a random<br>
> order you usually need to be able to identify each camera on - say its<br>
> serial number.<br>
><br>
> It is easy to find the serial number including many other properties using<br>
> the command<br>
> *$udevadm info /dev/video0*<br>
> The serial number for example, would be called<br>
> ID_SERIAL_SHORT=12345<br>
><br>
> *How to use this serial number in the gst-launch string instead of the<br>
> /dev/videoX id?*<br>
><br>
> I tried<br>
> *gst-launch-1.0 -v v4l2src device=$(python find_camera_by_sn.py 12345) !<br>
> videoconvert ! autovideosink*<br>
> And it works - inside a shell, but *not *inside a MediaMTX.yml<br>
> <<a href="https://github.com/bluenviron/mediamtx" rel="noreferrer" target="_blank">https://github.com/bluenviron/mediamtx</a>>configuration file, and I need it<br>
> to work there. I suspect it is because it does not support the shell<br>
> command. In any case it is not an elegant method - better to stick with<br>
> what is provided by gstreamer - if possible.<br>
><br>
> I would think this must be a fairly common issue so *does there exist a<br>
> plugin/filter for gstreamer to achieve this device selection based on a<br>
> specific property?*<br>
><br>
> Any hints are appreciated.<br>
> Thanks<br>
> henning<br>
><br>
><br>
> *Should someone need it: This is the python code find_camera_by_sn.py*<br>
> import sys<br>
> import pyudev<br>
><br>
> def find_camera_by_serial(serial):<br>
>     context = pyudev.Context()<br>
>     for device in context.list_devices(subsystem='video4linux'):<br>
>         if 'ID_SERIAL_SHORT' in device.properties:<br>
>             if device.properties['ID_SERIAL_SHORT'] == serial:<br>
>                 return device.device_node<br>
>     return None<br>
><br>
> if __name__ == '__main__':<br>
>     # Example: Find camera with serial number 'ABC123'<br>
>     # manual command to list video4linux cameras<br>
>     # udevadm info /dev/video0,   etc for 0,1,,3<br>
>     default_dev = "/dev/video0"<br>
>     if len(sys.argv) == 2:<br>
>         camera_device = find_camera_by_serial(sys.argv[1])<br>
>         if camera_device:<br>
>             print(camera_device)<br>
>         else:<br>
>             print(default_dev)<br>
>     else:<br>
>         print(default_dev)<br>
><br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <<a href="https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20240229/918560c3/attachment-0001.htm" rel="noreferrer" target="_blank">https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20240229/918560c3/attachment-0001.htm</a>><br>
<br>
------------------------------<br>
<br>
Message: 3<br>
Date: Thu, 29 Feb 2024 16:10:22 -0500<br>
From: Nicolas Dufresne <<a href="mailto:nicolas@ndufresne.ca" target="_blank">nicolas@ndufresne.ca</a>><br>
To: Discussion of the development of and with GStreamer<br>
        <<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank">gstreamer-devel@lists.freedesktop.org</a>><br>
Cc: Henning Larsen <<a href="mailto:henning.e.larsen@gmail.com" target="_blank">henning.e.larsen@gmail.com</a>><br>
Subject: Re: How to selecting a video4linux camera based on its serial<br>
        number from gst-launch?<br>
Message-ID:<br>
        <<a href="mailto:3490e94f2d7bb015e9559e1eed676d368263fed4.camel@ndufresne.ca" target="_blank">3490e94f2d7bb015e9559e1eed676d368263fed4.camel@ndufresne.ca</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Hi,<br>
<br>
Le jeudi 29 f?vrier 2024 ? 20:39 +0100, Henning Larsen via gstreamer-devel a<br>
?crit?:<br>
> A command like this launches /dev/video0<br>
> gst-launch-1.0 -v v4l2src device=/dev/video0 ! videoconvert ! autovideosink<br>
> But when you have multiple cameras and they are enumerated in a random order<br>
> you usually need to be able to identify?each camera on - say its serial<br>
> number.<br>
> <br>
> It is easy to find the serial number including many other properties using the<br>
> command<br>
> $udevadm info /dev/video0<br>
> The serial number for example, would be called?<br>
> ID_SERIAL_SHORT=12345<br>
<br>
In the UVC space, were cheap Chinese market too over, you'll quickly find that<br>
serial number can be unreliable. You may have 0, or the same serial for all cams<br>
of the same model/brand. libcamera made up a proper ID generator, though it will<br>
change if you change the actual USB port.<br>
<br>
> How to use this serial number in the gst-launch string instead of the<br>
> /dev/videoX id?<br>
<br>
Its not support directly. Instead, we offer a tool (for software to use) that is<br>
called GstDeviceMonitor, and V4L2 plugin offer a matching DeviceProvider. There<br>
is a command line to excersize that tool:<br>
<br>
gst-device-monitor-1.0 Video/Source<br>
Device found:<br>
<br>
name : Integrated Camera: Integrated C<br>
class : Video/Source<br>
caps : video/x-raw, format=YUY2, width=1280, height=720, pixel-aspect-ratio=1/1,<br>
framerate=10/1<br>
video/x-raw, format=YUY2, width=960, height=540, pixel-aspect-ratio=1/1,<br>
framerate=15/1<br>
video/x-raw, format=YUY2, width=848, height=480, pixel-aspect-ratio=1/1,<br>
framerate=20/1<br>
video/x-raw, format=YUY2, width=640, height=480, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
video/x-raw, format=YUY2, width=640, height=360, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
video/x-raw, format=YUY2, width=424, height=240, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
video/x-raw, format=YUY2, width=352, height=288, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
video/x-raw, format=YUY2, width=320, height=240, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
video/x-raw, format=YUY2, width=320, height=180, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
image/jpeg, parsed=true, width=1280, height=720, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
image/jpeg, parsed=true, width=960, height=540, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
image/jpeg, parsed=true, width=848, height=480, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
image/jpeg, parsed=true, width=640, height=480, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
image/jpeg, parsed=true, width=640, height=360, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
image/jpeg, parsed=true, width=424, height=240, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
image/jpeg, parsed=true, width=352, height=288, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
image/jpeg, parsed=true, width=320, height=240, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
image/jpeg, parsed=true, width=320, height=180, pixel-aspect-ratio=1/1,<br>
framerate=30/1<br>
properties:<br>
udev-probed = true<br>
device.bus_path = pci-0000:05:00.4-usb-0:2.1:1.0<br>
sysfs.path = /sys/devices/pci0000:00/0000:00:08.1/0000:05:00.4/usb4/4-2/4-2.1/4-<br>
2.1:1.0/video4linux/video0<br>
device.bus = usb<br>
device.subsystem = video4linux<br>
<a href="http://device.vendor.id" rel="noreferrer" target="_blank">device.vendor.id</a> = 04ca<br>
<a href="http://device.vendor.name" rel="noreferrer" target="_blank">device.vendor.name</a> = 8SSC20F27068L1GZ9AN7T85<br>
<a href="http://device.product.id" rel="noreferrer" target="_blank">device.product.id</a> = 7070<br>
<a href="http://device.product.name" rel="noreferrer" target="_blank">device.product.name</a> = Integrated Camera: Integrated C<br>
device.serial = 8SSC20F27068L1GZ9AN7T85_Integrated_Camera<br>
device.capabilities = :capture:<br>
device.api = v4l2<br>
device.path = /dev/video0<br>
v4l2.device.driver = uvcvideo<br>
v4l2.device.card = Integrated Camera: Integrated C<br>
v4l2.device.bus_info = usb-0000:05:00.4-2.1<br>
v4l2.device.version = 395013 (0x00060705)<br>
v4l2.device.capabilities = 2225078273 (0x84a00001)<br>
v4l2.device.device_caps = 69206017 (0x04200001)<br>
gst-launch-1.0 v4l2src ! ...<br>
<br>
<br>
When programming the returned Device, can be use to create and configure the<br>
source element correctly, without having to know about the device property. You<br>
can see that it also provides bunch of information imported from udev, including<br>
the serial number if that is what you want to use. An alternative is to install<br>
libcamera with the gstreamer element, in there the camera names are unique and<br>
reusable. The other options is to create udev rules that alias you camera device<br>
names to a unique name instead of the auto-generated one.<br>
<br>
Nicolas<br><br>
</blockquote></div></div>