フレームを連続して解凍する場合のAVIStreamGetFrame()の使い方

 AVIStreamGetFrame()は AVIStreamGetFrameOpen()によって得られたハンドルを利用して ストリームから任意の1フレームを解凍します。AVIStreamGetFrame()は解凍された DIBのアドレスを返しますから、DIBの使用後は、AVIStreamGetFrameClose()によって そのDIB領域を解放する必要があります。

 ですから、1フレームの切り出しはAVIStreamGetFrameOpen()、AVIStreamGetFrame()、AVIStreamGetFrameClose() で1セットになります。

 連続してフレームを切り出す場合、上記の3関数の呼び出しをセットにして繰り返すのが本来の やり方ですが、MS-MPEG4などの場合、AVIStreamGetFrameOpen()を呼び出す度に キーフレームからの差分を計算しているようで、解凍すべきフレームが キーフレームより遠くなるに比例して時間がかかるようになります。

 このような場合には、1度だけ、AVIStreamGetFrameOpen()を呼び出し、 そのあとは連続してAVIStreamGetFrame()を使い、AVIStreamGetFrameClose()を呼び出すという 方法をとらざろうえません。また他のコーディックを使用する場合でも、 AVIStreamGetFrame()を連続して呼び出す方法を利用できますが、 一部のコーディックで動作が不安定になることがあるようです。

プログラム例 av31.cpp(ソースファイル)  av31.exe(実行ファイル)