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?
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
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? –