次の方法で共有


スクラブを実行する方法

スクラブは、スクロール バーなどの視覚的な時間表現と対話することで、ファイル内の特定のポイントを瞬時にシークするために実行されます。 Media Foundation では、スクラブとは、ファイルをシークし、更新されたフレームを 1 つ取得することを意味します。

スクラブの詳細については、「 レートコントロールについて」を参照してください。

スクラブを実行するには

  1. MFGetService を呼び出して、メディア セッションから IMFRateControl インターフェイスを取得します。

    注意

    メディア ソースから IMFRateControl インターフェイスを取得しないでください。 常にメディア セッションからインターフェイスを取得します。

     

  2. IMFRateControl::SetRate を呼び出して、再生レートを 0 に設定します。 このメソッドの呼び出しの詳細については、「 メディア セッションで再生レートを設定する方法」を参照してください。

  3. MFTIME 型でシークするプレゼンテーション時間を指定して、PROPVARIANT にシーク位置を作成します。

  4. IMFMediaSession::Start をシーク位置で呼び出して再生を開始します。

  5. スクラブ操作が完了すると、メディア セッションから MESessionScrubSampleComplete イベントが送信されます。 別のスクラブ操作のために Start をもう 一度呼び出す前に、このイベントを待ちます。

次のコード例は、スクラブを実行する方法を示しています。

HRESULT SkipToPosition (MFTIME SeekTime, IMFMediaSession *pMediaSession)
{
    PROPVARIANT var;
    PropVariantInit(&var);

    IMFRateControl *pRateControl = NULL;

    // Get the rate control service.
    HRESULT hr = MFGetService(pMediaSession, MF_RATE_CONTROL_SERVICE, IID_PPV_ARGS(&pRateControl));

    // Set the playback rate to zero without thinning.
    if(SUCCEEDED(hr))
    {
        hr = pRateControl ->SetRate( FALSE, 0.0F); 
    }

    // Create the Media Session start position.
    if( SeekTime == PRESENTATION_CURRENT_POSITION )
    {
        var.vt = VT_EMPTY;
    }
    else
    {
        var.vt = VT_I8;
        var.hVal.QuadPart = SeekTime;
    }

    // Start the Media Session.
    if(SUCCEEDED(hr))
    {
        hr = pMediaSession->Start( NULL, &var);
    }

// Clean up.
    SafeRelease(&pRateControl);
    PropVariantClear(&var)
    return hr;
}

スクラブ操作が成功すると、すべてのストリーム シンクが新しいフレームで更新され、スクラブ操作が正常に完了した後に 、MESessionScrubSampleComplete イベントが生成されます。 ビデオ ファイルをスクラブすると、シークされたフレームが表示されますが、オーディオ出力は生成されません。

アプリケーションは、再生レートを 0 に設定し、IMFMediaSession::Start の呼び出しでVT_EMPTYに設定された PROPVARIANT を渡すことで、フレーム ステップ実行を実行できます。

メディア セッション

レート制御