Как определить имя устройства для устройства захвата? - PullRequest
2 голосов
/ 29 января 2010

Я пишу приложение GStreamer (GStreamer использует DirectShow под Windows), которое фиксирует микрофон и видеокамеру компьютера. Работает нормально, но требует от меня указать имена устройств вручную. Я хотел бы, чтобы моя программа обнаруживала их автоматически. Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

1 голос
/ 14 июня 2012

Вы должны использовать интерфейс пробников GStreamer, который позволяет вам перечислить все возможные значения для данного свойства, в вашем случае «имя устройства».

Вот пример:

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"); 
}
1 голос
/ 29 января 2010

Меня удивило бы, если GStreamer не имеет возможностей для перечисления устройств, но DirectShow определенно имеет.

См. Статью о с помощью перечислителя системных устройств и используйте его с правильными категориями фильтров - в вашем случае CLSID_AudioInputDeviceCategory и CLSID_VideoInputDeviceCategory.

...