Abrufen der Dimensionen eines H264Video-Streams

Ich versuche, die Dimensionen (Höhe und Breite) von einem H264-Stream abzurufen. Ich weiß, dass, um die gleichen Details aus einem mpeg2-Stream zu holen, Sie die vier Bytes betrachten müssen, die dem Startcode der Sequenzkopfzeile folgen ((01B3)). Wird die gleiche Logik für H264 funktionieren? Würde mich über jede Hilfe freuen, die ich bekomme.

    NEIN!!!

    Sie müssen eine komplexe function ausführen, um Videodimensionen aus Sequenz-Parametersätzen zu extrahieren. Wie macht man das? Nun, zuerst müssen Sie Ihren eigenen Exp-Golomb-Decoder schreiben, oder Sie finden einen online … im Live555-Quellcode irgendwo gibt es zum Beispiel einen …

    Dann müssen Sie einen SPS-Rahmen erhalten. Es hat NAL=0x67 (NAL ist das erste Byte in einem H.264-Frame) und Sie finden es als Base64-codierte Zeichenfolge in SDP unter sprop-parameter-sets die erste Base64-Zeichenfolge vor dem ersten Komma. Andere durch Komma getrennte Strings gibt es Bild-Parameter-Sets … Dies ist ein SPS von SDP Z0KAKYiLQDIBL0IAAB1MAAK/IAg= Sie müssen etwas von Base64 in ein Byte-Array entschlüsseln.

    Dann müssen Sie RAW BYTE SEQUENCE PAYLOAD extrahieren , gefolgt von NAL UNIT HEADER in diesem Byte-Array !!! Es ist normalerweise ein Byte lang, aber lesen Sie weiter, um sicher zu sein … RBSP enthält die Bytes, die benötigt werden, um die function seq_parameter_set_data( ) . Sie müssen also zuerst den NAL UNIT HEADER entfernen (ein oder mehrere Bytes).

    Hier ist es die function, die RBSP Bytes aus SPS NAL UNIT extrahiert:

    NAL-EINHEIT

    Dann, wenn Sie SPS (RBSP Bytes) haben, müssen Sie eine function ausführen, die Bits in diesem Bytearray analysiert. Hier ist die function mit allen Parametern, die dort analysiert werden (das ganze Dokument kann hier gefunden werden: http://www.itu.int/rec/T-REC-H.264-201003-I und es ist kostenlos): Wie man SPS dekodiert

    Dort kannst du seltsame Dinge sehen … zuerst werden deine Videodimensionen wie folgt berechnet:

     Width = ((pic_width_in_mbs_minus1 +1)*16) - frame_crop_right_offset*2 - frame_crop_left_offset*2; Height = ((2 - frame_mbs_only_flag)* (pic_height_in_map_units_minus1 +1) * 16) - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2); 

    Zweitens, und am wichtigsten, wird in der DESCRIPTOR-Spalte dieser Codetabelle angegeben, was Sie tun müssen, um den fett gedruckten Textparameter in der ersten Spalte zu lesen. Dies sind die Werte, die darin bedeuten:

    • u (N) – Lese eine vorzeichenlose Zahl, die N Bits lang ist
    • s (N) – Lies eine vorzeichenbehaftete Zahl, die N Bits lang ist
    • ue (v) – Lies eine vorzeichenlose Exp-Golomb-Zahl (v ist für variable Länge, also dasselbe wie ue() )
    • se (v) – Lies eine signierte Exp-Golomb-Nummer

    Hier kommt Ihr Exp-Golomb-Decoder zum Einsatz …

    Also, implementieren Sie diese function, parsen Sie SPS, und Sie erhalten Ihre Breite und Höhe. Genießen… 🙂

    Die Größenberechnungen sind leider falsch und sollten sein:

     width = ((pic_width_in_mbs_minus1 +1)*16) - frame_crop_left_offset*2 - frame_crop_right_offset*2; height= ((2 - frame_mbs_only_flag)* (pic_height_in_map_units_minus1 +1) * 16) - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2); 

    Eigentlich sollten die Beschneidungsparameter nur verwendet werden, wenn [frame_croping_flag] in SPS aktiviert ist. Viel Spaß mit H.264!

    Bezüglich der Rahmengrößenberechnung ist die obige Formel nicht korrekt.

    Wenn chroma_format_idc vorhanden ist, müssen wir es aus dem SPS extrahieren. Wenn chroma_format_idc nicht vorhanden ist, wird davon chroma_format_idc , dass sie gleich 1 ist (4: 2: 0 Chroma-Format). In diesem Fall ist das separate_color_plane_flag nicht gesetzt. Das bedeutet, dass chromaArrayType = chroma_format_idc und subWidthC und subHeightC ungleich 2 sind.

    Die Variablen cropUnitX und cropUnitY werden wie folgt abgeleitet:

    • Wenn chromaArrayType gleich 0 , werden cropUnitX und cropUnitY wie cropUnitY abgeleitet:

       cropUnitX = 1 cropUnitY = 2 - frame_mbs_only_flag 
    • Andernfalls ( chromaArrayType ist gleich 1 , 2 oder 3 ) werden cropUnitX und cropUnitY wie cropUnitY abgeleitet:

       cropUnitX = subWidthC cropUnitY = subHeightC * ( 2 - frame_mbs_only_flag ) 

    Jetzt können Sie cropUnitX und cropUnitY in der obigen Formel verwenden, um die richtigen Werte für die Bildgröße zu erhalten.