シーク コマンドのタイム フォーマット
IMediaSeeking インターフェイスの多くのメソッドは現在位置、停止位置など、位置の値を表すパラメータを取る。デフォルトでは、これらのパラメータは 100 ナノ秒単位で表される。この単位は "基準タイム" とも呼ばれる。シーク可能なフィルタは、基準タイムによるシークをサポートしなければならない。一部のフィルタでは、特定のフレーム番号へのシーク、ストリーム内の特定のバイト オフセットへのシークなど、他の時間単位を使ってもシークできる。それぞれの時間単位は "タイム フォーマット" と呼び、グローバル一意識別子 (GUID) で定義する。DirectShow で定義されるタイム フォーマットの一覧については、「タイム フォーマット GUID」を参照すること。サード パーティもカスタム タイム フォーマットの GUID を定義できる。
現在フィルタ グラフにあるフィルタが特定のタイム フォーマットをサポートしているかどうかを調べるには、IMediaSeeking::IsFormatSupported メソッドを呼び出す。フォーマットがサポートされている場合、メソッドは S_OK を返す。それ以外の場合、メソッドは S_FALSE またはエラー コードを返す。フォーマットがサポートされている場合、IMediaSeeking::SetTimeFormat メソッドを呼び出すと、そのフォーマットに切り替えられる。SetTimeFormat メソッドが成功すると、後続のシーク コマンドは新しいタイム フォーマットを使って表される。
次の例は、グラフがフレーム番号によるシークをサポートしているかどうかをチェックする。サポートしている場合、フレーム番号 20 にシークする。
hr = pSeek->IsFormatSupported(&TIME_FORMAT_FRAME);
if (hr == S_OK)
{
hr = pSeek->SetTimeFormat(&TIME_FORMAT_FRAME);
if (SUCCEEDED(hr))
{
// フレーム番号 20 にシークする。
LONGLONG rtNow = 20;
hr = pSeek->SetPositions(
&rtNow, AM_SEEKING_AbsolutePositioning,
0, AM_SEEKING_NoPositioning);
}
}
タイム フォーマットはシーク コマンドにのみ適用される点に注意すること。グラフ再生など、他の処理には影響を与えない。