Поделиться через


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

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

Атрибут Описание
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;
}

видеозапись