Rate Control (IMFRateControl)

再生割合 (playback rate) の取得や設定を行えます。

SetRate()

HRESULT SetRate(
  BOOL  fThin, // TRUEならば、Media Streamは間引かれる
  float flRate // 再生割合
);
IMFRateControl::SetRate (mfidl.h) | Microsoft Learn

fThinをTRUEとすることで、ストリームのサンプルの数を減少させられます。これをTRUEとできるかは、IsRateSupported()で確認できます。Thinning - About Rate Control - Win32 apps | Microsoft Learn

flRateを負数とすると、逆方向に再生されます。ゼロとすると、スクラブを示します。

flRateに指定可能な値の範囲は、GetFastestRate()などで確認できます。

再生中にはSetRate()を設定できず、一時停止中には再生方向を変更できません。Remarks - IMFRateControl::SetRate (mfidl.h) | Microsoft Learn

IMFRateControl *pRateControl = NULL;
HRESULT hr = MFGetService(pMediaSession, MF_RATE_CONTROL_SERVICE, IID_PPV_ARGS(&pRateControl));

if (SUCCEEDED(hr))
{
    hr = pRateControl->SetRate(FALSE, 2.0f);
}

IMFRateSupportインターフェイス

再生割合に指定可能な値はIMFRateSupportのメソッドから確認できます。

IMFRateSupport *pRateSupport = NULL;
hr = MFGetService(pMediaSession, MF_RATE_CONTROL_SERVICE, IID_PPV_ARGS(&pRateSupport));
if (SUCCEEDED(hr))
{
    float rateRequested = 10.0f;
    float actualRate = 0.0f;
    hr = pRateSupport->IsRateSupported(TRUE, rateRequested, &actualRate);
    if (hr == MF_E_UNSUPPORTED_RATE)
    {
        // 0xC00D36D0:The specified rate is not supported. (指定されたレートはサポートされていません。)
    }
    else if (hr == MF_E_THINNING_UNSUPPORTED)
    {
        // 0xC00D36D1 : This component does not support stream-thinning.
    }

    float slowestRate = 0.0f;
    hr = pRateSupport->GetSlowestRate(MFRATE_FORWARD, TRUE, &slowestRate);

    float fastestRate = 0.0f;
    hr = pRateSupport->GetFastestRate(MFRATE_FORWARD, TRUE, &fastestRate);
}

IsRateSupported()

HRESULT IsRateSupported(
  BOOL  fThin,
  float flRate,
  float *pflNearestSupportedRate
);
IMFRateSupport::IsRateSupported (mfidl.h) | Microsoft Learn

GetFastestRate()

HRESULT GetFastestRate(
  MFRATE_DIRECTION eDirection,
  BOOL             fThin,
  float            *pflRate
);
IMFRateSupport::GetFastestRate (mfidl.h) | Microsoft Learn
Microsoft Learnから検索