我正在尝试使用c ++中的gstreamer 1.0查询Windows上可用的视频捕获设备(网络摄像头)列表。
我使用ksvideosrc作为源码,我能够捕获视频输入,但我无法查询可用设备列表(及其上限)。
在gstreamer 0.10上,通过GstPropertyProbe可以在gstreamer 1.0中删除它。文档建议使用GstDeviceMonitor。但我也没有运气。
有没有人成功获取设备名称列表?或者,您能否提出另一种检索可用设备名称及其上限的方法?
答案 0 :(得分:1)
虽然我还没弄清楚如何枚举设备名称,但我已经提出了一种解决方法,至少可以获得可用的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
,Windows上的GStreamer版本1.4.5.0的视频源None
属性为ksvideosrc
。
答案 1 :(得分:0)
已经很晚了,但为了将来...
Gst.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;
}
}
答案 2 :(得分:0)
您可以使用GstDeviceMonitor
和gst_device_monitor_get_devices ()
函数。
首先通过GstDeviceMonitor
初始化gst_device_monitor_new()
。
然后通过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);