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:

  1. Crie a fonte de mídia para o dispositivo de captura. Consulte Enumerando dispositivos de captura de vídeo.
  2. Chame IMFMediaSource::CreatePresentationDescriptor na fonte de mídia para obter o descritor de apresentação.
  3. Chame IMFPresentationDescriptor::GetStreamDescriptorByIndex para obter o descritor de fluxo para o fluxo de vídeo.
  4. Chame IMFStreamDescriptor::GetMediaTypeHandler no descritor de fluxo.
  5. Enumerar os formatos de captura, conforme descrito em Como definir o formato de captura de vídeo.
  6. Selecione o formato de saída desejado na lista.
  7. 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.
  8. Defina o atributo MF_MT_FRAME no tipo de mídia para especificar a taxa de quadros desejada.
  9. 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;
}

Captura de vídeo