Fragmentierung von H264-Paketen in RTP, die RFC3984 entsprechen

8

Ich habe das FFMPEG-Streaming-Baseline-h264-Video, das ich in RTP einkapseln und an SIP-Telefone zur Decodierung senden muss. Ich verwende Linphone mit dem h264-Plugin für Windows und Mirial für den Decoding-Fortschritt. Manchmal bekomme ich aber eine riesige Framegröße (3Kb ~ 9Kb) vom FFMPEG, die offensichtlich nicht in die MTU passt.

Wenn ich diese Frames "wie besehen" aussende und die IP-Fragmentierungsfunktion vertraue, können manche Telefone sie gut genug wiedergeben, andere wiederum ersticken und können den Stream nicht decodieren. Ich denke, das liegt daran, dass der Stream nicht konform mit dem RFC 3984 ist, der angibt, dass Pakete, die nicht in die MTU passen, in verschiedene NALUs aufgeteilt werden müssen und das Ende eines Frames mit der Mark-Funktion von RTP markieren müssen >

Woher weiß ich, wo ich den I- oder P-Rahmen "schneiden" kann? Ich habe bemerkt, dass fragmentierte h264-Pakete (die ohne das Mark-Label) manchmal in 0xF8 enden, aber kein Muster erhalten konnten und in RFC 3984, das beschreibt, wie diese Pakete über RTP gesendet werden, wird nicht spezifiziert, wie es gemacht wird.

UPDATE: Kann jemand der X264-Bibliothek sagen, wie man NALUs einer maximalen Größe erzeugt? Auf diese Weise sollte ich in der Lage sein, dieses Problem zu vermeiden. Danke an alle

    
Pierluigi Cifani 01.04.2011, 10:49
quelle

2 Antworten

12

Als Autor von RFC 3984bis (RFC 6184) beschreibt es genau, wie H.264 NALs in RFC 3984-Pakete konvertiert werden. Es gibt 3 Modi: 0 (single-NAL), 1 (ermöglicht das Fragmentieren und Kombinieren von NALs) und 2 (lässt Sie die Übertragungsreihenfolge zerlegen, kombinieren und verschachteln, um unter anderem zu ändern, wie sich ein Burst-Verlust auf einen Stream auswirkt ). Siehe SDP-Paketierungsmodus. Nur Modus 0 ist erforderlich.

Modus 0 (Single-NAL) erfordert, dass Sie entweder die UDP-Fragmentierung (entmutigt) verwenden oder dem Encoder mitteilen, dass keine NALs größer als MTU-X generiert werden. Sie sollten dies dem Encoder mitteilen können.

Modus 1 lässt Sie fragmentieren. Sehen Sie im RFC nach, wie Sie ein FU-A-Paket einrichten. Die Fragmentierungsinformation befindet sich auf der Vorderseite. Sie können STAPs auch verwenden, um kleine NALs wie SPS- und PPS-Pakete, die vor IDRs (normalerweise) gesendet wurden, zu aggregieren. Jedes Paket benötigt normale RTP-Header mit inkrementierten Sequenznummern (aber demselben Zeitstempel).

Die Markierung für das letzte RTP-Paket eines Frames (nicht eines Fragments oder einer NAL) wird erwartet, aber Sie sollten nicht darauf zählen.

    
jesup 07.04.2011, 20:27
quelle
5

In x264 glaube ich, dass die int i_slice_max_size in x264_param_t verwendet werden kann, um die Größe zu steuern. Schauen Sie sich x264.h an. Ich kann mich nicht erinnern, wo ich das gelesen habe, aber der Beitrag besagt, dass dieses Strukturelement zur Steuerung der NAL-Größe verwendet werden kann, aber ich habe es selbst nicht versucht.

int i_slice_max_size; / * Maximale Größe pro Scheibe in Bytes; enthält geschätzten NAL-Overhead. * /

EDIT: Ich habe die Quelle gefunden

Ссылка

    
ianhobo 25.04.2011 16:01
quelle

Tags und Links