Я пишу приложение GStreamer (GStreamer использует DirectShow под капотом в Windows), которое захватывает микрофон и видеокамеру компьютера. Он отлично работает, но требует, чтобы я указал имена устройств вручную. Я хотел бы, чтобы моя программа обнаруживала их автоматически. Кто-нибудь знает как это сделать?
Как определить имя устройства для устройства захвата?
comment
Не позволяет перечислить такие устройства?
- person Vilx-   schedule 29.01.2010
comment
не могли бы вы привести пример командной строки, которая отлично работает, например, ради?
- 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
Разве вы не должны исследовать
"device"
вместо "device-name"
?
- person Has QUIT--Anony-Mousse; 17.02.2013
Судя по всему, на алсе и импульсных стоках нужно прощупывать
device
, а на DirectShow нужно прощупывать device-name
? Арх.
- person Has QUIT--Anony-Mousse; 17.02.2013