2 Stimmen

Wie wird der Gerätename für ein Erfassungsgerät ermittelt?

Ich schreibe eine GStreamer-Anwendung (GStreamer verwendet DirectShow unter der Haube von Windows), die das Mikrofon und die Videokamera eines Computers aufnimmt. Es funktioniert gut, aber ich muss die Gerätenamen manuell angeben. Ich möchte, dass mein Programm diese automatisch erkennt. Weiß jemand, wie man das macht?

1 Stimmen

Erlaubt es Ihnen nicht, solche Geräte aufzuzählen?

0 Stimmen

Könnten Sie ein Beispiel für eine Befehlszeile geben, die "gut funktioniert"?

1voto

Georg Fritzsche Punkte 95256

Es würde mich überraschen, wenn GStreamer nicht in der Lage wäre, Geräte aufzuzählen, aber DirectShow hat es definitiv.

Siehe den Artikel auf Verwendung des System-Geräte-Zählers und verwenden Sie es mit dem richtigen Filter-Kategorien - in Ihrem Fall CLSID_AudioInputDeviceCategory y CLSID_VideoInputDeviceCategory .

1voto

ylatuya Punkte 426

Sie sollten die Sondierungsschnittstelle von GStreamer verwenden, mit der Sie alle möglichen Werte für eine bestimmte Eigenschaft, in Ihrem Fall "Gerätename", auflisten können.

Hier ist ein Beispiel:

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 Stimmen

Solltest du nicht lieber die "device" anstelle von "device-name" ?

0 Stimmen

Offensichtlich müssen Sie bei alsa und Impulssenken device , während Sie bei DirectShow die folgenden Punkte prüfen müssen device-name ? Argh.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X