2010-01-29 10 views
2

Je vous écris une application GStreamer (GStreamer utilise DirectShow sous le capot sous Windows) qui capture le microphone et videocamera d'un ordinateur. Cela fonctionne bien, mais nécessite que je spécifie les noms de périphériques manuellement. Je voudrais que mon programme les détecte automatiquement. Est-ce que quelqu'un sait comment faire ça?Comment détecter le nom de périphérique d'un périphérique de capture?

+1

-t-il ne vous permet pas d'énumérer ces dispositifs? –

+0

pourriez-vous donner un exemple de ligne de commande qui "fonctionne bien" par exemple pour l'amour? – rogerdpack

Répondre

1

Cela me surprendrait si GStreamer ne possède pas de capacité d'énumérer les périphériques, mais DirectShow a certainement.

Voir l'article sur using the system device enumerator et l'utiliser avec le filter categories correct - dans votre cas CLSID_AudioInputDeviceCategory et CLSID_VideoInputDeviceCategory.

1

Vous devez utiliser l'interface de sondage de GStreamer qui vous permet de lister toutes les valeurs possibles pour une propriété donnée, dans votre cas « device-name ».

Voici un exemple:

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"); 
} 
+0

pas si vous êtes 'PALPEU R "device"' au lieu de ' "device-name"'? Apparemment –

+0

sur ALSA et les puits impulsions, vous devez sonder 'device', tandis que sur DirectShow vous devez sonder' appareil name'? Argh. –