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

ビデオキャプチャデバイスは、さまざまなフレームレートをサポートする場合があります。 この情報が利用可能な場合、最小および最大のフレームレートは、メディアの種類の属性として保存されます。

属性 説明
MF _ MT _ フレーム _ レートの _ 範囲の _ 最大値 最大フレームレート。
MF _ MT _ フレーム _ レートの _ 範囲の _ 最小値 最小フレームレート。

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

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

  1. キャプチャデバイスのメディアソースを作成します。 「 ビデオキャプチャデバイスの列挙」を参照してください。
  2. メディアソースの Imfmediasource:: createpresentation 記述子 を呼び出して、プレゼンテーション記述子を取得します。
  3. Imfプレゼンテーション記述子:: Getstreamdescriptor Byindexを呼び出して、ビデオストリームのストリーム記述子を取得します。
  4. ストリーム記述子で Imfstreamdescriptor:: GetMediaTypeHandler を呼び出します。
  5. ビデオキャプチャ形式の設定方法に関するページの説明に従って、キャプチャ形式を列挙します。
  6. 一覧から目的の出力形式を選択します。
  7. メディアの種類に対して、 mf _ mt _ フレームレートの _ _ _ 最大値mf _ mt _ フレームレートの範囲の _ _ _ 最小 属性を照会します。 この値は、サポートされているフレームレートの範囲を指定します。 デバイスは、この範囲内の他のフレームレートをサポートしている可能性があります。
  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;
}

ビデオキャプチャ