Share via


Come impostare la frequenza dei fotogrammi di acquisizione video

Un dispositivo di acquisizione video può supportare un intervallo di frequenza dei fotogrammi. Se queste informazioni sono disponibili, le velocità minime e massime dei frame vengono archiviate come attributi di tipo multimediale:

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, a dimensioni maggiori del frame, la velocità 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 FMIMediaSource::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 FMStreamDescriptor::GetMediaTypeHandler nel descrittore di flusso.
  5. Enumera 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 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 di frequenza dei fotogrammi supportati. Il dispositivo può supportare altre frequenze di frame all'interno di questo intervallo.
  8. Impostare l'attributo MF_MT_FRAME sul tipo di supporto per specificare la frequenza di fotogrammi desiderata.
  9. Chiamare IMFMediaTypeHandler::SetCurrentMediaType con il tipo di supporto modificato.

Nell'esempio seguente viene impostata la frequenza dei fotogrammi uguale alla frequenza massima di fotogrammi 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;
}

Acquisizione video