列出gstreamer 1.0中可用于从ksvideosrc捕获视频的设备名称

List device-names available for video capture from ksvideosrc in gstreamer 1.0

本文关键字:视频 设备名 ksvideosrc gstreamer 用于 列出      更新时间:2023-10-16

我正在尝试使用gstreamer 1.0在c++中查询windows上可用的视频捕获设备(网络摄像头)列表。

我使用ksvideosrc作为源,我能够捕获视频输入,但我无法查询可用设备(及其上限)的列表。

在gstreamer 0.10上,它可以通过GstPropertyProbe实现,该探针在gstreamer 1.0中被删除。文档建议使用GstDeviceMonitor。但是我也没有用过。

是否有人成功获取设备名称列表?或者您能建议另一种检索可用设备名称及其上限的方法吗?


可以使用GstDeviceMonitorgst_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;
    }
}