動画データ読み込みの実装
PixiJSでhttps://pixijs.download/release/docs/PIXI.VideoResource.html で読み込めるのかな
後学のために今はffmpegを直に使う
今はローカルファイルを対象に操作することにする。
ローカルファイルを操作する際にはFile System Access APIを用いる。
OPFS?
https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API#origin_private_file_system
読み込むんだけど、本当に読み込めるのかな。
例えばファイルが1GBとかあったら、その分メモリを消費することになるのかね。
Fragmented mp4で、Streamを使って部分的に読み出していくのが現実的か。
https://qiita.com/binzume/items/3ee9bdd590f92fa45fcf
動画のパスを指定
↓
ffmpegで fragmented を生成
↓
OPFSからStreamで読み込み
これにはWebWorkerが必要?
多分 createSyncAccessHandle()で必要になる
getDirectory()
https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/getDirectory
またChatGPTに聞いた。
なんとなく、分割する必要性を感じていたけど、別にFragmented MP4である必要性はない。
別件でBMP画像のフォーマットを読んでいたときも思ったけど、こういうデータは最初の方にメタデータを固めておくものだ。
MP4も同様である。
実際にデータを読み取る際に、動画の全データをメモリに読み込むことはできない
このため、mp4ファイルのヘッダー部からムービーの開始位置のオフセットを、メタデータ部からフレームあたりバイト数を取得する。
あとは、フレームあたりのバイト数とフレーム数との積と、オフセットの和から、特定フレームのデータが何バイト目か計算できる。
実際には、mp4ファイルはキーフレームを除いて、非圧縮フレームの依存関係を解決しないと特定フレームのビットマップ画像を得られない。
この作業をフレームに対する「解凍」と読んでいる。
解凍までの流れはわかったが、こういう仕組みなのを踏まえると、次の方法を取るべきだと思った。
1. 現在フレームに近い部分のmp4データは、先読みしてキャッシュする。
部分的に読み取る必要があるため、先に書いたアルゴリズムを実行して読み取り対象のバイトを決定する必要があるかもしれない。
バイトが計算できたら、[]
2. 次に、これをffmpegに渡して解凍する。
書き出しでは逆のことをする
フレーム連番画像を全部作る