MP4 Sample, Chunk, Table - uupaa/H264.js GitHub Wiki
MP4 Sample, Chunk, Table
MP4 Box 構造から、ビデオとオーディオの切れ目を知るためには、stsc と stco を参照します。 さらに stsz の内容からフレームごとのデータの位置とサイズを知る事ができます。 再生時にビデオとオーディオの同期を取るには stts を参照してビデオの各フレーム、オーディオフレーム(格納単位)ごとの再生時間、さらに再生すべき時刻を取得します。
- Sample
- Sample は 1つのピクチャを構成する最小の単位のことです
- IDR, Iピクチャなどの KeyFrame を構成する AccessUnit が含まれています
- Sample のサイズ, 表示時刻などのヘッダ情報は、
moovに格納されます - Sample のデータ(Stream)は
mdatに格納されます - MP4 においては映像のヘッダとデータは別々の場所に格納されます
- Chunk は複数の Sample をグループとしてまとめた単位のことです。
- Chunk のデコード方法は
stsd(Sample Description) で定義します - Sample Description は Chunk のデコード方法を記したもので、
avc1とavcCを総称したものです
- Chunk のデコード方法は
avc1avc1にはピクチャを復元するために必要となるwidth,heightとframe_count` が記載されています
avcCavcCにはピクチャを復元するために必要となる SPS と PPS が格納されています
sttsはサンプルの再生時間のリストですstcoはチャンクがファイルの何処に配置されているか(offset)のリストですstco.chunk_offsetに指定する値はファイルの先頭からのオフセット値ではなく、mdat+ 4 byte からのオフセット値ですstco.chunk_offset = 0ならmdatの先頭にチャンクがあるという意味になります
mdat Stream
| mdat | | stsc | | stsz | | stsd |
+--------------+ +--------------+ +--------------+ +---------------+
| | | | | Sample 1 | | Sample |
| | | | +--------------+ | Description |
| | | Chunk 1 | | Sample 2 | | |
| | | | +--------------+ | |
| | | | | Sample 3 | | |
| | +--------------+ +--------------+ +---------------+
| | +--------------+ +--------------+ +---------------+
| | | | | Sample 4 | | Sample |
| | | | +--------------+ | Description |
| | | Chunk 2 | | Sample 5 | | |
| | | | +--------------+ | |
| | | | | Sample 6 | | |
| | +--------------+ +--------------+ +---------------+
| | +--------------+ +--------------+ +---------------+
| | | Chunk 3 | | Sample 7 | | Description |
| | +--------------+ +--------------+ +---------------+
| | +--------------+ +--------------+ +---------------+
| | | Chunk 4 | | Sample 8 | | Description |
+--------------+ +--------------+ +--------------+ +---------------+
Sample Description: width, height, frame_count, profile, level, SPS, PPS