2016-04-28 4 views
0

Was ich tun möchte, ist einfach. Aktivieren Sie die Senken-Pads im Videomixer:Gstreamer: Wie setze ich videomixer sink_0 caps in C

/* Manually link the mixer, which has "Request" pads */ 
mixer_sink_pad_template = gst_element_class_get_pad_template(GST_ELEMENT_GET_CLASS(videomixer), "sink_%u"); 
mixer_sink_pad = gst_element_request_pad(videomixer, mixer_sink_pad_template, NULL, NULL); 
sink_pad = gst_element_get_static_pad(videomixer, "src"); 
gst_pad_link(sink_pad, mixer_sink_pad); 

Und dann legen Sie die Alpha, XPOS, YPOS, z.

g_object_set(videomixer, "sink_0::alpha", 0.5, NULL); 

Aber das funktioniert nicht.

(orig_code:22527): GLib-GObject-WARNING **: g_object_set_valist: object class 'GstVideoMixer2' has no property named 'sink_0::alpha' 

Ich versuche, die Syntax für das Erhalten der C-Code, um herauszufinden, Videomixer der sink_0 & sink_1 Pad Eigenschaften einzustellen.

Kann jemand darauf hinweisen, wie einfach es ist?

+0

Sie können die Sink-Eigenschaft nicht über den Videomixer festlegen. Versuchen Sie 'GstPad * sink_0 = gst_element_get_static_pad (videomixer," sink_0 ");' dann 'g_object_set (sink_0," alpha ", 0.5, NULL);' – Martin

+0

Danke Martin. Wenn ich die erste so einstelle, scheint es zu funktionieren, dh kompiliert und keine Laufzeitwarnungen, aber (in diesem Fall) ändert sich die xpos nicht. Wenn ich versuche, die Sekunde zu setzen, gibt es eine Warnung oder segfaults (abhängig von der Anwesenheit des ersten gst_element_get_static_pad). Das lässt mich fragen, ob der Code, der die Pads (oben gezeigt) anfordert, falsch ist, da er etwas Ähnliches macht. Vorschläge sind willkommen. Ich werde die Request-Pads untersuchen. – Raydude

Antwort

1

Hier ist eine Antwort auf meine eigene Frage.

Erster Vorbehalt. Ich denke, wenn schlechte Daten von der Kamera geholt werden (normalerweise beim Start), gibt es nicht genug Daten, um den Video-Stream und die Code-Segment-Defaults abzulegen. Meine Erfahrung ist: Wenn Sie wieder laufen, wird es gut.

Erste Dinge zuerst. Um Zugriff auf die Videomixer-Pads zu erhalten, müssen Sie diese beim Verknüpfen der Elemente erstellen. Hier ein Beispiel:

/* Manually link the mixer, which has "Request" pads */ 
    source0_src_pad = gst_element_get_static_pad (source0, "src"); 
    mixer_sink_pad_template = gst_element_class_get_pad_template(GST_ELEMENT_GET_CLASS(videomixer), "sink_%u"); 
    mixer_sink_pad = gst_element_request_pad(videomixer, mixer_sink_pad_template, NULL, NULL); 
    if (gst_pad_link(source0_src_pad, mixer_sink_pad) != GST_PAD_LINK_OK) { 
    g_printerr ("source0 and mixer pads could not be linked.\n"); 
    gst_object_unref (pipeline); 
    return -1; 
    } 

ich nicht getestet haben, aber Sie sollten die xpos direkt nach dem Auto-Link zu setzen in der Lage:

g_object_set(mixer_sink_pad, "xpos", 1280, NULL); 
gst_object_unref(source0_src_pad); 

Ich gründe den Pads xpos später in der Code mit diesem Code:

GstPad* sink_0 = gst_element_get_static_pad(videomixer, "sink_0"); 
g_object_set(sink_0, "xpos", 0, NULL); 

Danke an Martin, dass er mich in die richtige Richtung weist.

Bearbeitet, weil ich etwas Code missverstanden habe.

+0

Ich versuche etwas sehr ähnliches zu erreichen. Ich möchte den Alpha-Wert von videomixer.sink_1 :: alpha dynamisch ändern, nachdem die Pipeline gestartet wurde. Hast du das probiert? –

+0

Tut mir leid, das habe ich nicht gemacht und ich habe gstreamer aufgegeben. Ich schreibe jetzt alles selbst. Es ist viel schneller und ich habe das Gefühl, dass ich die Kontrolle über alles habe. – Raydude

+0

Schreiben Sie Ihre eigenen Codecs? –