MP4ファイル形式の解析とMP4ファイルのセグメンテーションアルゴリズム



Parsing Mp4 File Format



現在、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ファイルの構造を示しています。

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文字)単位の互換性のあるブランドの配列が含まれます。これらはすべて、ファイルアプリケーションのレベルを示すために使用される情報です。ボックスのバイト例は次のとおりです。

mp4()

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

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

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

mp4()

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

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

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイト数はバージョン= 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'のバイト例を以下に示します。各フィールドは色で区別されています。

mp4()

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

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

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

mp4()

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

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

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイト数はバージョン= 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'のバイト例を以下に示します。フィールドは、すでに色で区切られています。

mp4()


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

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

mp4()


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

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

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

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイト数はバージョン= 0によるものです)

フラグ

3

作成時間

4

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

変更時間

4

時間を変更する

タイムスケール

4

同じテーブル

デュレーション

4

トラックの長さ

言語

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

事前定義済み

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

mp4()

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

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

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイト数はバージョン= 0によるものです)

フラグ

3

事前定義済み

4

ハンドラータイプ

4

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

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

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

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

予約済み

12

名前

不定

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

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

mp4()


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

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

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

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

mp4()

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

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

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイト数はバージョン= 0によるものです)

フラグ

3

グラフィックモード

4

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

opcolor

2×3

