Fehler beim Synchronisieren von libavformat / ffmpeg mit x264 und RTP

8

Ich habe an einer Streaming-Software gearbeitet, die Live-Feeds aufnimmt von verschiedenen Arten von Kameras und Streams über das Netzwerk mit H.264. Um dies zu erreichen, benutze ich den x264 Encoder direkt (mit die "Nullalatenz" - Voreinstellung) und NALs, wie sie verfügbar sind libavformat zum Packen in RTP (letztlich RTSP). Idealerweise dies Anwendung sollte so real-time wie möglich sein. Hauptsächlich, Das hat gut funktioniert.

Leider gibt es jedoch eine Art von Synchronisationsproblem: jede Video-Wiedergabe auf Clients scheint ein paar glatte Rahmen zu zeigen, gefolgt von einer kurzen Pause, dann mehr Frames; wiederholen. Zusätzlich, Es scheint ungefähr eine Verzögerung von 4 Sekunden zu geben. Dies geschieht mit jeden Videoplayer, den ich ausprobiert habe: Totem, VLC und Basic-Gstreamer-Pipes.

Ich habe alles auf einen kleinen Testfall heruntergekocht:

%Vor%

Dieser Test zeigt schwarze Linien auf einem weißen Hintergrund sollte sich glatt nach links bewegen. Es wurde für ffmpeg 0.6.5 geschrieben aber das Problem kann auf 0.8 und 0.10 (von dem, was ich bisher getestet habe) reproduziert werden. Ich habe einige Abkürzungen in der Fehlerbehandlung genommen, um dieses Beispiel so kurz zu machen möglich, während immer noch das Problem, so entschuldigen Sie bitte einige der böser Code. Ich sollte auch beachten, dass, während ein SDP hier nicht verwendet wird, ich habe versucht, das bereits mit ähnlichen Ergebnissen zu verwenden. Der Test kann sein kompiliert mit:

%Vor%

Es kann direkt mit gtreamer gespielt werden:

%Vor%

Sie sollten sofort das Stottern bemerken. Eine gemeinsame "Lösung", die ich habe Überall im Internet gesehen, ist sync = false zur Pipeline hinzuzufügen:

%Vor%

Dies bewirkt, dass die Wiedergabe glatt ist (und nahezu in Echtzeit), ist aber a Nicht-Lösung und funktioniert nur mit gstreamer. Ich möchte das reparieren Problem an der Quelle. Ich konnte fast identisch streamen Parameter mit rohen ffmpeg und hatten keine Probleme:

%Vor%

Also mache ich eindeutig etwas falsch. Aber was ist es?

    
Jacob Peddicord 27.07.2012, 16:30
quelle

1 Antwort

4

1) Sie haben PTS für Frames, die Sie an libx264 senden, nicht gesetzt (Sie sollten wahrscheinlich "nicht streng monotone PTS" Warnungen sehen) 2) Sie haben PTS / DTS nicht für Pakete eingestellt, die Sie an den rtp muxer von libavformat senden (ich bin nicht 100% sicher, dass es gesetzt werden muss, aber ich denke, es wäre besser. Vom Quellcode sieht es aus wie rtp PTS). 3) IMHO usleep (33333) ist schlecht. Dies führt dazu, dass der Encoder auch dieses Mal stehen bleibt (steigende Latenz), während Sie das nächste Frame während dieser Zeit kodieren können, auch wenn Sie es immer noch nicht per Rtp senden müssen.

P.S. Übrigens haben Sie param.rc.i_rc_method nicht auf X264_RC_ABR gesetzt, so dass libx264 stattdessen CRF 23 verwendet und Ihre "param.rc.i_bitrate = BITRATE" ignoriert. Es kann auch sinnvoll sein, beim Kodieren für das Senden im Netzwerk VBV zu verwenden.

    
nobody555 31.07.2012, 12:07
quelle

Tags und Links