MP4Box.js/ISOFile
#Mp4Box.js
ISOFile の意味
わからん・・・
いや、分かる!
ISO Base Media Fileのことですね!!先生!
ISOFile のプロパティ
stream
MP4Box.js/MultiBufferStream
パースの対象です。
このオブジェクトは各パーサに渡されます
ボックス
boxes
MP4Box.js/Box/ISOFile
パースによって見つかったボックスのうち、ルートにあるものはここにも追加されます
mdats
mdatボックスの配列
moofs
moofボックスの配列
注)
他のボックスとは違い、ISOFileではISOFileが含みうるボックスが直書きで定義されています
moov
moovボックス
MP4Box.js/Box/Moov
状態
コンストラクタに書いてあるもの
isProgressive
boolean
moovStartFound
boolean
ISOFileでは、データを追加で読み込ませる(主に)ごとに、ISOFileのもつ状態が変化していきます。
これはその代表例
moovボックスが見つかった場合にtrueになります
これはISOFile.parse()内で変化します
MP4Box.js/ISOFile#64282694cda40e0000314d61
sampleListBuilt
boolean
ISOFileでは、データをパースする際にSampleの配列を構築します。
構築が完了すると、sampleListBuiltはtrueになります
fragmentedTracks
MP4Box.js/Box/trakの配列
MP4Box.js/ISOFile/setSegmentOptionsに trak オブジェクトを渡して実行すると、trakオブジェクトがこの配列に追加される。
extractedTracks
MP4Box.js/Box/trakの配列
MP4Box.js/ISOFile/setExtractionOptionsに trak オブジェクトを渡して実行すると、trakオブジェクトがこの配列に追加される。
コンストラクタに書いてないもの(書いてよ・・・)
状態(イベントハンドラ呼び出し)
moovStartSent
readySent
sidxSent
ISOFileのメソッド
processSamplesの挙動関連
setSegmentOptions
MP4Box.js/ISOFile/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()を呼び出す
MP4Box.js/BoxParser#64282539cda40e0000dbc75f
2. ボックスのtypeを見ます
mdatの場合
ISOFlie.mdatsにボックスを追加
moofの場合
ISOFile.moofsにボックスを追加
moovの場合
ISOFile.moovStartFoundをtrueにする
MP4Box.js/ISOFile#64281372cda40e00007bf2b3
mdat、moof以外の場合
moovも含め、次の動作をします
ISOFileにボックス名と同じプロパティを追加し、そこにボックスを格納します
例:ISOFile.moov = box というように
processIncompleteBox
なぜMP4ファイルを分割してappendBuffer()しても上手くいくかというと、この関数があるからです
getSample
nullかSampleを返します
以下のいずれかの条件を満たすと、nullが返されます
ISOFile.moov が null
ヘルパー関数
MP4Box.js/getTrackById
ISOFileに直接生えているけど実はヘルパー関数だった
関数の依存先は最小限(=ISOFileという巨大なオブジェクトに依存しない)にしてほしいし、副作用のある関数減らしてほしいんだけど・・・・
内容
ISOFile.moov.traksの要素のうち、MP4Box.js/トラックIDが引数のIDと一致するものを返す、だけ
なぜかFor文で書かれている。それfindで書けますよ。
この関数はISOFile.moov.traksを検索する関数として覚えておきましょう
(MoovBoxを受け取る関数でよくない・・・?)
return: MP4Box.js/Box/trak
getTrackSample
これもほとんど中身がない
getTrackById()で Trak Box を取得し、それを getSample() に渡して値をそのまま返すだけ
うーんw