{0赤、緑、青

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

フィールド

バイト数

意義

ボックスサイズ

4

ボックスサイズ

ボックスタイプ

4

ボックスタイプ

バージョン

1

ボックスのバージョン0または1は、通常0です。(次のバイト数はバージョン= 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です。(次のバイト数はバージョン= 0によるものです)

フラグ

3

エントリー数

4

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

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

不定

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

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

mp4()

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

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

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ファイルの構造についてあまり知らない初心者を対象としています。比較的基本的な記事です。私もいくつかの参考文献を書きました。私はMP4ファイルに含まれるいくつかの概念を深く理解していません。誤解があるはずですので、ぜひこの記事を批判的に読んでいただきたいと思います。

出典:http://blog.csdn.net/chenchong_219/article/details/44263691

Mp4は、QuickTimeに由来する、より複雑なメディア形式と見なす必要があります。私は研究、特にそれを完全に統合する方法に多くの時間を費やしました。 ビデオオンデマンド アプリケーションでは、それは使い果たされています、主な問題は、mp4ファイルの巨大な「メディアヘッド」を処理することです。もちろん、オンデマンドのストリーミングメディアはflv形式で実行することもでき、flvはH.264ビデオデータをカプセル化することもできますが、Adobeはこれを推奨していません、人々はmp4がH.264に最適なストレージ形式であると言います。

最近、分解とマージのプログラムをマージしたmp4ファイルの解析プログラムをコンパイルしてリファクタリングしました。以前はC言語で書かれていました。 Linux上で実行されているサーバープログラムに適用されます。現在はc ++に変更されており、他のプロジェクトで便利です。 c#のコピーを移植する必要がない限り、しばらくは使用できないので、それについて話しましょう。この記事では、最初にmp4ファイルの一般的な構造とそのセグメンテーションアルゴリズムを簡単に紹介し、次にオンデマンドプロジェクトでmp4を完全に適用する方法についての記事を書きます。

まず、MP4形式の分析

MP4 (MPEG-4 Part 14)は、「ISO / IEC 14496-14」標準ファイルで定義されている一般的なマルチメディアコンテナ形式であり、MPEG-4の一部であり、「ISO / IEC 14496-12(MPEG -4 Part 12ISOベース」です。メディアファイル形式)メディアファイル構造の共通標準を定義する、標準で定義されたメディア形式の実装。 MP4はコンテナ形式のより包括的な説明であり、あらゆる形式のデータを埋め込むことができると考えられています。エンコードされたすべての種類のビデオ、オーディオなどは言葉ではありませんが、一般的なMP4ファイルのほとんどは保存されます。 AVC(H.264) または MPEG-4(パート2) コード化されたビデオと AAC エンコードされたオーディオ。 MP4形式の公式ファイル拡張子は「.mp4」であり、他のmp4ベースの拡張子または形式の縮小バージョンがあります。 M4V3GPF4V 待つ。

Mp4は1つの「ボックス」で構成されています。大きなボックスには小さなボックスが格納され、最初のレベルはメディア情報を格納するために1つのレベルにネストされます。ボックスの基本構造は次のとおりです。

その中で、サイズはヘッダー部分を含むボックス全体のサイズを示します。ボックスが大きい場合(たとえば、特定のビデオデータを保持するmdatボックス)、uint32のサイズを超え、サイズは1に設定され、次の8ビットuint64がサイズの格納に使用されます。

mp4ファイルには多くのボックスが含まれている可能性があるため、このページでの解析が大幅に複雑になります。 http://mp4ra.org/atoms.html 現在登録されているボックスタイプのいくつかを記録しました。たくさんの箱を見て、ひとつひとつ支えたいと思ったら、頭が破裂するのではないかと思います。幸い、ほとんどのmp4ファイルにはそれほど多くのボックスタイプがありません。次の図は、単純化された一般的なmp4ファイル構造です。

一般に、メディアファイルの解析で最も重要な部分は、幅、高さ、コードレート、エンコード形式、フレームリスト、ビデオファイルのキーフレームリスト、およびファイル内の対応するタイムスタンプと場所です。 mp4では、特定のアルゴリズムによってstblボックスの下のいくつかのボックスに保存されます。メディア情報を復元するには、stblの下のすべてのボックスを解析する必要があります。次の表は、上記の重要なボックスストレージ情報の説明です。

ほら、mp4ファイルのフレームリストを取得するのは簡単ではありません。解析のレイヤーが必要です。次に、フレームリストを復元するために、stts stsc stsz stssstcoなどのこれらのボックスの情報を統合します。各フレームのポケとオフセット。さらに、表示される場合と表示されない場合があるボックスに注意する必要があります。 。 。 mp4はフレームサンプル、つまりチャンクをグループ化し、チャンクを介してフレームを間接的に記述する必要があることがわかります。これは、ストレージスペースを圧縮でき、メディア情報が占めるファイルサイズを削減できるためです。ここで、stscボックスの解析は比較的複雑であり、特に導入部で、サンプルとチャンクの間のマッピング関係を説明するために巧妙な方法を使用しています。

これがstscボックスの構造です。最初のいくつかの項目の意味は説明されていません。 stscボックスの各エントリ構造に3つのデータがあることがわかります。彼らは意味します: first_chunk このチャンク番号が始まり、各チャンクには samples_per_chunk 数のサンプル、および各サンプルは合格することができます sample_description_index このインデックスは、stsdボックス内の説明を検索します。つまり、各エントリ構造は、同じ特性を持つチャンクのセットを記述します。つまり、各チャンクには次のものが含まれます。 samples_per_chunk サンプル、わかりました、それでは、同じ特性のチャンクがいくつあるかを尋ねる必要がありますか?次のエントリ構造を使用して計算し、次のエントリを使用してください first_chunk 今回はマイナス first_chunk 、このグループのチャンクの数を取得します。最後のエントリ構造は、 first_chunk 最後のチャンクまで、すべてのチャンクは sampls_per_chunk サンプル。とても一口ですが、それが意味することです。 :) 。このアルゴリズムはファイルのすべてのチャンクの数を知ることができないため、stcoまたはco64を使用する必要があります。コードに直接記載する方が明確な場合があります。

1.最初にエントリを直接分析します

2.次に、stcoまたはco64でチャンクの総数を確認した後、マッピングテーブルの復元を開始します。

stscを読んだ後、stblの下にあるすべてのボックスを合成し、ビデオとオーディオのフレームリスト、タイムスタンプ、およびオフセットを計算できます。以下のスクリーンショットは、取得したキーフレームのリストを示しています。

キーフレームリストを使用して、次の質問に進むことができます。 mp4ファイルのセグメンテーション 。 mp4セグメンテーションの実現は、mp4をオンデマンドシステムに適用する上で最も重要な技術的リンクです。これが不可能な場合、mp4ビデオをオンデマンドで実装することはできません。 引っ張る 」。

第二に、MP4ファイルセグメンテーションアルゴリズム

いわゆる「セグメンテーション」は、mp4セグメンテーションを実現するために、大きなファイルを小さなファイルにカットすることです。

  • まず、キーフレームのリストを取得する必要があります。
  • 次に、分割する期間を選択します(たとえば、キーフレームから開始します)
  • 次に、moovボックスを再生成します(関連するすべてのボックスとボックスサイズを変更する必要があることに注意してください)
  • 最後に、対応するデータをコピーして新しいファイルを生成します。

すでに上で紹介した最初のポイント、2番目のポイント、キーフレームリストをトラバースするだけで済みます。分割する期間に最も近いキーフレームを見つけることができます。4番目のポイントは「コピーアンドペースト」の作業です。 、鍵3点目です。この手順にはstblの下のすべてのボックスが含まれるため、エントリを再生成する必要があります。同様に、他のボックスは問題ありません。キーフレームに対応するサンプルとチャンクを保持するだけで済みます。 stscボックスを比較するだけで、残りは削除できます。問題、言うのは厄介です、または単にコードを直接見てください:

ボックスを変更した後、moovボックスを再生成する必要があります。 moovボックスのサイズと期間が変更されたため、ボックスのサイズを変更する必要があります。これを忘れてはなりません。そうしないと、プレーヤーがエラーを解析します。ボックスを再生成した後、分割データの長さも計算する必要があります。データ長も変更されたため、mdatボックスのサイズを変更します。また、stblの下にあるすべてのボックスのチャンクオフセットも変更する必要があります。覚えておいてください。

以下は、論理プロセス全体です。

さて、これがすべて達成された後、mp4オンデマンドシステムを実行するための条件があります。ただし、mp4をオンデマンドで実行するには、解決する必要のある他の問題がいくつかあります。これについては、次の記事で説明します。

出典:http://blog.csdn.net/chenchong_219/article/details/44263587