Mp4ファイル形式の解析



Mp4 File Format Parsing



現在、MP4の概念は非常に激しくそして非常に混沌としている。最初のMP4は、MPEG-2 AAC標準であるオーディオ(MP3のアップグレードバージョン)を指します。次に、MP4の概念が、MPEG-4標準に対応するビデオに転送されました。今日、私たちの通称は主にMPEG-4標準エンコーディングフォーマットでビデオを再生できるプレーヤーです。ただし、この記事の内容は上記とは関係ありません。 MP4ファイルのカプセル化形式について説明します。対応する規格はISO / IEC 14496-12です。これは、情報技術のオーディオビジュアルオブジェクトコーディングの12番目の部分であるISO基本メディアファイル形式です。 (情報技術視聴覚オブジェクトのコーディングパート12:ISOベースメディアファイル形式)。 ISO / IEC組織によって指定された規格は、一般に数値で表されます。ISO/ IEC 14496、MPEG-4規格です。

MP4ビデオファイルのカプセル化形式は、QuickTimeコンテナ形式に基づいて定義されているため、QuickTime形式の定義を参照すると、MP4ファイル形式を理解するのに役立ちます。 MP4ファイル形式は、ほとんどすべてのメディア構造を記述するために使用できる非常にオープンなコンテナです。 MP4ファイルのメディア記述はメディアデータとは別のものであり、メディアデータの編成も無料であり、必ずしも時系列である必要はありません。メディアデータでさえ、他のファイルを直接参照できます。同時に、MP4はストリーミングメディアもサポートしています。 MP4は現在、h.264ビデオとAACオーディオのパッケージ化に広く使用されており、HDビデオの代表的なものです。



それでは、MP4ファイル形式がどのように見えるかを見てみましょう。

1。概要



