MP4Box.js/Box/trak
MP4Box.jsのAPIや、コード中で trak という名前が使われていたら、おそらくこのオブジェクトだと考えてよいでしょう
trak の生成
trakを定義するための専用のファイルはありません
多くのボックスでは、「ボックスのタイプ.js」という名前でファイルが存在しています
例:tkhd.js
trakオブジェクトの生成過程はいくつかの関数に分散しているため、1つ1つ丁寧に追っていきましょう
1. ISOFile.appendBuffer()が実行される
2. ISOFile.appendBuffer() は ISOFile.parse() を呼び出す
3. moovボックスのparse
4. ISOFile.appendBuffer() に戻る
5. ISOFile.appendBuffer() は ISOFile.buildSampleLists() を呼び出す
6. ISOFile.buildSampleLists() は ISOFile.buildTrackSampleLists() を呼び出す
ここで、trakオブジェクトに samples プロパティが追加されます
以降、パースによって得られたtrakオブジェクトのプロパティを使って、samplesの内容が計算されていきます
samples_duration, samples_size もこのタイミングです
7. ISOFile.buildSampleLists() は ISOFile.initSampleGroups()を呼び出す
8. ISOFile.buildSampleLists() は stsz の内容からサンプルテーブルの全要素を読みます まあ、いいや^^
trak のプロパティ
samples
ISOFile.parse()を実行して、trakがパースされる時点では、trakオブジェクトは次のような構造になります(多分):
構造
type
size
uuid
boxes
tkhd
edts
mdia
理由
trakはCOTAINER_BOX
BoxParser.initalize()が実行されるとき、BoxParser.createContainerBoxCtor()が呼び出され、
BoxParser.trakBoxというコンストラクタ関数が生えます
この関数は、
1. BoxParser.ContainerBox()を呼び出す
この関数の内容は、thisに対して type, size, uuid, boxes プロパティを追加するというものです
2. BoxParser.addSubBoxArrays()を呼び出す
そして、ISOFile.appendBuffer()に制御が戻った後、moovプロパティの有無をたしかめたうえで、ISOFile.buildSampleLists()が呼び出されます
こうして、samplesプロパティが追加され、内容が計算されます