Condividi tramite


Come impostare la frequenza dei fotogrammi di acquisizione video

Un dispositivo di acquisizione video potrebbe supportare una gamma di frequenze di fotogrammi. Se queste informazioni sono disponibili, le frequenze minime e massime dei fotogrammi vengono archiviate come attributi del tipo di supporto:

Attributo Descrizione
MF_MT_FRAME_RATE_RANGE_MAX Frequenza massima dei fotogrammi.
MF_MT_FRAME_RATE_RANGE_MIN Frequenza minima dei fotogrammi.

 

L'intervallo può variare a seconda del formato di acquisizione. Ad esempio, con dimensioni maggiori dei fotogrammi, la frequenza massima dei fotogrammi potrebbe essere ridotta.

Per impostare la frequenza dei fotogrammi:

  1. Creare l'origine multimediale per il dispositivo di acquisizione. Vedere enumerazione dei dispositivi di acquisizione video.
  2. Chiamare IMFMediaSource::CreatePresentationDescriptor nell'origine multimediale per ottenere il descrittore di presentazione.
  3. Chiamare IMFPresentationDescriptor::GetStreamDescriptorByIndex per ottenere il descrittore di flusso per il flusso video.
  4. Chiamare IMFStreamDescriptor::GetMediaTypeHandler nel descrittore di flusso.
  5. Enumerare i formati di acquisizione, come descritto in Come impostare il formato di acquisizione video.
  6. Selezionare il formato di output desiderato dall'elenco.
  7. Eseguire una query sul tipo di supporto per gli attributi MF_MT_FRAME_RATE_RANGE_MAX e MF_MT_FRAME_RATE_RANGE_MIN. Questi valori forniscono l'intervallo delle frequenze di fotogrammi supportate. Il dispositivo potrebbe supportare altre frequenze di fotogrammi all'interno di questo intervallo.
  8. Impostare l'attributo MF_MT_FRAME sul tipo di supporto per specificare la frequenza dei fotogrammi desiderata.
  9. Invocare IMFMediaTypeHandler::SetCurrentMediaType con il tipo di media modificato.

L'esempio seguente imposta la frequenza dei fotogrammi uguale alla frequenza massima supportata dal 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;
}

Cattura Video