Share via


位置の設定と取得

フィルタ グラフは、現在位置と停止位置の 2 つの位置値を保持する。これらの位置は次のように定義される。

  • グラフの実行中、現在位置はソースの先頭を基準にした現在の再生位置である。グラフが停止するかポーズ状態になったとき、現在位置は次の実行コマンドでストリーミングが始まる位置になる。
  • 停止位置はストリームが終了する位置である。グラフが停止位置に達すると、データはストリームされなくなり、フィルタ グラフ マネージャは EC_COMPLETE イベントを送信する。(ただし、グラフは自動的に停止状態には切り替わらない。詳細については、「イベントへの応答」を参照すること)。

これらの値を取得するには、IMediaSeeking::GetPositions メソッドを呼び出す。戻り値は常に元のメディア ソースに対する相対値である。デフォルトでは、値は基準タイム単位である。場合によっては、時間単位を変更できる。詳細については、「シーク コマンドのタイム フォーマット」を参照すること。

新しい位置にシークするか、新しい停止位置を設定するには、次の例に示すように、IMediaSeeking::SetPositions メソッドを呼び出す。

#define ONE_SECOND 10000000
REFERENCE_TIME rtNow  = 2 * ONE_SECOND, 
               rtStop = 5 * ONE_SECOND;

hr = pSeek->SetPositions(
    &rtNow,  AM_SEEKING_AbsolutePositioning, 
    &rtStop, AM_SEEKING_AbsolutePositioning
    );

 :  1 秒は基準タイム単位で 10,000,000 である。便宜上、例ではこの値を ONE_SECOND として定義している。DirectShow 基底クラス ライブラリを使っている場合、定数 UNITS は同じ値を持つ。

rtNow パラメータは新しい現在位置を指定する。2 番目のパラメータは、rtNow の解釈方法を定義するフラグである。この例で、AM_SEEKING_AbsolutePositioning フラグは、rtNow がソースの絶対位置を指定することを示している。したがって、フィルタ グラフはストリームの先頭から 2 秒の位置にシークする。rtStop パラメータは終了タイムを指定する。最後のパラメータは、rtStop も絶対位置であることを指定する。

前の位置値からの相対位置を指定するには、AM_SEEKING_RelativePositioning フラグを使う。位置値のいずれか 1 つを変更しないまま残すには、AM_SEEKING_NoPositioning フラグを使う。その場合、対応する時間パラメータは NULL でもよい。次の例では、停止位置を変更せずに、10 秒先までシークする。

REFERENCE_TIME rtNow = 10 * ONE_SECOND;
hr = pSeek->SetPositions(
    &rtNow, AM_SEEKING_RelativePositioning, 
    NULL, AM_SEEKING_NoPositioning
    );

フィルタ グラフを停止すると、ビデオ レンダラはシーク操作後にイメージを更新しない。ユーザーにとっては、シークが発生しなかったかのように見える。イメージを更新するには、シーク操作後にグラフをポーズする。グラフをポーズすることで、ビデオ レンダラに新しいビデオ フレームが挿入される。グラフをポーズした後、停止する IMediaControl::StopWhenReady メソッドを使えばよい。