MP4ファイルのすべてのデータはボックス(QuickTimeのアトム)にインストールされます。つまり、MP4ファイルは複数のボックスで構成され、各ボックスにはタイプと長さがあり、ボックスはデータとして理解できます。オブジェクトブロック。ボックスには、コンテナボックスと呼ばれる別のボックスを含めることができます。 MP4ファイルには、最初に1つの「ftyp」タイプのボックスのみが含まれます。これはMP4形式の記号であり、ファイルに関する情報が含まれています。「moov」タイプのボックス(ムービーボックス)は1つだけです。コンテナボックスの場合、サブボックスにはメディアのメタデータ情報が含まれ、MP4ファイルのメディアデータは「mdat」タイプボックス(Midiaデータボックス)に含まれます。このタイプのボックスはコンテナボックスでもあります。存在しない可能性があります(メディアデータが他のファイルを参照している場合、メディアデータの構造はメタデータによって記述されます。

ここにいくつかの概念があります:

追跡 サンプルのコレクションを表します。メディアデータの場合、トラックはビデオまたはオーディオシーケンスを表します。



ヒントトラック この特定のトラックにはメディアデータは含まれていませんが、代わりに他のデータトラックをストリーミングメディアにパッケージ化するためのいくつかの手順が含まれています。

サンプル ヒント以外のトラックの場合、ビデオサンプルはビデオのフレーム、または連続するビデオフレームのセットであり、オーディオサンプルは連続した圧縮オーディオであり、まとめてサンプルと呼ばれます。ヒントトラックの場合、サンプルは1つ以上のストリーミングメディアパッケージの形式を定義します。

サンプルテーブル サルペのタイミングと物理的なレイアウトを示す表。

チャンク トラックの複数のサンプルで構成されるユニット。

この記事では、ヒントを含むコンテンツについては説明せず、メディアデータを含むローカルMP4ファイルに焦点を当てます。次の図は、一般的なMP4ファイルの構造を示しています。

2、ボックス

最初に注意することは、ボックス内のバイト順序はネットワークのバイト順序であり、これはビッグエンディアン(ビッグエンディアン)であるということです。つまり、32ビットの4バイト整数ストレージ方式が上位バイトです。メモリのローエンド。ボックスはヘッダーと本文で構成され、ヘッダーはボックスのサイズとタイプを一律に指定し、本文はタイプに応じて異なる意味と形式を持ちます。

標準ボックスの先頭にある4バイト(32ビット)はボックスサイズです。これには、ボックスのサイズとボックス本体が含まれているため、ファイル内の各ボックスを見つけることができます。サイズが1の場合、ボックスのサイズが大きいサイズであることを意味し、実際のサイズ値は大きいサイズのフィールドで取得されます。 (実際、「mdat」タイプのボックスのみが大きなサイズを使用する可能性があります。)サイズが0の場合、ボックスがファイルの最後のボックスであり、ファイルの終わりがボックスの終わりであることを意味します。 。 (また、「mdat」タイプのボックスにのみ存在します。)

サイズに続く32ビットはボックスタイプであり、通常は「ftyp」、「moov」などの4文字です。これらのボックスタイプはすでに事前定義されているため、意味が固定されています。 'uuid'の場合、ボックスがユーザー拡張タイプであることを意味します。ボックスタイプが未定義の場合、無視する必要があります。

3、ファイルタイプボックス(ftyp)

ボックスには1つしかなく、ファイルレイヤーにのみ含めることができ、他のボックスには含めることができません。ボックスはファイルの最初に配置する必要があり、MP4ファイルのアプリケーションに関する情報を示します。

「ftyp」本体には、32ビットのメジャーブランド(4文字)、32ビットのマイナーバージョン(整数)、および32ビット(4文字)のユニット要素を持つ互換性のあるブランドの配列が含まれます。これらはすべて、ファイルアプリケーションのレベルを示すために使用される情報です。ボックスのバイト例は次のとおりです。

4、ムービーボックス(moov)

ボックスにはファイルメディアのメタデータ情報が含まれ、「moov」はコンテナボックスであり、特定のコンテンツ情報はサブボックスによって解釈されます。ファイルタイプボックスと同様に、ボックスには1つしかなく、ファイルレイヤーにのみ含まれます。一般に、「moov」は「ftyp」の後に続きます。

通常の状況(スペースに制限されているため、この記事では一般的なMP4ファイル構造についてのみ説明します)では、「moov」には1つの「mvhd」といくつかの「trak」が含まれます。 'mvhd'はヘッダーボックスであり、通常は 'moov'の最初のサブボックスとして表示されます(他のコンテナボックスの場合、ヘッダーボックスは最初のサブボックスとして表示されます)。 「trak」にはトラックに関する情報が含まれており、コンテナボックスです。次の図は、パーツ「moov」のバイト例を示しています。ここで、赤い部分はボックスヘッダー、緑は「mvhd」、黄色の部分は「trak」です。

4.1ムービーヘッダーボックス(mvhd)

'mvhd'構造は次のとおりです。

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイトはversion = 0でカウントされます)

フラグ

3

作成時間

4

作成時間(UTC時間1904-01-01ゼロを基準とした秒数)

変更時間

4

時間を変更する

タイムスケール

4

1秒でのファイル媒体のスケール値は、1秒の長さの時間単位の数として理解できます。

デュレーション

4

トラックの長さは、期間と時間スケールの値を使用して、オーディオトラックの時間スケール= 8000、期間= 560128、期間が70.016、ビデオトラックの時間スケール= 600、期間= 42000、期間などのトラック期間を計算できます70です

割合

4

推奨される再生速度、上位16ビットと下位16ビットは、それぞれ小数点の整数部分と小数部分です。つまり、[16.16]形式で、値は1.0(0x00010000)であり、通常の順方向再生を示します。

ボリューム

レートと同様に、[8.8]形式、1.0(0x0100)は最大音量を示します

予約済み

10

予約ビット

マトリックス

36

ビデオ変換行列

事前定義済み

24

次のトラックID

4

次のトラックで使用されるID番号

'mvhd'のバイト例を以下に示します。各フィールドは色で区別されています。

4.2トラックボックス(トラック)

「trak」は、その子ボックスにメディアデータ参照とトラックの説明(ヒントトラックを除く)が含まれるコンテナボックスでもあります。 MP4ファイルのメディアには、複数のトラックと少なくとも1つのトラックを含めることができます。これらのトラックは互いに独立しており、独自の時間と空間の情報を持っています。 「trak」には、いくつかのオプションのボックス(省略)に加えて、「tkhd」と「mdia」が含まれている必要があります。 「tkhd」はトラックヘッダーボックスであり、「mdia」はメディアボックスです。ボックスは、いくつかのトラックメディアデータ情報ボックスを含むコンテナボックスです。

