Bemeneti formátumok számbavétele
[A laphoz társított funkció, Windows Media Format 11 SDKegy régi funkció. A Forrásolvasó és a Sink Íróváltotta fel. Forrásolvasó és Kimeneti író Windows 10-hez és Windows 11-hez lett optimalizálva. A Microsoft határozottan javasolja, hogy az új kód a Forrásolvasó és Kimenetíró használatát válassza a Windows Media Format 11 SDKhelyett, ha lehetséges. A Microsoft javasolja, hogy az örökölt API-kat használó meglévő kódot át kell írni az új API-k használatára, ha lehetséges.]
Minden Windows Media-kodek egy vagy több típusú bemeneti adathordozót fogad el a tömörítéshez. A Windows Media Format SDK lehetővé teszi, hogy a kodekek által támogatott formátumoknál szélesebb körben adja meg a formátumokat. Az SDK ezt úgy hajtja végre, hogy szükség esetén előfeldolgozási átalakításokat hajt végre a bemeneteken, például átméretezi a videokereteket vagy újraképezi a hangot. Mindenesetre meg kell győződnie arról, hogy az írott fájlok bemeneti formátumai megegyeznek az írónak küldött adatokkal. Minden kodek alapértelmezett bemeneti médiaformátummal rendelkezik, amely a profil betöltésekor az íróban van beállítva. Az alapértelmezett bemeneti formátumot az IWMWriter::GetInputPropsmeghívásával tekintheti meg.
A videokodek a következő formátumokat támogatják: IYUV, I420, YV12, YUY2, UYVY, YVYU, YVU9, RGB 32, RGB 24, RGB 565, RGB 555 és RGB 8. A hangkodek támogatják a PCM-hangokat.
A kodek által támogatott bemeneti formátumok számbavételéhez hajtsa végre a következő lépéseket:
- Hozzon létre egy íróobjektumot, és állítson be egy használni kívánt profilt. További információ az íróban profilok beállításáról: Profilok használata az Íróval.
- Azonosítsa azt a bemeneti számot, amelynek a formátumát ellenőrizni szeretné. További információ a bemeneti számok azonosításáról: Bemenetek azonosítása szám alapján.
- Kérje le a kívánt bemenet által támogatott bemeneti formátumok teljes számát IWMWriter::GetInputFormatCountmeghívásával.
- Ismételje meg az alábbi lépéseket az összes támogatott bemeneti formátum esetében.
- A bemeneti formátumhoz tartozó IWMInputMediaProps felületének lekérése IWMWriter::GetInputFormatmeghívásával.
- Kérje le a bemeneti formátum WM_MEDIA_TYPE szerkezetét. Hívja az IWMMediaProps::GetMediaTypefüggvényt, és adja át az NULL értéket a pType paraméterhez a struktúra méretének lekéréséhez. Ezután foglaljon le memóriát a struktúra tárolásához, és hívja meg újra GetMediaType a szerkezet lekéréséhez. IWMInputMediaProps örökli a IWMMediaPropstulajdonságait, így az előző lépésben lekért IWMInputMediaProps példányból indíthatja a GetMediaType hívásokat.
- A WM_MEDIA_TYPE struktúrában leírt formátum tartalmazza a bemeneti formátummal kapcsolatos összes lényeges információt. Az adathordozó alapformátumát a WM_MEDIA_TYPE.subtypeazonosítja. Videostreamek esetén a pbFormat tag egy dinamikusan lefoglalt WMVIDEOINFOHEADER struktúrára mutat, amely további részleteket tartalmaz a streamről, beleértve a téglalap méretét is. A bemeneti keretek méretének nem kell pontosan egyeznie a kodek által támogatott mérettel. Ha nem egyeznek, az SDK futásidejű összetevői sok esetben automatikusan átméretezik a bemeneti videokereteket olyanra, amit a kodek elfogadhat.
Az alábbi példakód megkeresi a paraméterként átadott altípus bemeneti formátumát. A kód használatáról további információt a A példakód használatacímű témakörben talál.
HRESULT FindInputFormat(IWMWriter* pWriter,
DWORD dwInput,
GUID guidSubType,
IWMInputMediaProps** ppProps)
{
DWORD cFormats = 0;
DWORD cbSize = 0;
WM_MEDIA_TYPE* pType = NULL;
IWMInputMediaProps* pProps = NULL;
// Set the ppProps parameter to point to NULL. This will
// be used to check the results of the function later.
*ppProps = NULL;
// Find the number of formats supported by this input.
HRESULT hr = pWriter->GetInputFormatCount(dwInput, &cFormats);
if (FAILED(hr))
{
goto Exit;
}
// Loop through all of the supported formats.
for (DWORD formatIndex = 0; formatIndex < cFormats; formatIndex++)
{
// Get the input media properties for the input format.
hr = pWriter->GetInputFormat(dwInput, formatIndex, &pProps);
if (FAILED(hr))
{
goto Exit;
}
// Get the size of the media type structure.
hr = pProps->GetMediaType(NULL, &cbSize);
if (FAILED(hr))
{
goto Exit;
}
// Allocate memory for the media type structure.
pType = (WM_MEDIA_TYPE*) new (std::nothrow) BYTE[cbSize];
if (pType == NULL)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
// Get the media type structure.
hr = pProps->GetMediaType(pType, &cbSize);
if (FAILED(hr))
{
goto Exit;
}
if(pType->subtype == guidSubType)
{
*ppProps = pProps;
(*ppProps)->AddRef();
goto Exit;
}
// Clean up for next iteration.
delete [] pType;
pType = NULL;
SAFE_RELEASE(pProps);
} // End for formatIndex.
// If execution made it to this point, no matching format was found.
hr = NS_E_INVALID_INPUT_FORMAT;
Exit:
delete [] pType;
SAFE_RELEASE(pProps);
return hr;
}
Kapcsolódó témakörök