Share via


位置の設定と取得

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

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

  • グラフが実行されている場合、現在の位置はソースの先頭を基準とした現在の再生位置です。 グラフを停止または一時停止すると、現在の位置は、次の実行コマンドでストリーミングが開始されるポイントです。
  • 停止位置は、ストリームが終了するポイントです。 グラフが停止位置に達すると、それ以上データはストリーミングされません。フィルター グラフ マネージャーは 、EC_COMPLETE イベントを投稿します。 (ただし、グラフは自動的に停止状態に切り替わるわけではありません。詳細については、「 イベントへの応答」を参照してください)。

これらの値を取得するには、 IMediaSeeking::GetPositions メソッドを 呼び出します。 返される値は、常に元のメディア ソースに対して相対的です。 既定では、値は参照時間単位です。 場合によっては、時間単位を変更できます。詳細については、「 Seek コマンドの時刻形式」を参照してください。

次の例に示すように、新しい位置をシークするか、新しい停止位置を設定するには、 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 フラグを使用します。 いずれかの位置値を変更しない場合は、AM_SEEKING_NoPositioning フラグを使用します。 対応する時間パラメーターは、その場合 は NULL にすることができます。 次の例では、10 秒順方向にシークしますが、停止位置は変更されません。

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

フィルター グラフが停止した場合、ビデオ レンダラーはシーク操作後にイメージを更新しません。 ユーザーには、シークが行われなかったかのように表示されます。 イメージを更新するには、シーク操作の後にグラフを一時停止します。 グラフを一時停止すると、ビデオ レンダラーの新しいビデオ フレームが手掛かりになります。 グラフを一時停止して停止する IMediaControl::StopWhenReady メソッドを使用できます。