次の方法で共有


シーク コマンドのタイム フォーマット

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);
    }
}

タイム フォーマットはシーク コマンドにのみ適用される点に注意すること。グラフ再生など、他の処理には影響を与えない。