python - 获取源能力
问题描述
使用 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 程序来展示我的硬件功能?
链接或代码片段将不胜感激。
解决方案
您可以将网络摄像头作为 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()
推荐阅读
- node.js - NodeJS MSSQL REST 连接关闭错误
- symfony - 在 Symfony 4 页面中找不到路由
- python - 需要从模板中的 django 获取实例 id
- r - 如何在单位正方形上多次进行 100 个点的 Voronoi 镶嵌
- c# - 如何在 .NET Core 的主布局视图中呈现特定控制器的操作?
- javascript - 是否有在样式组件中使用 mixin 的替代解决方案?
- c - 在 libtomcrypt 中比较处理器性能时出现异常结果
- javascript - 通过js获取参数设置隐藏字段的值
- node.js - 平面 JSON 到层次结构 JSON
- angular - 使用 Angular ngx-pipes 对 GroupBy 进行排序