Sdílet prostřednictvím


Vyjmenování vstupních formátů

[Funkce přidružená k této stránce, Windows Media Format 11 SDK, je starší funkce. Byl nahrazen čtečkou zdrojů a zapisovačem datového toku . a zapisovač jímky jsou optimalizované pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal Čtečka zdrojů a Zapisovač výstupů místo Windows Media Format 11 SDK, kdykoli je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]

Každý z kodeků Windows Media přijímá jeden nebo více typů vstupních médií pro kompresi. Sada Windows Media Format SDK umožňuje zadat širší škálu formátů, než jsou podporované kodeky. SDK to provádí předzpracovatelské transformace vstupů v případě potřeby, například změnou velikosti snímků videa nebo převzorkováním zvuku. V každém případě musíte zajistit, aby vstupní formáty souborů, které zapisujete, odpovídaly datům, která odesíláte zapisovači. Každý kodek má výchozí formát vstupního média, který je nastaven v zapisovači při načtení profilu. Výchozí vstupní formát můžete prozkoumat voláním IWMWriter::GetInputProps.

Kodeky videa podporují následující formáty: IYUV, I420, YV12, YUY2, UYVY, YVYU, YVU9, RGB 32, RGB 24, RGB 565, RGB 555 a RGB 8. Zvukové kodeky podporují zvuk PCM.

Chcete-li vytvořit výčet vstupních formátů podporovaných kodekem, proveďte následující kroky:

  1. Vytvořte objekt zapisovače a nastavte profil používaný. Další informace o nastavení profilů v textovém editoru si můžete přečíst v části Použití profilů s textovým editorem.
  2. Určete vstupní číslo, pro které chcete zkontrolovat formáty. Další informace o identifikaci vstupních čísel naleznete v tématu Chcete-li identifikovat vstupy podle čísla.
  3. Načtení celkového počtu vstupních formátů podporovaných požadovaným vstupem voláním IWMWriter::GetInputFormatCount.
  4. Projděte všechny podporované vstupní formáty a pro každý z nich proveďte následující kroky.
    • Načtěte rozhraní IWMInputMediaProps pro vstupní formát voláním IWMWriter::GetInputFormat.
    • Načtěte strukturu WM_MEDIA_TYPE pro vstupní formát. Předání při volání IWMMediaProps::GetMediaType, při předání NULL pro parametr pType, aby se získala velikost struktury. Nejprve přidělte paměť pro uložení struktury a poté znovu zavolejte GetMediaType, abyste získali strukturu. IWMInputMediaProps dědí z IWMMediaProps, takže můžete provádět volání na GetMediaType z instance IWMInputMediaProps, která byla načtena v předchozím kroku.
    • Formát popsaný v WM_MEDIA_TYPE struktuře obsahuje všechny relevantní informace o vstupním formátu. Základní formát média je identifikován WM_MEDIA_TYPE.podtyp. U video streamů odkazuje pbFormat člen na dynamicky přidělenou WMVIDEOINFOHEADER strukturu, která obsahuje další podrobnosti o datovém proudu, včetně velikosti obdélníku. Velikost vstupních snímků se nevyžaduje, aby odpovídala přesně velikosti podporované kodekem. Pokud se neshodují, komponenty sady SDK za běhu v mnoha případech automaticky změní velikost vstupních snímků videa na něco, co může kodek přijmout.

Následující příklad kódu najde vstupní formát podtypu předaného jako parametr. Další informace o použití tohoto kódu naleznete v tématu Použití příkladů kódu.

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;
}

rozhraní IWMWriter

psaní souborů ASF