Comment définir la fréquence d’images de capture vidéo

Un appareil de capture vidéo peut prendre en charge une plage de fréquences d’images. Si ces informations sont disponibles, les fréquences d’images minimales et maximales sont stockées en tant qu’attributs de type multimédia :

Attribut Description
MF_MT_FRAME_RATE_RANGE_MAX Fréquence d’images maximale.
MF_MT_FRAME_RATE_RANGE_MIN Fréquence d’images minimale.

 

La plage peut varier en fonction du format de capture. Par exemple, à des tailles d’images plus grandes, la fréquence maximale d’images peut être réduite.

Pour définir la fréquence d’images :

  1. Créez la source multimédia de l’appareil de capture. Consultez énumération des appareils de capture vidéo.
  2. Appelez IMFMediaSource::CreatePresentationDescriptor sur la source multimédia pour obtenir le descripteur de présentation.
  3. Appelez IMFPresentationDescriptor::GetStreamDescriptorByIndex pour obtenir le descripteur de flux pour le flux vidéo.
  4. Appelez IMFStreamDescriptor::GetMediaTypeHandler sur le descripteur de flux.
  5. Énumérez les formats de capture, comme décrit dans Comment définir le format de capture vidéo.
  6. Sélectionnez le format de sortie souhaité dans la liste.
  7. Interrogez le type de média pour les attributs MF_MT_FRAME_RATE_RANGE_MAX et MF_MT_FRAME_RATE_RANGE_MIN . Ces valeurs donnent la plage des taux d’images pris en charge. L’appareil peut prendre en charge d’autres taux d’images dans cette plage.
  8. Définissez l’attribut MF_MT_FRAME sur le type de média pour spécifier la fréquence d’images souhaitée.
  9. Appelez IMFMediaTypeHandler::SetCurrentMediaType avec le type de média modifié.

L’exemple suivant définit la fréquence d’images égale à la fréquence d’images maximale prise en charge par l’appareil :

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;
}

Capture vidéo