'trak'の部分バイトの例を以下に示します。ここで、黄色は 'trak'ボックスの先頭、緑は 'tkhd'、青は 'edts'(オプションのボックス)、赤は 'mdia'の一部です。

4.2.1トラックヘッダーボックス(tkhd)

'tkhd'構造は次のとおりです。

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイトはversion = 0でカウントされます)

フラグ

3

ビット単位または演算結果の値は、次のように事前定義されています。

0x000001 track_enabled、それ以外の場合、トラックは再生されません

0x000002 track_in_movie、再生中にトラックが参照されることを示します

0x000004 track_in_preview、プレビュー時にトラックが参照されることを示します。

通常、値は7です。メディアのすべてのトラックにtrack_in_movieとtrack_in_previewが設定されていない場合、ヒントトラックでは、すべてのトラックがこれら2つに設定されていることがわかります。値は0です。

作成時間

4

作成時間(UTC時間1904-01-01ゼロを基準とした秒数)

変更時間

4

時間を変更する

トラックID

4

ID番号、繰り返すことはできず、0にすることはできません

予約済み

4

予約ビット

デュレーション

4

トラックの長さ

予約済み

8

予約ビット

ビデオレイヤー、デフォルトは0、値は上位レイヤーで小さい

代替グループ

トラックグループ情報。デフォルトは0です。これは、トラックが他のトラックとグループ関係を持たないことを意味します。

ボリューム

[8.8]形式、オーディオトラックの場合、1.0(0x0100)は最大音量を示し、それ以外の場合は0です。

予約済み

予約ビット

マトリックス

36

ビデオ変換行列

4

高さ

4

[16.16]形式の値と、サンプルの説明にある実際の画像サイズの比率の両方が高く、再生中の表示の幅と高さに使用されます

'tkhd'のバイトの例を以下に示します。各フィールドは色で区別されています。


4.2.2メディアボックス(mdia)

「mdia」もコンテナボックスであり、その子ボックスの構造とタイプはまだ比較的複雑です。 'mdia'の樹形図の例を見てみましょう。


一般に、「mdia」はトラックメディアタイプとサンプルデータを定義し、サンプル情報を記述します。一般的な「mdia」には、「mdhd」、「hdlr」、および「minf」が含まれます。「mdhd」はメディアヘッダーボックス、「hdlr」はハンドラー参照ボックス、「minf」はメディア情報ボックスです。これらのボックスの構造を順番に見ていきましょう。

4.2.2.1メディアヘッダーボックス(mdhd)

'mdhd'構造は次のとおりです。

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイトはversion = 0でカウントされます)

フラグ

3

作成時間

4

作成時間(UTC時間1904-01-01ゼロを基準とした秒数)

変更時間

4

時間を変更する

タイムスケール

4

同じテーブル

デュレーション

4

トラックの長さ

言語

メディア言語コード。最上位ビットは0で、最後の15ビットは3文字です(ISO 639-2 / T標準で定義されています)。

事前定義済み

'mdhd'のバイト例を以下に示します。各フィールドは色で区別されています。

4.2.2.2ハンドラーリファレンスボックス(hdlr)

「hdlr」はメディアの再生プロセス情報を説明し、ボックスはメタボックス(メタ)に含めることもできます。 'hdlr'の構造は次のとおりです。

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイトはversion = 0でカウントされます)

フラグ

3

事前定義済み

4

ハンドラータイプ

4

メディアボックスでは、値は4文字です。

「ビデオ」—ビデオトラック

「Soun」-オーディオトラック

「ヒント」—ヒントトラック

予約済み

12

名前

不定

トラックタイプ名、「 0」で終わる文字列

'hdlr'のバイト例を以下に示します。フィールドは、すでに色で区切られています。


4.2.2.3メディア情報ボックス(minf)

'minf'は、トラックメディアデータを解釈するハンドラー固有の情報を格納します。この情報は、メディアハンドラーがメディア時間をメディアデータにマップして処理するために使用します。 'minf'の情報の形式と内容は、メディアタイプとメディアデータを解釈するメディアハンドラーに密接に関連しています。他のメディアハンドラーは、この情報を解釈する方法を知りません。 「minf」は、実際のコンテンツが子ボックスによって記述されるコンテナボックスです。

