Jak nastavit formát zachycení videa
Zařízení pro zachycení videa může podporovat několik formátů zachycení. Formáty se obvykle liší podle typu komprese, barevného prostoru (YUV nebo RGB), velikosti rámce nebo frekvence snímků.
Seznam podporovaných formátů je obsažen v prezentačním popisovači. Další informace naleznete v tématu údaje o prezentaci.
Výčet podporovaných formátů:
- Vytvořte zdroj médií pro zařízení pro zachytávání. Viz vyjmenování zařízení pro zachycení videa.
- Zavolejte MMFMediaSource::CreatePresentationDescriptor na zdroji médií, abyste získali popisovač prezentace.
- Voláním IMFPresentationDescriptor::GetStreamDescriptorByIndex získáte popisovač datového proudu pro video stream.
- Volání MMFStreamDescriptor::GetMediaTypeHandler na popisovači datového proudu.
- Zavolejte IMFMediaTypeHandler::GetMediaTypeCount a zjistěte počet podporovaných formátů.
- Ve smyčce zavolejte IMFMediaTypeHandler::GetMediaTypeByIndex pro získání každého formátu. Formát je reprezentován mediálním typem . Další informace naleznete v tématu typy médií videa.
Následující příklad vyčísluje formáty zachycení pro zařízení:
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;
}
Funkce LogMediaType
použitá v tomto příkladu je uvedena v tématu kód ladění typu média.
Nastavení formátu zachycení:
- Získejte ukazatel na rozhraní MMFMediaTypeHandler, jak je znázorněno v předchozím příkladu.
- Pro volání IMFMediaTypeHandler::GetMediaTypeByIndex pro získání požadovaného formátu určeného indexem.
- Volání IMFMediaTypeHandler::SetCurrentMediaType pro nastavení formátu.
Pokud formát zachytávání nenastavíte, bude zařízení používat výchozí formát.
Následující příklad nastaví formát capture:
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;
}
Pořadí, ve kterém se vrátí formáty, závisí na zařízení. Obvykle jsou seskupeny nejprve podle typu komprese nebo barevného prostoru; a pak od nejmenší velikosti rámce po největší velikost rámce v rámci každé skupiny.
Frekvence snímků se zpracovává trochu jinak než ostatní atributy formátu. Další informace naleznete v tématu Nastavení frekvence snímků videa.
Poznámka
V některých zařízeních bude seznam formátů obsahovat duplicitní položku pro každý formát. Pokud například zařízení podporuje 15 různých formátů zachycení, bude seznam obsahovat 30 položek. V rámci každého páru bude mít jeden z typů médií atribut MF_MT_AM_FORMAT_TYPE rovna FORMAT_VideoInfoa druhý bude mít MF_MT_AM_FORMAT_TYPE rovna FORMAT_VideoInfo2. (Tyto dvě hodnoty jsou definovány v souboru záhlaví uuids.h.) Druhý typ může také obsahovat další informace o barvě (rozšířené informace o barvě) nebo zobrazit jinou hodnotu pro prokládání (MF_MT_INTERLACE_MODE). Tyto duplicitní typy existují pro podporu starších aplikací DirectShow. V aplikaci Media Foundation byste měli ignorovat typ FORMAT_VideoInfo vždy, když je uveden duplicitní typ FORMAT_VideoInfo2.
Související témata