Настройка частоты кадров записи видео
Устройство захвата видео может поддерживать диапазон частот кадров. Если эта информация доступна, минимальные и максимальные частоты кадров хранятся в виде атрибутов типа носителя:
Атрибут | Описание |
---|---|
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;
}
Связанные разделы