一般に、「minf」にはヘッダーボックス、「dinf」、「stbl」が含まれ、ヘッダーボックスはトラックタイプ(メディアハンドラーなど)に応じて「vmhd」、「smhd」、「hmhd」、「」に分割されます。タイプ)。 Nmhd '、' dinf 'はデータ情報ボックス、' stbl 'はサンプルテーブルボックスです。以下に別途紹介します。

次の図は、「minf」セクションのバイトの例を示しています。ここで、赤はボックスヘッダー、青は「smhd」、緑は「dinf」、黄色は「stbl」の一部です。

4.2.2.3.1メディア情報ヘッダーボックス(vmhd、smhd、hmhd、nmhd)

ビデオメディアヘッダーボックス(vmhd)

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイトはversion = 0でカウントされます)

フラグ

3

グラフィックモード

4

ビデオ合成モード。0の場合は元の画像をコピーします。それ以外の場合はopcolorで合成します。

opcolor

2×3

{0赤、緑、青

サウンドメディアヘッダーボックス(smhd)

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイトはversion = 0でカウントされます)

フラグ

3

残高

ステレオバランス、[8.8]フォーマット値、通常0、-1.0はすべての左チャンネルを意味し、1.0はすべての右チャンネルを意味します

予約済み

ヒントメディアヘッダーボックス(hmhd)

少し

ヌルメディアヘッダーボックス(nmhd)

非オーディオオーディオメディアは、このボックスをわずかに使用します。

4.2.2.3.2データ情報ボックス(dinf)

「dinf」はメディア情報を見つける方法を説明し、コンテナボックスです。 「dinf」には通常、データ参照ボックスである「dref」が含まれます。「dref」には、トラックデータを検索するためのテーブルを形成するいくつかの「url」または「urn」が含まれます。簡単に言うと、トラックはセグメントに分割でき、各セグメントは「url」または「urn」が指すアドレスに基づいて取得できます。サンプルの説明では、これらのセグメントのシーケンス番号を使用して、完全なセグメントを完全なトラックに形成します。一般に、データがファイルに完全に含まれている場合、「url」または「urn」の位置文字列は空です。

'dref'のバイト構造は次のとおりです。

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイトはversion = 0でカウントされます)

フラグ

3

エントリー数

4

'url'または 'urn'テーブルの要素の数

「url」または「urn」リスト

不定

「url」または「urn」はボックスであり、「url」の内容は文字列(場所の文字列)であり、「urn」の内容は文字列のペア(名前の文字列と場所の文字列)です。 'url'または 'urn'のボックスフラグが1の場合、文字列は空です。

以下は、「dinf」のバイト例です。黄色のボックスは「dinf」のボックスヘッダーです。赤い部分から、「url」または「urn」の数が1であり、赤い後に「url」ボックスの内容が続くことがわかります。紫は「url」のボックスヘッダー(ボックスタイプに応じて「url」であることがわかっています)、緑はボックスフラグ、値は1で、「url」の文字列が空であることを示します。トラックデータはすでにファイルに含まれています。

4.2.2.3.3サンプルテーブルボックス(stbl)

'stbl'は、通常のMP4ファイルで最も複雑なボックスです。まず、サンプルの概念を思い出す必要があります。サンプルはメディアデータストレージの単位であり、メディアのチャンクに格納されます。次の図に示すように、チャンクとサンプルの長さは互いに異なる場合があります。

'stbl'には、トラック内のサンプルのすべての時間と位置、およびサンプルのコーデックに関する情報が含まれています。この表を使用して、それぞれの保管容器内のサンプルのタイミング、タイプ、サイズ、および位置を説明できます。 'stbl'は、サブボックスに含まれるコンテナボックスです:サンプル説明ボックス(stsd)、サンプルまでの時間ボックス(stts)、サンプルサイズボックス(stszまたはstz2)、サンプルからチャンクボックス(stsc)、チャンクオフセットボックス(stcoまたはco64) )、サンプルボックスまでの合成時間(ctts)、サンプルボックスの同期(stss)など。

「stsd」は必須であり、少なくとも1つのエントリが含まれています。ボックスには、サンプルデータの情報検索用のデータ参照ボックスが含まれています。メディアサンプルの保存場所は、「stsd」なしでは計算できません。 「stsd」には、メディアタイプによって異なる情報を格納するエンコードされた情報が含まれています。

