首页 > 解决方案 > 获取源能力

问题描述

使用 gst-launch 和调试标志,我可以查询我的网络摄像头的功能。例如

➜ GST_DEBUG=v4l2src:6 gst-launch-1.0 v4l2src device=/dev/video0 ! xvimagesink
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
0:00:00.173516041 29482 0x559bc3ff6ca0 DEBUG                v4l2src gstv4l2src.c:512:gst_v4l2src_negotiate:<v4l2src0> caps of src: video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1; video/x-raw, format=(string)YUY2, width=(int)960, height=(int)540, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)15/1; video/x-raw, format=(string)YUY2, width=(int)848, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)20/1; video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; video/x-raw, format=(string)YUY2, width=(int)640, height=(int)360, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; video/x-raw, format=(string)YUY2, width=(int)424, height=(int)240, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; video/x-raw, format=(string)YUY2, width=(int)352, height=(int)288, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; video/x-raw, format=(string)YUY2, width=(int)320, height=(int)240, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; video/x-raw, format=(string)YUY2, width=(int)320, height=(int)180, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; image/jpeg, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; image/jpeg, width=(int)960, height=(int)540, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; image/jpeg, width=(int)848, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; image/jpeg, width=(int)640, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; image/jpeg, width=(int)640, height=(int)360, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; image/jpeg, width=(int)424, height=(int)240, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; image/jpeg, width=(int)352, height=(int)288, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; image/jpeg, width=(int)320, height=(int)240, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }; image/jpeg, width=(int)320, height=(int)180, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }
...

以一种更易读的方式,它说大写是:

 video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1
 video/x-raw, format=(string)YUY2, width=(int)960, height=(int)540, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)15/1
...
 image/jpeg, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }
 image/jpeg, width=(int)960, height=(int)540, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 15/1 }
...

我想制作一个提取这些信息的python程序。

我一直在使用这个示例程序,我可以提取 v4l2src 的功能和协商的上限。

我无法从物理硬件中提取可用的实际上限。

做这样的事情


source_factory = Gst.ElementFactory.find("v4l2src")
pads = source_factory.get_static_pad_templates()
print("*** v4l2src has a lot of capabilities ****")
print_pad_templates_information(source_factory)

source = source_factory.create("source")
source.set_property('device', "/dev/video0")
print("*** Physical v4l2src device has no capabilities ****")
print_pad_capabilities(source, "src")


在 v4l2src 上显示很多大写字母,但没有显示任何实际元素。

打印功能来自教程文件]( https://github.com/gkralik/python-gst-tutorial/blob/master/basic-tutorial-6.py )

当我将它放入管道时,我得到的是与管道兼容的功能列表,而不是整个列表。

回到这个问题:如何制作一个小型的 Python 程序来展示我的硬件功能?

链接或代码片段将不胜感激。

标签: pythongstreamer

解决方案


您可以将网络摄像头作为 Gst.Device 进行检查,并以这种方式获取所有可用的上限。GStreamer 的 V4L2 支持提供了一个设备提供商工厂,能够为您提供系统上的所有 V4L2 网络摄像头。

device_provider = Gst.DeviceProviderFactory.get_by_name("v4l2deviceprovider")
devices = device_provider.get_devices()

接下来,您需要在列表中找到您感兴趣的设备。我通过将设备对象的“device.path”属性与已知路径(如“/dev/video0”)匹配来做到这一点。完成此操作后,您可以通过调用获取设备的可用上限get_caps()

for device in devices:
    path = device.get_properties().get_string("device.path")
    if path == my_path:
        caps = device.get_caps()

推荐阅读