Festlegen des Videoaufnahmeformats
Ein Videoaufnahmegerät unterstützt möglicherweise mehrere Aufzeichnungsformate. Formate unterscheiden sich in der Regel nach Komprimierungstyp, Farbraum (YUV oder RGB), Framegröße oder Bildfrequenz.
Die Liste der unterstützten Formate ist im Präsentationsdeskriptor enthalten. Weitere Informationen finden Sie unter Präsentationsdeskriptoren.
So enumerieren Sie die unterstützten Formate:
- Erstellen Sie die Medienquelle für das Erfassungsgerät. Weitere Informationen finden Sie unter Enumerating Video Capture Devices (Aufzählen von Videoaufnahmegeräten).
- Rufen Sie ÜBER DIE MEDIENQUELLE::CreatePresentationDescriptor für die Medienquelle auf, um den Präsentationsdeskriptor abzurufen.
- Rufen Sie DIE DATEI PRESENTPresentationDescriptor::GetStreamDescriptorByIndex auf, um den Streamdeskriptor für den Videostream abzurufen.
- Rufen Sie IM STREAM-Deskriptor DIESSTREAMDESCRIPTOR::GetMediaTypeHandler auf.
- Rufen Sie DENMEDIATypeHandler::GetMediaTypeCount auf, um die Anzahl der unterstützten Formate abzurufen.
- Rufen Sie in einer Schleife DEN SCHLEIFEMEDIATypeHandler::GetMediaTypeByIndex auf, um jedes Format abzurufen. Das Format wird durch einen Medientyp dargestellt. Weitere Informationen finden Sie unter Videomedientypen.
Im folgenden Beispiel werden die Erfassungsformate für ein Gerät aufzählt:
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;
}
Die LogMediaType in diesem Beispiel verwendete Funktion ist im Thema Medientypdebuggingcodeaufgeführt.
So legen Sie das Erfassungsformat fest:
- Abrufen eines Zeigers auf die INTERFACESMediaTypeHandler-Schnittstelle, wie im vorherigen Beispiel gezeigt.
- Rufen Sie DAS GEWÜNSCHTE Format auf, das vom Index angegeben wird, indem Sie DENMEDIATypeHandler::GetMediaTypeByIndex aufrufen.
- Rufen Sie DAS FORMAT AUFMEDIATypeHandler::SetCurrentMediaType auf.
Wenn Sie das Erfassungsformat nicht festlegen, verwendet das Gerät das Standardformat.
Im folgenden Beispiel wird das Erfassungsformat festgelegt:
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;
}
Die Reihenfolge, in der Formate zurückgegeben werden, hängt vom Gerät ab. In der Regel werden sie zuerst nach Komprimierungstyp oder Farbraum gruppiert. und dann von der kleinsten Framegröße zur größten Framegröße innerhalb jeder Gruppe.
Die Bildfrequenz wird etwas anders behandelt als die anderen Formatattribute. Weitere Informationen finden Sie unter Festlegen der Videoaufnahme-Framerate.
Hinweis
Auf einigen Geräten enthält die Formatliste einen doppelten Eintrag für jedes Format. Wenn das Gerät beispielsweise 15 verschiedene Erfassungsformate unterstützt, enthält die Liste 30 Einträge. Innerhalb jedes Paars hat einer der Medientypen das Attribut MF MT AM FORMAT _ _ _ _ TYPE gleich FORMAT _ VideoInfo und der andere hat MF MT AM FORMAT _ _ _ _ TYPE gleich FORMAT _ VideoInfo2. (Diese beiden Werte werden in der Headerdatei uuids.h definiert.) Der zweite Typ kann auch zusätzliche Farbinformationen enthalten (Erweiterte Farbinformationen) oder einen anderen Wert für das Interlacing anzeigen (MF MT _ _ INTERLACE _ MODE). Diese doppelten Typen sind vorhanden, um ältere DirectShow-Anwendungen zu unterstützen. In einer Media Foundation Anwendung sollten Sie den Format _ VideoInfo-Typ ignorieren, wenn ein doppelter FORMAT _ VideoInfo2-Typ aufgeführt wird.