MP4Box.js/ISOFile
ISOFile の意味
わからん・・・
いや、分かる!
ISOFile のプロパティ
stream
パースの対象です。
このオブジェクトは各パーサに渡されます
ボックス
boxes
パースによって見つかったボックスのうち、ルートにあるものはここにも追加されます
mdats
mdatボックスの配列
moofs
moofボックスの配列
注)
他のボックスとは違い、ISOFileではISOFileが含みうるボックスが直書きで定義されています
moov
moovボックス
状態
コンストラクタに書いてあるもの
isProgressive
boolean
moovStartFound
boolean
ISOFileでは、データを追加で読み込ませる(主に)ごとに、ISOFileのもつ状態が変化していきます。
これはその代表例
moovボックスが見つかった場合にtrueになります
これはISOFile.parse()内で変化します
sampleListBuilt
boolean
ISOFileでは、データをパースする際にSampleの配列を構築します。 構築が完了すると、sampleListBuiltはtrueになります
fragmentedTracks
extractedTracks
コンストラクタに書いてないもの(書いてよ・・・)
状態(イベントハンドラ呼び出し)
moovStartSent
readySent
sidxSent
ISOFileのメソッド
processSamplesの挙動関連
setSegmentOptions
setExtractionOptions
processSamplesを呼び出す
start()
1. sampleProcessingStartedをtrueにする
2. processSamples(false)
end()
sampleProcessingStartedをfalseにするだけ。
flush()
1. updateSampleLists()
2. processSamples(true)
など
processSamples()
seek()
シークという名前ですが、ISOFileの状態は変更しません
time
シークしたい時間
コード内に time / timescaleという
useRap
返値は { offset: number, time: number }
offset
time
最終的にシークする時間
内容
moov.traksの各要素をseekTrack()に渡す
渡してトラックの offset, time を得る。
最終的に offset, time について、それぞれ最小のものを返す。
イメージとしては、次のようなコードになる。
code: seek_content.ts
const seek = (time: number, useRap: boolean) => {
if (!this.moov) throw new Error();
const seekInfos = this.moov.traks.map(trak => this.seekTrack(time, useRap, trak));
const trakOffsets = seekInfos.map(info => info.offset);
const trakTimes = seekInfos.map(info => info.time);
return {
offset: Math.min(trakOffsets),
time: Math.min(trakTimes)
};
}
seekTrack()
parse
パースと口では言っていますが、ISOFileの状態を変更する作用を持っています
内容
1. BoxParser.parseOneBox()を呼び出す
2. ボックスのtypeを見ます
mdatの場合
ISOFlie.mdatsにボックスを追加
moofの場合
ISOFile.moofsにボックスを追加
moovの場合
ISOFile.moovStartFoundをtrueにする
mdat、moof以外の場合
moovも含め、次の動作をします
ISOFileにボックス名と同じプロパティを追加し、そこにボックスを格納します
例:ISOFile.moov = box というように
processIncompleteBox
なぜMP4ファイルを分割してappendBuffer()しても上手くいくかというと、この関数があるからです
getSample
nullかSampleを返します
以下のいずれかの条件を満たすと、nullが返されます
ISOFile.moov が null
ヘルパー関数
ISOFileに直接生えているけど実はヘルパー関数だった
関数の依存先は最小限(=ISOFileという巨大なオブジェクトに依存しない)にしてほしいし、副作用のある関数減らしてほしいんだけど・・・・
内容
なぜかFor文で書かれている。それfindで書けますよ。
この関数はISOFile.moov.traksを検索する関数として覚えておきましょう
(MoovBoxを受け取る関数でよくない・・・?)
getTrackSample
これもほとんど中身がない
getTrackById()で Trak Box を取得し、それを getSample() に渡して値をそのまま返すだけ
うーんw