<div dir="ltr"><div dir="ltr"><br></div>Thanks James <div>for suggesting to use udev rules to map specific cameras to specific device names.<div>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.</div><div>In case someone is interested, below is what I have tried and failed. But as mentioned I am ok with the by-id solution.</div><div>Thanks for your help.</div><div>Henning</div><div><br></div><div>I did manage to create a /dev/video_53112 using this rule </div><div><b>SUBSYSTEM=="usb", ATTR{serial}=="53112", ATTR{idVendor}=="09cb", ATTR{idProduct}=="4007", SYMLINK+="video_53112"</b><br></div><div>in a file with this path</div><div><b>/etc/udev/20-uvc-cam-mappings.rules</b><br><div class="gmail_quote"><div>to activate the rule - called $ sudo udevadm trigger   </div><div><br></div><div>Unfortunately the command and response I get when testing is</div><div>hl@pi92:/dev $ gst-launch-1.0 -v v4l2src device=/dev/video_53112 ! videoconvert ! autovideosink<br>Setting pipeline to PAUSED ...<br>ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Could not open device '/dev/video_53112' for reading and writing.<br>Additional debug info:<br>../sys/v4l2/v4l2_calls.c(622): gst_v4l2_open (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:<br>system error: Permission denied<br>ERROR: pipeline doesn't want to preroll.<br>Failed to set pipeline to PAUSED.<br>Setting pipeline to NULL ...<br>Freeing pipeline ...<br></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">
Message: 1<br>
Date: Fri, 1 Mar 2024 05:29:33 +0800<br>
From: James Linder <<a href="mailto:jam@tigger.ws" target="_blank">jam@tigger.ws</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: <<a href="mailto:9EB716AD-D8C3-41EF-9243-43B52907A32F@tigger.ws" target="_blank">9EB716AD-D8C3-41EF-9243-43B52907A32F@tigger.ws</a>><br>
Content-Type: text/plain;       charset=utf-8<br>
<br>
<br>
<br>
> On Mar 1, 2024, at 03:39, Henning Larsen via gstreamer-devel <<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 ! autovideosink<br>
> 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.<br>
> <br>
> It is easy to find the serial number including many other properties using 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 /dev/videoX id?<br>
> <br>
> I tried <br>
> gst-launch-1.0 -v v4l2src device=$(python find_camera_by_sn.py 12345) ! videoconvert ! autovideosink<br>
> 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.<br>
> <br>
> 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?<br>
<br>
I?d totally isolate the problem by using udev to ensure camera A was always video0, B was (whatever is next ie video1, video4)<br>
Then gstreamer always uses videoN<br>
<br>
James<br>
<br>
PS udev rules allow you to choose SN or Bus ID or ...<br>
<br>
------------------------------<br>
<br>
Message: 2<br>
Date: Thu, 29 Feb 2024 23:29:11 +0100<br>
From: Henning Larsen <<a href="mailto:henning.e.larsen@gmail.com" target="_blank">henning.e.larsen@gmail.com</a>><br>
To: <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:CANhudML-9_%2BQm2748EwEM%2BiQyLh3gVLV-Ybzy-8AuFz9iai3pw@mail.gmail.com" target="_blank">CANhudML-9_+Qm2748EwEM+iQyLh3gVLV-Ybzy-8AuFz9iai3pw@mail.gmail.com</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Hej Peter, Hi Nicolas<br>
Thank you so much for your swift replies.<br>
<br>
I have only tested Peter's suggestion so far and it works nicely!<br>
<br>
So to recap for other readers - the command used is<br>
gst-launch-1.0 v4l2src<br>
device=/dev/v4l/by-id/usb-FLIR_Boson_53112-video-index0 ! videoconvert !<br>
autovideosink<br>
where the device path obviously will vary on the last part.<br>
It also works in the MediaMTX.yml context, albeit with an encoding element<br>
downstream of the device.<br>
The device string is unique for this camera - which is what I needed.<br>
<br>
Again Thanks for your help - it is very appreciated!<br>
I will investigate Nicolas' suggestion later.<br>
br henning<br>
<br>
I found a small heads-up:<br>
Dont do<br>
$cd /dev/v4l/<br>
and investigate the devices while testing plugging and unplugging because<br>
the folder gets deleted if there are no devices. The result is that the<br>
shell $ls shows an empty folder.<br>
So do $cd .. out and back in and it gets populated.<br>
Bottom line - list devices from outside the folder and you'll be good<br>
<br>
<br>
------------------------------<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>
>         <<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<br>
> 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<br>
> 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: <<br>
> <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>
><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<br>
> a<br>
> ?crit?:<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<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<br>
> 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<br>
> that<br>
> serial number can be unreliable. You may have 0, or the same serial for<br>
> all cams<br>
> of the same model/brand. libcamera made up a proper ID generator, though<br>
> 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)<br>
> that is<br>
> called GstDeviceMonitor, and V4L2 plugin offer a matching DeviceProvider.<br>
> 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,<br>
> 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 =<br>
> /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<br>
> the<br>
> source element correctly, without having to know about the device<br>
> property. You<br>
> can see that it also provides bunch of information imported from udev,<br>
> including<br>
> the serial number if that is what you want to use. An alternative is to<br>
> install<br>
> libcamera with the gstreamer element, in there the camera names are unique<br>
> and<br>
> reusable. The other options is to create udev rules that alias you camera<br>
> device<br>
> names to a unique name instead of the auto-generated one.<br>
><br>
> Nicolas<br>
><br>
><br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <<a href="https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20240229/bd1a4a5c/attachment-0001.htm" rel="noreferrer" target="_blank">https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20240229/bd1a4a5c/attachment-0001.htm</a>><br>
<br>
------------------------------<br>
<br>
Subject: Digest Footer<br>
<br>
_______________________________________________<br>
gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank">gstreamer-devel@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a><br>
<br>
<br>
------------------------------<br>
<br>
End of gstreamer-devel Digest, Vol 158, Issue 1<br>
***********************************************<br>
</blockquote></div></div></div></div>