Come impostare il formato di acquisizione video
Un dispositivo di acquisizione video potrebbe supportare diversi formati di acquisizione. I formati in genere differiscono in base al tipo di compressione, alla spaziatura dei colori (YUV o RGB), alle dimensioni dei fotogrammi o alla frequenza dei fotogrammi.
L'elenco dei formati supportati è contenuto nel descrittore di presentazione . Per altre informazioni, vedere descrittori di presentazione .
Per enumerare i formati supportati:
- 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.
- Chiamare IMFMediaTypeHandler::GetMediaTypeCount per ottenere il numero di formati supportati.
- In un ciclo chiamare IMFMediaTypeHandler::GetMediaTypeByIndex per ottenere ogni formato. Il formato è rappresentato da un tipo di supporto . Per ulteriori informazioni, vedere tipi di media video.
L'esempio seguente enumera i formati di acquisizione per un dispositivo:
HRESULT EnumerateCaptureFormats(IMFMediaSource *pSource)
{
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(0, &fSelected, &pSD);
if (FAILED(hr))
{
goto done;
}
hr = pSD->GetMediaTypeHandler(&pHandler);
if (FAILED(hr))
{
goto done;
}
DWORD cTypes = 0;
hr = pHandler->GetMediaTypeCount(&cTypes);
if (FAILED(hr))
{
goto done;
}
for (DWORD i = 0; i < cTypes; i++)
{
hr = pHandler->GetMediaTypeByIndex(i, &pType);
if (FAILED(hr))
{
goto done;
}
LogMediaType(pType);
OutputDebugString(L"\n");
SafeRelease(&pType);
}
done:
SafeRelease(&pPD);
SafeRelease(&pSD);
SafeRelease(&pHandler);
SafeRelease(&pType);
return hr;
}
La funzione LogMediaType
usata in questo esempio è elencata nell'argomento codice di debug del tipo di supporto.
Per impostare il formato di acquisizione:
- Ottenere un puntatore all'interfaccia IMFMediaTypeHandler, come illustrato nell'esempio precedente.
- Chiamare IMFMediaTypeHandler::GetMediaTypeByIndex per ottenere il formato desiderato, specificato dall'indice.
- Chiamare IMFMediaTypeHandler::SetCurrentMediaType per impostare il formato.
Se non imposti il formato di acquisizione, il dispositivo userà il formato predefinito.
L'esempio seguente imposta il formato di acquisizione:
HRESULT SetDeviceFormat(IMFMediaSource *pSource, DWORD dwFormatIndex)
{
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(0, &fSelected, &pSD);
if (FAILED(hr))
{
goto done;
}
hr = pSD->GetMediaTypeHandler(&pHandler);
if (FAILED(hr))
{
goto done;
}
hr = pHandler->GetMediaTypeByIndex(dwFormatIndex, &pType);
if (FAILED(hr))
{
goto done;
}
hr = pHandler->SetCurrentMediaType(pType);
done:
SafeRelease(&pPD);
SafeRelease(&pSD);
SafeRelease(&pHandler);
SafeRelease(&pType);
return hr;
}
L'ordine in cui vengono restituiti i formati dipende dal dispositivo. In genere, vengono raggruppati per primo per tipo di compressione o spazio colore; e quindi dalla dimensione più piccola del fotogramma alla dimensione più grande del fotogramma all'interno di ogni gruppo.
La frequenza dei fotogrammi viene gestita in modo leggermente diverso rispetto agli altri attributi di formato. Per altre informazioni, vedere Come impostare la frequenza dei fotogrammi di acquisizione video.
Nota
In alcuni dispositivi, l'elenco di formati conterrà una voce duplicata per ogni formato. Ad esempio, se il dispositivo supporta 15 formati di acquisizione distinti, l'elenco conterrà 30 voci. All'interno di ogni coppia, uno dei tipi di media avrà l'attributo MF_MT_AM_FORMAT_TYPE uguale a FORMAT_VideoInfoe l'altro avrà MF_MT_AM_FORMAT_TYPE uguale a FORMAT_VideoInfo2. Questi due valori sono definiti nel file di intestazione uuids.h. Il secondo tipo può anche contenere informazioni aggiuntive sul colore (Extended Color Information) o mostrare un valore diverso per l'interlacciamento (MF_MT_INTERLACE_MODE). Questi tipi duplicati esistono per supportare le applicazioni DirectShow meno recenti. In un'applicazione Media Foundation è necessario ignorare il tipo di FORMAT_VideoInfo ogni volta che viene elencato un tipo di FORMAT_VideoInfo2 duplicato.
Argomenti correlati