Как да откриете името на устройството за устройство за заснемане?

Пиша приложение GStreamer (GStreamer използва DirectShow под капака на Windows), което улавя микрофона и видеокамерата на компютъра. Работи добре, но изисква да посоча имената на устройствата ръчно. Бих искал програмата ми да ги открива автоматично. Някой знае ли как се прави това?


person StackedCrooked    schedule 29.01.2010    source източник
comment
Не ви ли позволява да изброите такива устройства?   -  person Vilx-    schedule 29.01.2010
comment
можете ли да дадете примерен команден ред, който работи добре, например sake?   -  person rogerdpack    schedule 16.09.2011


Отговори (2)


Ще ме изненада, ако GStreamer няма възможности за изброяване на устройства, но DirectShow определено има.

Вижте статията за използване на системния изброител на устройства и го използвайте с правилните категории на филтри - във вашия случай CLSID_AudioInputDeviceCategory и CLSID_VideoInputDeviceCategory.

person Georg Fritzsche    schedule 29.01.2010

Трябва да използвате интерфейса за сондиране на 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"); 
}
person ylatuya    schedule 14.06.2012
comment
Не трябва ли да изследвате "device" вместо "device-name"? - person Has QUIT--Anony-Mousse; 17.02.2013
comment
Очевидно на alsa и импулсните поглътители трябва да проверите device, докато на DirectShow трябва да проверите device-name? Аргх - person Has QUIT--Anony-Mousse; 17.02.2013