MP4ファイルを部分的にストリームから読み取る → フレーム解凍
やりたいこと
再生ヘッドがあるフレームにあるとする。
このフレームにおける動画エンティティのフレーム画像を得たい。
しかしMP4では、キーフレーム以外のフレームは圧縮されている。
そのため、キーフレーム以外のフレームをビットマップ画像として取得するには、フレームに対応する参照フレームを取得しなければならない。
実際には、参照フレームの状態を元にフレームを解凍する作業は、動き補償などもあって単に差分を重ねれば済む話ではない。
私は、単にフレームの画像を取得したいだけである。
フレームの画像を取得するにあたって、該当フレームとその参照フレームの値さえ分かれば、ffmpegなどのソフトウェアに渡すことでフレームを解凍できる仕組みである。
つまり、必要なものは何かというと、
「フレームに対する参照フレームのバイト列を読み込む」ことである。
部分的なmp4ファイルであれ、必要なフレーム情報を読み込むことができれば、フレームを解凍できるはずだ。
したがって、次のことをする。
1. ffmpegで、mp4ファイルにおける該当フレームのオフセットを取得する
2. 参照フレームのオフセットを取得する
3. Blob.slice()で、ファイルハンドラの参照先を 1. 2. で得たバイト位置に限定する
4. ReadableStreamで読み取る
ArrayBufferでもいいですね。
動画データ読み込みの実装
5. 読み取ったバイト列をffmpegに渡す
6. フレーム画像を取得する
このように、ファイルの読み取り範囲を限定することで、プレビューにおけるメモリの消費量を抑えられるかもしれない・・・。
書き出すときは、もっと大きい範囲でメモリに読み取ったほうがいいかもしれない。
メモ
ChatGPTに聞いたら、該当フレームのデータから参照フレームのオフセットを取得することは可能とのこと。
理由は、該当フレームは参照フレームからの差分であり、参照フレームを識別できないと解凍できないから。
当然だ。