Hoe de video-opname-indeling instellen
Een video-opnameapparaat ondersteunt mogelijk verschillende indelingen voor vastleggen. Indelingen verschillen doorgaans per compressietype, kleurruimte (YUV of RGB), framegrootte of framesnelheid.
De lijst met ondersteunde indelingen bevindt zich in de presentatiedescriptor. Zie Presentatiedescriptorsvoor meer informatie.
De ondersteunde indelingen opsommen:
- Maak de mediabron voor het opnameapparaat. Zie Opsomming van videovangapparaten.
- Roep IMFMediaSource::CreatePresentationDescriptor op de mediabron aan om de presentatiedescriptor op te halen.
- Roep IMFPresentationDescriptor::GetStreamDescriptorByIndex aan om de streamdescriptor voor de videostream op te halen.
- Roep IMFStreamDescriptor::GetMediaTypeHandler aan op de streamdescriptor.
- Roep IMFMediaTypeHandler::GetMediaTypeCount om het aantal ondersteunde indelingen op te halen.
- Herhaal IMFMediaTypeHandler::GetMediaTypeByIndex om elk formaat op te halen. Het formaat wordt gegeven door een mediatype. Zie Videomediatypenvoor meer informatie.
In het volgende voorbeeld worden de capture-indelingen voor een apparaat opgesomd:
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;
}
De LogMediaType
-functie die in dit voorbeeld wordt gebruikt, wordt vermeld in het onderwerp MediaType Foutopsporingscode.
De capture-indeling instellen:
- Verkrijg een aanwijzer naar de interface IMFMediaTypeHandler, zoals getoond in het vorige voorbeeld.
- Roep IMFMediaTypeHandler::GetMediaTypeByIndex aan om de gewenste indeling op te halen, opgegeven door de index.
- Roep IMFMediaTypeHandler::SetCurrentMediaType aan om de notatie in te stellen.
Als u de capture-indeling niet instelt, gebruikt het apparaat de standaardindeling.
In het volgende voorbeeld wordt de capture-indeling ingesteld:
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;
}
De volgorde waarin indelingen worden geretourneerd, is afhankelijk van het apparaat. Meestal worden ze eerst gegroepeerd op compressietype of kleurruimte; en vervolgens van kleinste framegrootte tot grootste framegrootte binnen elke groep.
De framesnelheid wordt enigszins anders behandeld dan de andere formaatattributen. Zie Video Capture Frame Rate instellenvoor meer informatie.
Notitie
Op sommige apparaten bevat de formatlijst een dubbele vermelding voor elke indeling. Als het apparaat bijvoorbeeld 15 verschillende capture-indelingen ondersteunt, bevat de lijst 30 vermeldingen. Binnen elk paar heeft een van de mediatypen het kenmerk MF_MT_AM_FORMAT_TYPE gelijk aan FORMAT_VideoInfoen de andere heeft MF_MT_AM_FORMAT_TYPE gelijk aan FORMAT_VideoInfo2. (Deze twee waarden worden gedefinieerd in het headerbestand uuids.h.) Het tweede type kan ook aanvullende kleurinformatie bevatten (uitgebreide kleurinformatie) of een andere waarde weergeven voor interlacing (MF_MT_INTERLACE_MODE). Deze dubbele typen bestaan ter ondersteuning van oudere DirectShow-toepassingen. In een Media Foundation-toepassing moet u het FORMAT_VideoInfo type negeren wanneer een dubbel FORMAT_VideoInfo2 type wordt vermeld.
Verwante onderwerpen