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