Настройка частоты кадров захвата видео
Устройство захвата видео может поддерживать диапазон частот кадров. Если эти сведения доступны, минимальная и максимальная частота кадров сохраняются как атрибуты типа мультимедиа:
attribute | Описание |
---|---|
MF_MT_FRAME_RATE_RANGE_MAX | Максимальная частота кадров. |
MF_MT_FRAME_RATE_RANGE_MIN | Минимальная частота кадров. |
Диапазон может отличаться в зависимости от формата записи. Например, при больших размерах кадров максимальная частота кадров может быть уменьшена.
Чтобы задать частоту кадров, выполните следующие действия.
- Создайте источник мультимедиа для устройства захвата. См. раздел Перечисление устройств захвата видео.
- Вызовите IMFMediaSource::CreatePresentationDescriptor в источнике мультимедиа, чтобы получить дескриптор презентации.
- Вызовите IMFPresentationDescriptor::GetStreamDescriptorByIndex , чтобы получить дескриптор потока для видеопотока.
- Вызовите IMFStreamDescriptor::GetMediaTypeHandler в дескрипторе потока.
- Перечислите форматы захвата, как описано в разделе Настройка формата захвата видео.
- Выберите нужный формат вывода в списке.
- Запросите тип носителя для атрибутов MF_MT_FRAME_RATE_RANGE_MAX и MF_MT_FRAME_RATE_RANGE_MIN . Эти значения дают диапазон поддерживаемой частоты кадров. Устройство может поддерживать другие частоты кадров в этом диапазоне.
- Задайте атрибут MF_MT_FRAME для типа носителя, чтобы указать требуемую частоту кадров.
- Вызовите 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;
}
Связанные темы