ビデオ キャプチャ フレーム レートを設定する方法

ビデオ キャプチャ デバイスでは、さまざまなフレーム レートがサポートされる場合があります。 この情報を使用できる場合、最小フレーム レートと最大フレーム レートはメディア タイプ属性として格納されます。

属性 説明
MF_MT_FRAME_RATE_RANGE_MAX 最大フレーム レート。
MF_MT_FRAME_RATE_RANGE_MIN 最小フレーム レート。

 

範囲は、キャプチャ形式によって異なる場合があります。 たとえば、フレーム サイズを大きくすると、最大フレーム レートが低下する可能性があります。

フレーム レートを設定するには:

  1. キャプチャ デバイスのメディア ソースを作成します。 ビデオ キャプチャ デバイスの列挙を参照してください。
  2. メディア ソースで IMFMediaSource::CreatePresentationDescriptor を呼び出して、プレゼンテーション記述子を取得します。
  3. IMFPresentationDescriptor::GetStreamDescriptorByIndex を呼び出して、ビデオ ストリームのストリーム記述子を取得します。
  4. ストリーム記述子で IMFStreamDescriptor::GetMediaTypeHandler を呼び出します。
  5. 「ビデオ キャプチャ形式を 設定する方法」の説明に従って、キャプチャ形式を列挙します
  6. 一覧から目的の出力形式を選択します。
  7. MF_MT_FRAME_RATE_RANGE_MAX属性とMF_MT_FRAME_RATE_RANGE_MIN属性のメディアの種類に対してクエリを実行します。 この値は、サポートされているフレーム レートの範囲を示します。 デバイスでは、この範囲内の他のフレーム レートがサポートされる場合があります。
  8. メディアの種類に MF_MT_FRAME 属性を設定して、目的のフレーム レートを指定します。
  9. 変更されたメディアの種類で IMFMediaTypeHandler::SetCurrentMediaType を呼び出します。

次の例では、デバイスがサポートする最大フレーム レートと等しいフレーム レートを設定します。

HRESULT SetMaxFrameRate(IMFMediaSource *pSource, DWORD dwTypeIndex)
{
    IMFPresentationDescriptor *pPD = NULL;
    IMFStreamDescriptor *pSD = NULL;
    IMFMediaTypeHandler *pHandler = NULL;
    IMFMediaType *pType = NULL;

    HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);
    if (FAILED(hr))
    {
        goto done;
    }

    BOOL fSelected;
    hr = pPD->GetStreamDescriptorByIndex(dwTypeIndex, &fSelected, &pSD);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pSD->GetMediaTypeHandler(&pHandler);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pHandler->GetCurrentMediaType(&pType);
    if (FAILED(hr))
    {
        goto done;
    }

    // Get the maximum frame rate for the selected capture format.

    // Note: To get the minimum frame rate, use the 
    // MF_MT_FRAME_RATE_RANGE_MIN attribute instead.

    PROPVARIANT var;
    if (SUCCEEDED(pType->GetItem(MF_MT_FRAME_RATE_RANGE_MAX, &var)))
    {
        hr = pType->SetItem(MF_MT_FRAME_RATE, var);

        PropVariantClear(&var);

        if (FAILED(hr))
        {
            goto done;
        }

        hr = pHandler->SetCurrentMediaType(pType);
    }

done:
    SafeRelease(&pPD);
    SafeRelease(&pSD);
    SafeRelease(&pHandler);
    SafeRelease(&pType);
    return hr;
}

ビデオ キャプチャ