如何设置视频捕获帧速率
视频捕获设备可能支持一系列帧速率。 如果此信息可用,最小帧速率和最大帧速率存储为媒体类型属性:
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;
}
相关主题