Настройка частоты кадров захвата видео

Устройство захвата видео может поддерживать диапазон частот кадров. Если эти сведения доступны, минимальная и максимальная частота кадров сохраняются как атрибуты типа мультимедиа:

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_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;
}

Запись видео