2016-04-26 22 views
0

movコンテナに格納されている次のデータのH.264 NALUヘッダーの周りに頭を浮かべています。ファイルからH.264 NALUバイトアライメント

例:

0x00 0x00 0x00 0x02 -> 00000000 00000000 00000000 00000010 

:これまでのところ私は、ビットストリームが原因1ビット左にオフセットスタートコード・シーケンスにバイト整列されていないことを想定している

00 00 00 02 09 30 00 00 00 0E 06 01 09 00 02 08 
24 68 00 00 03 00 01 80 00 00 2B 08 21 9A 01 01 
64 47 D4 B2 5C 45 76 DA 72 E4 3B F3 AE A9 56 91 
B2 3F FE CE 87 1A 48 13 14 A9 E0 12 C8 AD E9 22 
... 

したがって、これらのバイトと次のバイトを右の1ビットにシフトして、次の開始シーケンスコードとヘッダービットが最初のヘッダーになるようにします。

私は一例で、次のバイトシーケンスに到達したときしかし、私は剥がれ来ています:

0x00 0x00 0x00 0x0E 

私はそれが別の起動シーケンスコードであると仮定すると、異なるバイトアライメントとしています。

00000000 00000000 00000000 00001110 00000110 00000001 00001001 00000000 

バイトアライメントの後、私は、次のヘッダバイト取得しています:ヘッダ(forbidden_​​zero_bit)の最初のビットは、それがゼロ

なければならない規則に違反ゼロで

00000 00000000 00000000 00000001 [1 10 00000] 

ここで私は立ち上がっていますか?

私はここで間違った仮定をしていますか?

答えて

2

MOVコンテナ(またはMP4)は、開始コード付きのAnnex Bエンコーディングを使用していません。これは、NALにNALUnitLengthフィールドを前置するMP4形式のエンコーディングを使用します。このフィールドは異なるサイズ(コンテナ内の他の場所で通知されるサイズ)でもかまいませんが、通常は4バイトです。あなたのケースでは、NALUnitLengthはおそらく4バイトで、3バイトのNALは2バイト(00 00 00 02)、14バイト(00 00 00 0E)、11016バイト(00 00 2B 08)のサイズです。

+0

ありがとうございますnobody555、この余分な情報は、多くの助けになり、今より意味をなさない。私は自分のベニフィットのサンプルサイズの原子データでこれを確認する必要がありますが、今はこれが明確であり、今は意味があります。乾杯。 – Pobbel

+0

これは、実際、これが記述されているように原子サイズに適合することを確認しました。 MOV開発者リファレンスhttps://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFPreface/qtffPreface.htmlでこのエンコーディングへの参照を見つけることができません。このエンコーディングは、ITU-T H.264の一部ですまたは多分ISO/IEC 14496-15? – Pobbel

+0

ITU-T H.264仕様の一部ではありません。おそらくISO/IEC 14496-15に関してはそうですが、私はそれにアクセスすることはできません(無料ではありません)ので、確かにそれを確認することはできません。 – nobody555

1

スタートコードは「バイトストリームフォーマット」(H.264 Annex B)で使用され、バイトアライメントされます。デコーダは、バイトシフトをビットシフトなしでチェックすることによって開始コードを識別するはずです。

MOV、MP4コンテナは、サンプルコードではプレフィックスなしのパラメータセットNAL単位を持つ独自の構造体(アトム、ボックス)を持ちますが、元のNAL単位として別々にデータ自体を持ちます。

あなたが引用したものはおそらく、NAL単位ではなくファイル構造のバイトに対応するMOVアトムの断片です。

+0

ありがとうございました。はい、データは 'mdat'アトムの先頭からのものです。 MOV形式のH.264エンコーディングについてもう少し詳しくお読みください。 – Pobbel

関連する問題