2016-06-07 26 views
3

Ich versuche, RTP-Video-Stream über das Netzwerk über UDP-Protokoll zu übertragen.Gstreamer Video empfangen: Streaming-Aufgabe pausiert, Grund nicht ausgehandelt (-4)

Hier Pipeline-Code auf Senderseite:

https://gist.github.com/mgalushka/68d8ee034849a7db4f1f234e73a41405

ich empfangen und aktuelle Video sehen, ob ich Empfänger mit gst-launch-1.0 Befehlszeile wie folgt ausführen:

gst-launch-1.0 -v udpsrc address=127.0.0.1 port=1234 caps="application/x-rtp" ! rtph263pdepay ! avdec_h263 ! autovideosink 

Aber ich kann nicht siehe Fenster mit Video, wenn ich Empfänger für die gleiche Pipeline in c Code ausführen. Hier Pipeline-Code auf Empfängerseite (in Voll - weil ich hier glauben Fehler irgendwo):

void _receive_video_init_gstreamer(NiceAgent *magent, guint stream_id, CustomData *data) 
{ 
    GstElement *pipeline, *source, *capsfilter, *videoconvert, *h263p, *rtph263pdepay, *sink; 
    GstBus *bus; 
    GstMessage *msg; 
    GstStateChangeReturn ret; 
    GSource *bus_source; 

    source = gst_element_factory_make ("udpsrc", "source"); 
    rtph263pdepay = gst_element_factory_make ("rtph263pdepay", "rtph263pdepay"); 
    h263p = gst_element_factory_make ("avdec_h263p", "h263p"); 
    sink = gst_element_factory_make ("autovideosink", "sink"); 

    g_object_set (source, "address", "127.0.0.1", NULL); 
    g_object_set (source, "port", 1234, NULL); 

    g_object_set (source, "caps", gst_caps_from_string("application/x-rtp"), NULL); 

    g_object_set (sink, "sync", FALSE, NULL); 

    pipeline = gst_pipeline_new ("Video receive pipeline"); 

    if (!pipeline || !source || 
     !h263p || !rtph263pdepay || !sink) 
    { 
    g_printerr ("Not all elements could be created.\n"); 
    return; 
    } 

    gst_bin_add_many (GST_BIN (pipeline), source, 
      rtph263pdepay, h263p, sink, NULL); 

    if (gst_element_link_many (source, 
       rtph263pdepay, h263p, sink, NULL) != TRUE) { 
    g_printerr ("Elements could not be linked.\n"); 
    gst_object_unref (pipeline); 
    return; 
    } 

    bus = gst_element_get_bus (pipeline); 
    gst_bus_enable_sync_message_emission (bus); 
    gst_bus_add_signal_watch (bus); 

    g_signal_connect (bus, "message::error", 
     (GCallback) on_error, NULL); 

    data->pipeline = pipeline; 
    ret = gst_element_set_state(data->pipeline, GST_STATE_PLAYING); 

    if (ret == GST_STATE_CHANGE_FAILURE) { 
    g_printerr ("Unable to set the pipeline to the playing state.\n"); 
    gst_object_unref (pipeline); 
    return; 
    } 
} 

Fehler von Code onserved:

WARN basesrc gstbasesrc.c:2943:void gst_base_src_loop(GstPad *):<source> error: Internal data flow error. 
WARN basesrc gstbasesrc.c:2943:void gst_base_src_loop(GstPad *):<source> error: streaming task paused, reason not-negotiated (-4) 
ERROR default gstreamer_utils.c:42:on_error: Error received from element source: Internal data flow error. 

Wie kann ich dieses Problem debuggen?

+1

zwei Dinge kommen mir in den Sinn - Sie haben zusätzliche "sync = false" im Vergleich zu Ihrem Launch-Pipe, der zweite .. zusätzlich versuchen, GST_STATE_PLAYING alson auf dem Waschbecken Element (aber es ist nicht sehr guter Rat, nur eine Einstellung in der dunkel) .. Sie können Ihre Lösung debuggen, indem Sie entweder exportieren oder mit 'GST_DEBUG = 4./yourapp 'laufen. Dann aktualisieren Sie die Frage oder finden Sie heraus, was während der Linkzeit passiert (Sie erhalten" nicht ausgehandelt ", was die Ements bedeutet) konnte nicht zur Laufzeit verbunden werden) – nayana

+0

Danke, @otopolsky Ich habe das ohne sync = false und GST_DEBUG = 4, habe einige Protokolle: https://gist.github.com/anonymous/99a9c4912f1970eb1c0e04967f03e286 Jede Idee, wo Sie suchen für die Hinweise? –

Antwort

1

Dies ist zu lang für einen Kommentar - sein nicht beantworten, aber wie zu analysieren:

Versuchen dot-Dateien zu machen, die Unterschiede zu erkennen .. ich in Protokollen festgestellt, dass es beteiligt opengl Zeug ist - machen Sie das brauchen? Versuchen Sie, autovideosink auf etwas zu ändern, das OpenGL nicht verwendet .. nicht sicher, welche Optionen haben Sie auf Mac (ich hoffe, ich habe es richtig geraten) - auf Linux verwende ich ximagesink oder xvimagesink .. auf dem Mac gibt es osxvideosink (nicht sicher, ob es gebaut wird (Standard) - Sie können überprüfen this ..

Meine Vermutung, warum verhält es sich anders in gst-starten und Ihre App ist, dass Sie einige zusätzliche Aufwand in Ihrer App, die die Verarbeitung verlangsamt oder etwas und Sie verursacht holen Sie sich die nicht verhandelt Fehler als etwas verschoben ..

ich bemerkte dies in Protokolle:

0: 00: 00,608 577.000 29.168 0x7fb5a401d850 basesrc gstbasesrc.c INFO: 2838: void gst_base_src_loop (GstPad *): Kennzeichnung DISCONT

anhängig, was bedeutet, dass einige Pakete später kamen als erwartet und wurden verworfen ..

Versuchen Zugabe Warteschlangen nach udpsrc die einige Pakete Puffer:

queue = gst_element_factory_make ("queue", "srcqueue"); 

und natürlich auch an Rohr und Verbindung zwischen hinzuzufügen:

if (gst_element_link_many (source, queue 
      rtph263pdepay, h263p, sink, NULL) != TRUE) {