2016-04-24 18 views
1

I gst-rtsp-server mit der folgenden Pipeline bin mit:GStreamer H264 Pipeline Verzögerung

gst_rtsp_media_factory_set_launch(factory, "(" 
    "appsrc name=mysrc " 
    "! videoconvert " 
    "! videoscale " 
    "! video/x-raw,format=I420,width=350,height=250 " // fps 
    "! x264enc bitrate=128 speed-preset=ultrafast tune=zerolatency byte-stream=true threads=4 key-int-max=15 intra-refresh=true " 
    "! video/x-h264,profile=baseline " 
    "! rtph264pay name=pay0 pt=96 mtu=1300 " 
")"); 

einen H264 Video-Stream zu übertragen (I bis gstreamer ganz neu bin). Ich bin im Push-Modus:

g_object_set(appsrc, "stream-type", GST_APP_STREAM_TYPE_STREAM, NULL); 

und nur Push-über die Notwendigkeit-Daten-Callback. Meist funktioniert alles wie erwartet. Wenn ich meinen Server benutze - meine Kameras strömen gut, außer dass mein Stream eine Verzögerung von 2 Sekunden (ca.) hat.

Diese Verzögerung ist konsistent, unabhängig von einer Kombination der Einstellungen, die ich verwende.

Verschiedene

  • Bitraten
  • Kameraauflösungen
  • bei 4 fps: GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 4);
  • bei 30 fps laufen: GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 30);

alle haben die gleiche Wirkung. Es ist so, als würde mein Stream genau 2 Sekunden Verzögerung akkumulieren und ist seither permanent versetzt. Als ob gstreamer seinen internen Puffer auf eine bestimmte Größe ansammeln würde, bevor er mit der Übertragung begann.

Wegen meiner Unerfahrenheit mit Gstreamer bin ich auf diesem ratlos ratlos. Wenn jemand irgendwelche Ideen oder Hinweise hatte, um mich in einige Richtung zu zeigen, um das Debugging fortzusetzen, würde es sehr geschätzt werden.


EDIT:

Der Vollständigkeit (falls jemand bezieht sich sonst auf diese Frage), nach @ Peter ‚s Richtung, ich hatte meine Pipeline ändern VLCs jetzt kleiner Puffer aufzunehmen. Ich weiß nicht, ob das "der richtige Weg" ist, aber es hat für mich funktioniert.

Ich machte im Grunde mein "Produzent" (mein Programm) produzieren bei 60fps und skalieren es auf 30fps für die Übertragung in der Pipeline mit dem videorate Modul. Damit konnte ich VLC einen 200ms Puffer geben. Das ist meine neue Pipeline.

gst_rtsp_media_factory_set_launch(factory, "(" 
    "appsrc name=mysrc " 
    "! videoconvert " 
    "! videoscale " 
    "! videorate " 
    "! video/x-raw,format=I420,width=350,height=250,framerate=30/1 " // fps 
    "! x264enc bitrate=128 speed-preset=ultrafast tune=zerolatency byte-stream=true threads=4 key-int-max=15 intra-refresh=true " 
    "! video/x-h264,profile=baseline " 
    "! rtph264pay name=pay0 pt=96 mtu=1300 " 
")"); 

Danke nochmal an @peter.

Antwort

0

Ihr Absender ist möglicherweise zu 100% in Ordnung. Wenn ich ein Glücksspielmann wäre, würde ich wetten, dass das Problem auf dem Empfänger liegt.

Einige Empfänger (wie VLC) wollen Videos puffern, um Stottern zu verhindern. Ich würde die Optionen auf Ihrem Receiver durchsehen, um diese Optionen wenn möglich abzuschalten, wenn Ihr Ziel weniger Latenz ist.

Edited hinzufügen:

Check this out: http://www.groovypost.com/howto/change-vlc-streaming-buffer/ standardmäßig VLC ein 1500 ms (1,5 s) Cache hat.

+0

@peter Pete, du bist der Mann mein Freund (und ich habe sogar vergessen zu erwähnen, dass der Empfänger, den ich benutzte, tatsächlich VLC war), danke. Ich kratze mich seit ein paar Tagen darüber.Ich wünschte ich könnte mehr tun als Danke zu schreiben - * wirft eine Träne * - Danke! – JDR