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

Peter Maersk-Moller pmaersk at gmail.com
Thu Feb 29 20:58:31 UTC 2024


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.htm>


More information about the gstreamer-devel mailing list