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:
- Creare l'origine multimediale per il dispositivo di acquisizione. Vedere enumerazione dei dispositivi di acquisizione video.
- Chiamare IMFMediaSource::CreatePresentationDescriptor nell'origine multimediale per ottenere il descrittore di presentazione.
- Chiamare IMFPresentationDescriptor::GetStreamDescriptorByIndex per ottenere il descrittore di flusso per il flusso video.
- Chiamare IMFStreamDescriptor::GetMediaTypeHandler nel descrittore di flusso.
- Enumerare i formati di acquisizione, come descritto in Come impostare il formato di acquisizione video.
- Selezionare il formato di output desiderato dall'elenco.
- 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.
- Impostare l'attributo MF_MT_FRAME sul tipo di supporto per specificare la frequenza dei fotogrammi desiderata.
- 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;
}
Argomenti correlati