Megosztás a következőn keresztül:


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:

  1. 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.
  2. 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.
  3. Kérje le a kívánt bemenet által támogatott bemeneti formátumok teljes számát IWMWriter::GetInputFormatCountmeghívásával.
  4. 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;
}

IWMWriter interfész

ASF-fájlok írása