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