如何设置视频捕获帧速率

视频捕获设备可能支持一系列帧速率。 如果此信息可用,最小帧速率和最大帧速率存储为媒体类型属性:

Attribute 说明
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_MAXMF_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;
}

视频捕获