代码之家  ›  专栏  ›  技术社区  ›  StackedCrooked

如何检测捕获设备的设备名称?

  •  2
  • StackedCrooked  · 技术社区  · 14 年前

    我正在编写一个gstreamer应用程序(gstreamer在Windows的引擎盖下使用DirectShow),它捕获计算机的麦克风和摄像机。它工作正常,但需要我手动指定设备名称。我想让我的程序自动检测这些。有人知道怎么做吗?

    2 回复  |  直到 12 年前
        1
  •  1
  •   Georg Fritzsche    14 年前

    如果gstreamer没有枚举设备的功能,但DirectShow肯定有,我会很惊讶的。

    请参阅上的文章 using the system device enumerator 用正确的 filter categories -在你的情况下 CLSID_AudioInputDeviceCategory CLSID_VideoInputDeviceCategory .

        2
  •  1
  •   ylatuya    12 年前

    您应该使用gstreamer的探测接口,该接口允许您列出给定属性的所有可能值(在您的情况下为“device name”)。

    下面是一个例子:

    GList* 
    gst_camera_capturer_enum_devices(gchar* device_name)
    {
      GstElement* device; 
      GstPropertyProbe* probe;
      GValueArray* va; 
      GList* list=NULL; 
      guint i=0; 
    
      device = gst_element_factory_make (device_name, "source");
      gst_element_set_state(device, GST_STATE_READY);
      gst_element_get_state(device, NULL, NULL, 5 * GST_SECOND);
      if (!device || !GST_IS_PROPERTY_PROBE(device))
        goto finish;
      probe = GST_PROPERTY_PROBE (device);
      va = gst_property_probe_get_values_name (probe, "device-name");
      if (!va)
        goto finish;
      for(i=0; i < va->n_values; ++i) {
        GValue* v = g_value_array_get_nth(va, i);
        list = g_list_append(list, g_string_new(g_value_get_string(v)));
      }
      g_value_array_free(va);
    
    finish:
      {
        gst_element_set_state (device, GST_STATE_NULL);
        gst_object_unref(GST_OBJECT (device));
        return list;
      }
    }
    
    GList* 
    gst_camera_capturer_enum_video_devices(void)
    {
      return gst_camera_capturer_enum_devices("dshowvideosrc"); 
    }
    
    GList* 
    gst_camera_capturer_enum_audio_devices(void)
    { 
      return gst_camera_capturer_enum_devices("dshowaudiosrc"); 
    }