2016-06-01 13 views
0

Ich habe ein Problem mit der Verknüpfung von zwei Elementen: avdec_h264 und avenc_mpeg4. Ich denke, dass diese Elemente irgendwie die Fähigkeiten einer Daten nicht aushandeln können.GStreamer: Caps Verhandlung Fehler

Ich habe meine Pipeline mit gst-Launch getestet:

gst-launch-1.0 rtspsrc location="rtsp://camera" ! rtph264depay ! h264parse ! avdec_h264 ! avenc_mpeg4 ! fakesink 

Es fein gearbeitet haben.

Wenn ich meine Anwendung zu verwenden, wo die Pipeline implementiert:

pipeline_ = gst_pipeline_new("default"); 

    if (!pipeline_) 
    { 
     return false; 
    } 

    receiver_ = gst_element_factory_make("rtspsrc",  "receiver"); 
    demuxer_ = gst_element_factory_make("rtph264depay", "demuxer"); 
    parser_ = gst_element_factory_make("h264parse", "parser"); 
    decoder_ = gst_element_factory_make("avdec_h264", "decoder"); 
    encoder_ = gst_element_factory_make("avenc_mpeg4, "encoder"); 
    output_ = gst_element_factory_make("fakesink",  "output"); 

    if (!receiver_ || !demuxer_ || !parser_ || 
     !decoder_ || !encoder_ || !output_) 
    { 
     return false; 
    } 

    g_object_set(GST_OBJECT(receiver_), "location", "rtsp://camera", nullptr); 
    // On this signal source pad of the receiver is being connected to 
    // the sink pad of the demuxer. 
    g_signal_connect(receiver_, "pad-added", G_CALLBACK(on_pad_added), this); 

    gst_bin_add_many(GST_BIN(pipeline_), receiver_, demuxer_, parser_, 
        decoder_, encoder_, output, nullptr); 

    if (!gst_element_link_many(demuxer_, parser_, decoder_, 
           encoder_, output_, nullptr)) 
    { 
     return false; 
    } 

Alle Link erfolgreich. Alle Elemente ändern ihren Status in PLAYING, aber ich bekomme nichts: Ich bekomme GST_MESSAGE_STREAM_START nicht auf dem Bus der Pipeline.

Hier sind die Graphen von gst-Start und meiner Anwendung: Graph generated by gst-launch Graph generated by my application

Wenn ich avenc_mpeg4 zu, videoconvert Elemente zu ändern, die nicht ein Encoder ist, wird alles gut funktioniert. Wenn ich einen anderen Encoder einsetze, habe ich immer noch ein aktuelles Problem.

Wahrscheinlich weiß ich nicht über bestimmte Dinge, wie man mit dem Encoder arbeitet. Aber ich konnte keine Lösung finden.

Vielen Dank.

Antwort

0

Einige Punkte:

  1. Der Code, den Sie oben gepostet sollte für Pad-Added-Nachrichten von decodebin aufgeführt. Ich bin überrascht, wenn der Code so funktionieren würde wie er ist (vielleicht fügen Sie den vollständigen Code auf einen Punkt und einen Link von hier). Siehe https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-pads.html
  2. Einen Videokonverter zwischen Decoder und Encoder einfügen.
+0

Ich habe einen Sinn: https://gist.github.com/simonenkos/9e31fc66b38a09afea362f1180c8296d Ich habe versucht, ein Videoconvert-Element hinzuzufügen, aber nichts ändert sich. Und ich verstehe auch nicht über das Dekodebin. Ich habe kein solches Element in meiner Pipeline. Ich habe nur eine 'pad-added' Signal-Handler für rtspsrc, die manchmal ein Quell-Pad hat. –

+0

Ich wurde durch das Lesen von demuxer ausgetrickst, aber das ist nur ein depayloader, also wird das tatsächlich funktionieren (Teil 1)). – ensonic

+0

Entschuldigung, Demux ist nur ein Depayloader. Das funktioniert, also ignorieren Sie bitte Punkt 1. Für die Verhandlung müssen Sie wahrscheinlich das Debug-Protokoll überprüfen: – ensonic

0

Wo verbinden Sie Empfänger mit Demuxer? das ist nötig, wie ich es verstehe.