スクラブを実行する方法
スクラブは、スクロール バーなどの視覚的な時間表現と対話することで、ファイル内の特定のポイントを瞬時にシークするために実行されます。 Media Foundation では、スクラブとは、ファイルをシークし、更新されたフレームを 1 つ取得することを意味します。
スクラブの詳細については、「 レートコントロールについて」を参照してください。
スクラブを実行するには
MFGetService を呼び出して、メディア セッションから IMFRateControl インターフェイスを取得します。
注意
メディア ソースから IMFRateControl インターフェイスを取得しないでください。 常にメディア セッションからインターフェイスを取得します。
IMFRateControl::SetRate を呼び出して、再生レートを 0 に設定します。 このメソッドの呼び出しの詳細については、「 メディア セッションで再生レートを設定する方法」を参照してください。
MFTIME 型でシークするプレゼンテーション時間を指定して、PROPVARIANT にシーク位置を作成します。
IMFMediaSession::Start をシーク位置で呼び出して再生を開始します。
スクラブ操作が完了すると、メディア セッションから 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 を渡すことで、フレーム ステップ実行を実行できます。
関連トピック