Como definir a taxa de quadros de captura de vídeo
Um dispositivo de captura de vídeo pode dar suporte a uma variedade de taxas de quadros. Se essas informações estiverem disponíveis, as taxas de quadros mínimas e máximas serão armazenadas como atributos de tipo de mídia:
Atributo | Descrição |
---|---|
MF_MT_FRAME_RATE_RANGE_MAX | Taxa máxima de quadros. |
MF_MT_FRAME_RATE_RANGE_MIN | Taxa mínima de quadros. |
O intervalo pode variar dependendo do formato de captura. Por exemplo, em tamanhos de quadro maiores, a taxa máxima de quadros pode ser reduzida.
Para definir a taxa de quadros:
- Crie a fonte de mídia para o dispositivo de captura. Consulte Enumerando dispositivos de captura de vídeo.
- Chame IMFMediaSource::CreatePresentationDescriptor na fonte de mídia para obter o descritor de apresentação.
- Chame IMFPresentationDescriptor::GetStreamDescriptorByIndex para obter o descritor de fluxo para o fluxo de vídeo.
- Chame IMFStreamDescriptor::GetMediaTypeHandler no descritor de fluxo.
- Enumerar os formatos de captura, conforme descrito em Como definir o formato de captura de vídeo.
- Selecione o formato de saída desejado na lista.
- Consulte o tipo de mídia para os atributos MF_MT_FRAME_RATE_RANGE_MAX e MF_MT_FRAME_RATE_RANGE_MIN . Esses valores fornecem o intervalo de taxas de quadros com suporte. O dispositivo pode dar suporte a outras taxas de quadros dentro desse intervalo.
- Defina o atributo MF_MT_FRAME no tipo de mídia para especificar a taxa de quadros desejada.
- Chame IMFMediaTypeHandler::SetCurrentMediaType com o tipo de mídia modificado.
O exemplo a seguir define a taxa de quadros igual à taxa máxima de quadros à qual o dispositivo dá suporte:
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;
}
Tópicos relacionados