列出gstreamer 1.0

时间:2015-05-25 14:01:35

标签: c++ gstreamer

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

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

在gstreamer 0.10上,通过GstPropertyProbe可以在gstreamer 1.0中删除它。文档建议使用GstDeviceMonitor。但我也没有运气。

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

3 个答案:

答案 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)


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

我的参考资料: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstDeviceMonitor.html#gst-device-monitor-get-devices