サンプル説明ボックス(stsd)

ボックスヘッダーとバージョンフィールドの後に、エントリ数フィールドがあります。エントリの数に応じて、各エントリには「vide」、「sund」などのタイプ情報があり、タイプに応じて、サンプルの説明は異なる情報を提供します。たとえば、ビデオトラック、「VisualSampleEntry」があります。 'タイプ情報、オーディオトラックには' AudioSampleEntry 'タイプ情報があります。

ビデオのエンコーディングタイプ、幅、高さ、オーディオチャネル、サンプリング、およびその他の情報がこのボックスに表示されます。

ボックスをサンプリングする時間(stts)

'stts'はサンプルの期間を格納し、サンプルタイミングのマッピング方法を記述します。サンプルは、いつでも見つけることができます。 'stts'には、時間とサンプル番号をマップするための圧縮テーブルと、各サンプルの長さとポインターを提供するための他のテーブルを含めることができます。表の各エントリは、同じ時間オフセットでの連続したサンプルシーケンス番号と、サンプルからのオフセットを提供します。これらのオフセットをインクリメントすることにより、テーブルをサンプリングするための完全な時間を作成できます。

サンプルサイズボックス(stsz)

「stsz」は、メディア内のすべてのサンプルの数と各サンプルのサイズを示す表を含む、各サンプルのサイズを定義します。この箱は比較的大きいです。

チャンクボックスへのサンプル(stsc)

サンプルをチャンクで整理すると、データ収集を簡単に最適化できます。サンクには1つ以上のサンプルが含まれています。 'stsc'では、テーブルを使用して、サンプルとチャンクの間のマッピング関係を記述します。この表を見てサンプルを見つけると、指定したサンプルを含むサンクを見つけることができます。

同期サンプルボックス(stss)

'stss'は、メディアのキーフレームを決定します。圧縮メディアデータの場合、キーフレームは、前のフレームに依存せずに解凍される一連の圧縮シーケンスの開始フレームであり、後続のフレームの解凍はこのキーフレームに依存します。 「stss」は、メディア内のランダムアクセスポイントを非常に正確にマークできます。サンプルのシーケンス番号テーブルが含まれています。表の各項目は、サンプルのシリアル番号に従って厳密に配置されており、メディア内のどのサンプルがキーフレームであるかを示しています。このテーブルが存在しない場合、各サンプルはキーフレームであり、ランダムアクセスポイントです。

チャンクオフセットボックス(stco)

「stco」は、メディアストリーム内の各サンクの場所を定義します。ロケーションには、32ビットと64ビットの2つの可能性があり、非常に大きな映画に役立ちます。テーブル内の可能性は1つだけです。この場所はファイル全体であり、ボックスではないため、ボックスを解釈せずにファイル内でメディアデータを直接見つけることができます。前のボックスが変更されると、ロケーション情報が変更されたため、このテーブルが再確立されることに注意してください。

5、フリースペースボックス(無料またはスキップ)

'free'の内容は無関係であり、無視できます。ボックスが削除された後は、再生には影響しません。

6、明田データボックス(mdat)

ボックスはファイルレイヤーに含まれており、メディアデータを保存するために使用できる場合とできない場合があります(メディアデータがすべて外部ファイル参照である場合)。データは、ボックスタイプフィールドの直後に続きます。特定のデータ構造の意味は、メタデータ(主にサンプルテーブルで説明されています)を参照する必要があります。

通常のMP4ファイルの構造が完成していて、面倒かもしれません。次の図は、ボックスの一般的なツリー構造図であり、MP4ファイルの構造を大まかに理解するために使用できます。

この記事は、主にMP4ファイルの構造についてあまり知らない初心者を対象としています。比較的基本的な記事です。また、いくつかの情報を書きましたが、MP4ファイルに関連するいくつかの概念を深く理解していませんでした。誤解があるはずですので、ぜひこの記事を批判的に読んでいただきたいと思います。何か問題がありましたらお知らせください。

この記事は主に、標準およびネチズンのwqyuwssブログシリーズの記事を参照しています。 Mp4ファイル形式

元のリンク:http://blog.sina.com.cn/s/blog_48f93b530100jz4x.html