Cómo establecer la velocidad de fotogramas de captura de vídeo

Un dispositivo de captura de vídeo puede admitir una variedad de velocidades de fotogramas. Si esta información está disponible, las velocidades de fotogramas mínimas y máximas se almacenan como atributos de tipo multimedia:

Atributo Descripción
MF_MT_FRAME_RATE_RANGE_MAX Velocidad máxima de fotogramas.
MF_MT_FRAME_RATE_RANGE_MIN Velocidad de fotogramas mínima.

 

El intervalo puede variar según el formato de captura. Por ejemplo, con tamaños de fotograma más grandes, se podría reducir la velocidad máxima de fotogramas.

Para establecer la velocidad de fotogramas:

  1. Cree el origen multimedia para el dispositivo de captura. Consulte Enumeración de dispositivos de captura de vídeo.
  2. Llame a IMFMediaSource::CreatePresentationDescriptor en el origen multimedia para obtener el descriptor de presentación.
  3. Llame a IMFPresentationDescriptor::GetStreamDescriptorByIndex para obtener el descriptor de secuencia de la secuencia de vídeo.
  4. Llame a IMFStreamDescriptor::GetMediaTypeHandler en el descriptor de secuencia.
  5. Enumere los formatos de captura, tal y como se describe en Cómo establecer el formato de captura de vídeo.
  6. Seleccione el formato de salida deseado en la lista.
  7. Consulte el tipo de medio para los atributos MF_MT_FRAME_RATE_RANGE_MAX y MF_MT_FRAME_RATE_RANGE_MIN . Estos valores proporcionan el intervalo de velocidades de fotogramas admitidas. El dispositivo puede admitir otras velocidades de fotogramas dentro de este intervalo.
  8. Establezca el atributo MF_MT_FRAME en el tipo de medio para especificar la velocidad de fotogramas deseada.
  9. Llame a IMFMediaTypeHandler::SetCurrentMediaType con el tipo de medio modificado.

En el ejemplo siguiente se establece la velocidad de fotogramas igual a la velocidad de fotogramas máxima que admite el dispositivo:

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