ストリームでの配置
AVIFile には、データ ストリーム内の位置を見つけて移動する方法がいくつか用意されています。 このセクションの関数とマクロを使用すると、アプリケーションはストリーム内の開始位置、長さ、およびキー フレーム (サンプル内の完全なイメージを含む) を見つけることができます。 また、関数とマクロは、ストリームの先頭から任意の時点までストリームを再生するために必要な経過時間を計算することで、ストリーム内の位置に時間を関連付けます。
開始位置の検索
AVIStreamStart 関数を使用して、ビデオ ストリーム内の最初のフレームのサンプル番号を取得できます。 (映画のフレームは、作成者の好みに応じて、サンプル 0 または 1 から始まる場合があります)。この情報は、 AVIStreamInfo 関数を使用して取得することもできます。 この関数は、AVISTREAMINFO 構造体の dwStart メンバーにサンプル番号を格納します。 AVIStreamStartTime マクロを使用すると、ストリームの最初のサンプルの開始時刻を取得できます。
AVIStreamLength 関数を使用してストリームの長さを取得できます。 この関数は、ストリーム内のサンプルの数を返します。 この情報は、 AVIStreamInfo 関数を使用して取得することもできます。 この関数は、AVISTREAMINFO 構造体の dwLength メンバーにストリーム長を格納します。 ストリームの長さをミリ秒単位で取得するには、 AVIStreamLengthTime マクロを使用します。
ビデオ ストリームでは、各サンプルは通常、ビデオのフレームに対応します。 ただし、ビデオ データが存在しないサンプルが存在する場合があります。 これらの位置のいずれかを指定して AVIStreamRead 関数を呼び出すと、0 バイトのデータ長が返されます。 AVIStreamFindSample 関数を使用し、FIND_ANY フラグを指定することで、データを含むサンプルを見つけることができます。
オーディオ ストリームでは、各サンプルはオーディオ データの 1 つのデータ ブロックに対応します。 たとえば、オーディオ データに 22 kHz ADPCM (アダプティブ差動パルス コード変調) 形式がある場合、 AVIStreamLength の各サンプルは 256 バイトの圧縮オーディオ データのブロックに対応します。 このオーディオ データ ブロックには、非圧縮時に約 500 個のオーディオ サンプルが含まれます。 ただし、AVIFile の関数とマクロは、各 256 バイト ブロックを 1 つのサンプルとして扱います。
Note
ストリームの開始から終了までのストリーム範囲内の有効な位置。これは、ストリームの開始点とその長さの合計です。 開始位置と長さの合計で表される位置は、最後のデータがレンダリングされた後の時刻に対応します。データは含まれません。 AVIStreamEnd マクロを使用して、ストリームの末尾を表すサンプル番号を取得できます。 AVIStreamEndTime マクロを使用すると、ストリームの終了を表す時間値をミリ秒単位で取得できます。
サンプル フレームとキー フレームの検索
AVIStreamFindSample 関数を使用して、ストリーム内のさまざまな種類のサンプルを検索できます。 この関数は、指定したサンプル番号から始まる適切な型のサンプルを、ストリームを後方または前方に検索します。 AVIStreamFindSample 呼び出しシーケンスでフラグを指定することで、ストリーム内のさまざまな種類のサンプルを検索できます。 FIND_ANY フラグを指定して、空でないサンプルを見つけたり、データがないサンプルをスキップしたりします。 FIND_KEY フラグを指定して、データを含むキー フレームを検索し、前のフレームを参照することなく完全なイメージをレンダリングします。 FIND_FORMAT フラグを指定して、形式の変更を検索します。 AVIStreamFindSample は、主にビデオ ストリームで使用されます。
AVIFile 関数を使用するいくつかのマクロは、ストリーム検索機能を補完します。 次の一覧では、各マクロの簡単な説明を示します。 特定の位置またはデータ型を検索するマクロでは、ストリームで開始位置を指定する必要があります。
マクロ | 説明 |
---|---|
AVIStreamIsKeyFrame | 指定したストリーム内のサンプルがキー フレームであるかどうかを示します。 |
AVIStreamNearestKeyFrame | ストリーム内の指定した位置の前後にあるキー フレームを検索します。 |
AVIStreamNearestKeyFrameTime | ストリーム内の指定した時刻に最も近い (またはそれ以前の) キー フレームの先頭に対応する時間を決定します。 |
AVIStreamNearestSample | ストリーム内の指定した位置またはそれ以前の最も近い空でないサンプルを検索します。 |
AVIStreamNearestSampleTime | ストリーム内の指定した時刻に最も近いサンプルの先頭に対応する時間を決定します。 |
AVIStreamNextKeyFrame | ストリーム内の指定した位置に続く次のキー フレームを検索します。 |
AVIStreamNextKeyFrameTime | ストリーム内の次のキー フレームの時刻を、指定された時刻から返します。 |
AVIStreamNextSample | ストリーム内の指定した位置から次の空でないサンプルを検索します。 |
AVIStreamNextSampleTime | ストリーム内の次のサンプルにサンプルが変更された時刻を返します。 |
AVIStreamPrevKeyFrame | ストリーム内の指定した位置の前にあるキー フレームを検索します。 |
AVIStreamPrevKeyFrameTime | ストリーム内の前のキー フレームの時刻を、指定された時刻から返します。 |
AVIStreamPrevSample | ストリーム内の指定した位置の前に存在しないサンプルを検索します。 |
AVIStreamPrevSampleTime | 前のサンプルがストリーム内の先行処理を置き換える時刻を決定します。 |
AVIStreamSampleToSample | 2 番目のストリームで発生するサンプルと同時に発生するストリーム内のサンプルを返します。 |
サンプルと時間の切り替え
AVIStreamSampleToTime 関数を使用して、ストリームの先頭からサンプルまでの経過時間を確認できます。 この関数は、サンプル番号をミリ秒単位で表される時間値に変換します。 ビデオ フレーム (数ミリ秒) の場合、この値は、再生が開始されてからサンプルが再生を開始する時間を表し、ビデオ クリップが通常の速度で再生されると想定します。 オーディオ サンプル (ミリ秒単位のサンプル数) の場合、時間値はサンプルの再生を開始する時刻に対応し、オーディオ ストリームが通常の速度で再生されると想定します。
逆に、 AVIStreamTimeToSample 関数を使用して、時間値に関連付けられているサンプル番号を見つけることができます。 この関数は、ミリ秒の値をサンプル番号に変換し、ビデオ クリップが通常の速度で再生されていることを前提としています。
AVIStreamSampleToTime はフレームの再生を開始する時刻を返すので、AVIStreamSampleToTime と AVIStreamTimeToSample の関係は本当に逆ではありません。 ファイル内の位置は、時間を決定するよりも正確に決定されます。 たとえば、2 つの連続するオーディオ サンプルが両方とも同じミリ秒で再生される場合があります。 AVIStreamSampleToTime を使用してサンプル番号を変換すると、同じ時間値になります。 AVIStreamTimeToSample を使用して時間値をサンプル番号に変換すると、1 つのサンプルが参照されます。