Frage

Ich habe an einer solchen Streaming-Software gearbeitet, die Live-Feeds annimmt von verschiedenen Arten von Kameras und Bächen über das Netzwerk mit H.264. Um dies zu erreichen, benutze ich den X264-Encoder direkt (mit die "Zerolatenz" voreingestellt) und Fütterungsnals, wenn sie zur Verfügung stehen libavFormat, um in RTP (letztendlich RTSP) packen. Idealerweise das Die Anwendung sollte so echte Zeit wie möglich sein. Hauptsächlich, Das ist gut funktioniert.

Leider gibt es jedoch eine Art Synchronisationsausgabe: Jede Videowiedergabe auf Kunden scheint ein paar glatte Frames zu zeigen, gefolgt von einer kurzen Pause, dann mehr Frames; wiederholen. Zusätzlich, Es scheint ungefähr eine 4-Sekunden-Verzögerung zu geben. Das passiert mit Jeder Video-Player, den ich versucht habe: Totem, VLC und grundlegende GStreamer-Rohre.

Ich habe alles bis zu einem etwas kleinen Testfall gekocht:

generasacodicetagpre.

Dieser Test zeigt schwarze Linien auf einem weißen Hintergrund sollte sich reibungslos nach links bewegen. Es wurde für FFMPEG 0.6.5 geschrieben Das Problem kann jedoch auf 0,8 und 0,10 reproduziert werden (von dem, was ich bisher getestet habe). Ich habe einige Verknüpfungen in der Fehlerbehandlung mitgenommen, um dieses Beispiel so kurz zu machen Möglich, während Sie immer noch das Problem zeigen, entschuldigen Sie bitte einige der Nasty Code. Ich sollte auch feststellen, dass hier kein SDP hier verwendet wird, ich haben versucht, das bereits mit ähnlichen Ergebnissen zu verwenden. Der Test kann sein zusammengestellt mit:

generasacodicetagpre.

Es kann direkt mit Gräumer abgespielt werden:

generasacodicetagpre.

Sie sollten das Stottern sofort bemerken. Ein gemeinsames "Fix" habe ich Alles in der gesamten Internet gesehen, ist, Sync= FALSCH an die Pipeline hinzuzufügen:

generasacodicetagpre.

Dies führt dazu, dass die Wiedergabe glatt ist (und in der Nähe von Echtzeit), ist jedoch ein Nicht-Lösung und funktioniert nur mit GStreamer. Ich möchte das reparieren Problem an der Quelle. Ich konnte mit nahezu identisch streamen Parameter mit roh ffmpeg und haben keine Probleme:

generasacodicetagpre.

so klar, dass ich etwas falsch mache. Aber was ist das?

War es hilfreich?

Lösung

1) Sie haben PTS nicht für Frames festgelegt, die Sie an libx264 senden (Sie sollten wahrscheinlich "nicht streng-monotonische PTS" -Warnationen sehen) 2) Sie haben PTS / DTS nicht für Pakete festgelegt, das Sie an den RTP-MUXER von LibavFormat senden (Ich muss nicht zu 100% sicher sein, dass es eingestellt werden muss 3) IMHO Usleep (33333) ist schlecht.Es verursacht den Codierer, diesmal auch zu stehlen (Erhöhung der Latenzzeit), während Sie während dieser Zeit den nächsten Rahmen codieren können, auch wenn Sie es immer noch nicht mit RTP senden müssen.

p.s.BTW Sie haben nicht param.rc.i_rc_method auf x264_rc_abr eingestellt, so dass LIBX264 stattdessen CRF 23 verwenden und Ihr "param.rc.i_bitrate= Bitrate" ignoriert.Es kann auch eine gute Idee sein, VBV beim Codieren für das Netzwerk-Senden zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top