列出gstreamer 1.0中可用于从ksvideosrc捕获视频的设备名称
List device-names available for video capture from ksvideosrc in gstreamer 1.0
我正在尝试使用gstreamer 1.0在c++中查询windows上可用的视频捕获设备(网络摄像头)列表。
我使用ksvideosrc作为源,我能够捕获视频输入,但我无法查询可用设备(及其上限)的列表。
在gstreamer 0.10上,它可以通过GstPropertyProbe实现,该探针在gstreamer 1.0中被删除。文档建议使用GstDeviceMonitor。但是我也没有用过。
是否有人成功获取设备名称列表?或者您能建议另一种检索可用设备名称及其上限的方法吗?
可以使用GstDeviceMonitor
和gst_device_monitor_get_devices ()
函数。
先用gst_device_monitor_new()
初始化GstDeviceMonitor
。
第二次通过gst_device_monitor_start(pMonitor)
启动监视器。
第三,通过gst_device_monitor_get_devices(pMonitor)
获取设备列表。
代码应该像这样:
GstDeviceMonitor* monitor= gst_device_monitor_new();
if(!gst_device_monitor_start(monitor)){
printf("WARNING: Monitor couldn't started!!n");
}
GList* devices = gst_device_monitor_get_devices(monitor);
我的引用:https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstDeviceMonitor.html gst-device-monitor-get-devices
虽然我还没有弄清楚如何枚举设备名称,但我已经提出了一个解决方案,至少可以获得可用的ksvideosrc
设备索引。下面是Python的代码,但由于GObject的自省绑定,您应该能够相当容易地将其移植到c++中。
from gi.repository import Gst
def get_ksvideosrc_device_indexes():
device_index = 0
video_src = Gst.ElementFactory.make('ksvideosrc')
state_change_code = None
while True:
video_src.set_state(Gst.State.NULL)
video_src.set_property('device-index', device_index)
state_change_code = video_src.set_state(Gst.State.READY)
if state_change_code != Gst.StateChangeReturn.SUCCESS:
video_src.set_state(Gst.State.NULL)
break
device_index += 1
return range(device_index)
if __name__ == '__main__':
Gst.init()
print get_ksvideosrc_device_indexes()
请注意,视频源device-name
属性是None
的GStreamer版本1.4.5.0在Windows上的ksvideosrc
。
现在很晚了,但是为了将来…
消费税。DeviceMonitor可用于枚举设备,并注册添加或删除设备。下面是如何使用GStreamer 1.14在c#中获取设备名称
static class Devices
{
public static void Run(string[] args)
{
Application.Init(ref args);
GtkSharp.GstreamerSharp.ObjectManager.Initialize();
var devmon = new DeviceMonitor();
// to show only cameras
// var caps = new Caps("video/x-raw");
// var filtId = devmon.AddFilter("Video/Source", caps);
var bus = devmon.Bus;
bus.AddWatch(OnBusMessage);
if (!devmon.Start())
{
"Device monitor cannot start".PrintErr();
return;
}
Console.WriteLine("Video devices count = " + devmon.Devices.Length);
foreach (var dev in devmon.Devices)
DumpDevice(dev);
var loop = new GLib.MainLoop();
loop.Run();
}
static void DumpDevice(Device d)
{
Console.WriteLine($"{d.DeviceClass} : {d.DisplayName} : {d.Name} ");
}
static bool OnBusMessage(Bus bus, Message message)
{
switch (message.Type)
{
case MessageType.DeviceAdded:
{
var dev = message.ParseDeviceAdded();
Console.WriteLine("Device added: ");
DumpDevice(dev);
break;
}
case MessageType.DeviceRemoved:
{
var dev = message.ParseDeviceRemoved();
Console.WriteLine("Device removed: ");
DumpDevice(dev);
break;
}
}
return true;
}
}
- 正在查找文档以获得PS4平台的C++中的设备信息
- 你能重载对象变量名本身返回的内容吗
- 指向设备对象成员的指针
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 有没有一种方法可以在编译时获得作用域类名
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 视频在唤醒其他线程时输入设备断开连接
- 使用OpENCV中的两个视频仪捕获同一设备
- 将两个不同的设备捕获框架组合到一个框架中,然后写一个视频
- OPENCV视频关注设备索引 /设备编号
- OPENCV是否可以使用视频捕获设备访问模拟摄像机
- 使用OpenCV C 从SMI Grabber设备捕获视频
- Blackmagic DirectShow Framerate - 为什么我没有获得我的捕获设备能够实现的所有视频模式
- C++使用视频数据和视频设备的优势
- DirectShow -选择视频设备
- 从USB设备的设备路径获取卷名
- 如何获取视频采集设备信息
- 视频捕获应用程序不适用于与 DirectShow 兼容的设备
- SDL应用程序使用DirectFB错误:没有可用的视频设备
- 列出gstreamer 1.0中可用于从ksvideosrc捕获视频的设备名称