Wie überprüfe ich H264 / AVC ISO / IEC 14496-15 AVCDecoderConfigurationRecord?

8

Historischer Hintergrund: Ich arbeite gerade mit Wowza und versuche, die AMFPackets zu entschlüsseln, die von IMediaStream stammen. Die Videopakete haben einen 5-Byte-Header und das erste Paket ist die Codec-Konfiguration.

Bei meiner Überprüfung stimmt die Codec-Konfiguration mit dem Layout ISO / IEC 14496-15 AVCDecoderConfigurationRecord überein. Ich habe jedoch Probleme beim Dekodieren der Einheiten SPS und PPS .

Das Codec-Config-Paket mit dem 5-Byte-Header:

  

17 00 00 00 00 01 4D 00 15 03 01 00 2F 67 4D 40 15 96 52 02 83 F6 02   A1 00 00 03 00 01 00 00 03 00 28 E0 60 03 0D 40 00 49 3E 7F 18 E3 03   00 18 6A 00 02 49 F3 F8 C7 0E D0 B1 68 90 01 00 04 68 EB 73 52

Flash / Wowza-spezifisch ist der Header:

  

17 00 00 00 00

  • 17 = 10111 = H.264 K-Rahmen
  • 00 = 0 = Codec-Konfigurationspaket
  • 000000 = 0 = Startzeit 0

Als nächstes ist AVCDecoderConfigurationRecord (hex = dezimal):

  • configurationVersion: 01 = 1
  • AVCProfileIndication: 4D = 77 (Main)
  • Profilkompatibilität: 00 = 0
  • AVClevelIndication: 15 = 21 (2.1)
  • 6 Bits reserviert + lengthSizeMinusOne: 03 = 00000011 = 3 (4 Bytes)
  • 3 Bits reserviert + numOfSequenceParameterSets: 01 = 0001 = 1
  • sequenceParameterSetLength: 002F = (47 Byte)
  • (SPS-Datensatz 47 Byte lang)
  • numOfPictureParameterSets: 01 = 1
  • pictureParameterSetLength: 0004 = (4 Byte)
  • (PPS-Datensatz 4 Byte lang)
  • (Ende)

SPS-Datensatz (47 Bytes):

  

67 4D 40 15 96 52 02 83 F6 02 A1 00 00 03 00 01 00 00 03 00 28 E0 60   03 0D 40 00 49 3E 7F 18 E3 03 00 18 6A 00 02 49 F3 F8 C7 0E D0 B1 68   90

Angenommen, dies ist eine NAL-Einheit mit SPS-Typ: (Verwenden von ITU-T H.264 06/2011 7.3.1 NAL-Einheitensyntax )

  • Erstes Byte: 67 = 1100111
  • discredoted_zero_bit: 1 (Hoppla, verboten 0 Bit auf 1 gesetzt?)
  • nal_ref_idc: 2
  • nal_unit_type: 0111 = 7 (SPS)

Angenommen, die SPS-Payload folgt: (Verwenden von ITU-T H.264 06/2011 7.3.2.1.1 Sequenz-Parametersatz-Datensyntax )

  • profil_idc: 4D = 77 (Main, Übereinstimmungen)
  • Constraints + 2 Bits reserviert (gleich 0): 40 = 1000000 (sieht gut aus)
  • level_idc: 15 (2.1, Treffer)

Angenommen, das ist nur ein SPS: (Verwenden von ITU-T H.264 06/2011 7.3.2.1.1 Sequenzparametersatz-Datensyntax )

  • profil_idc: 67 = 103 (Ich denke, das sollte 77 wie AVCProfileIndication sein?)
  • Constraints + 2 Bits reserviert (gleich 0): 4D = 1001101 (Uh oh, reserviertes Bit gesetzt?)
  • level_idc: 77 (Sollte das nicht 21 sein wie AVClevelIndication?)

Es sieht so aus, als wäre es der ehemalige NAL-Unit-Header + SPS-Record, und ich bezweifle, dass es schlechte Daten sind, weil jedes eingefangene Config-Paket dasselbe ist, aber was wirft mich ab, warum ist das Verbotene 0-Bit auf 1 gesetzt?

Danke

    
Rob Olmos 23.06.2012, 19:55
quelle

1 Antwort

4

Ich habe das Problem gefunden ... zu viel auf die 1 und 0 zu starren und du wirst eins vermissen (Wortspiel beabsichtigt).

  

67 4D 40 15 ...

     

Angenommen, es handelt sich um eine NAL-Einheit mit SPS-Typ: (Verwenden von ITU-T H.264 06/2011 7.3.1 NAL-Einheitensyntax)

     

Erstes Byte: 67 = 1100111

Das ist falsch, weil 1100111 nur aus 7 Bits besteht. Ich habe die Konvertierung mit MS Calculator durchgeführt und es hat die führende 0 entfernt. Die korrekte Binärdatei ist 01100111 , und dort ist das verbotene Null-Bit.

Danke an diejenigen, die versucht haben, diese Frage zu lösen.

    
Rob Olmos 25.06.2012, 08:17
quelle

Tags und Links