Delen via


Om invoerindelingen op te sommen

[De functie die is gekoppeld aan deze pagina, Windows Media Format 11 SDK, is een verouderde functie. Het is vervangen door Source Reader en Sink Writer. Bronlezer en Sink Writer zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken bronlezer en Sink Writer- in plaats van Windows Media Format 11 SDK, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]

Elk van de Windows Media-codecs accepteert een of meer typen invoermedia voor compressie. Met de Windows Media Format SDK kunt u een breder scala aan indelingen invoeren dan de indelingen die worden ondersteund door de codecs. De SDK doet dit door de invoer vooraf te verwerken wanneer dat nodig is, zoals het wijzigen van het formaat van videoframes of het opnieuwamplen van audio. In elk geval moet u ervoor zorgen dat de invoerindelingen voor de bestanden die u schrijft overeenkomen met de gegevens die u naar de schrijver verzendt. Elke codec heeft een standaardindeling voor invoermedia die is ingesteld in de schrijver wanneer het profiel wordt geladen. U kunt de standaardinvoerindeling onderzoeken door IWMWriter::GetInputPropsaan te roepen.

De videocodecs ondersteunen de volgende indelingen: IYUV, IYUV, I420, YV12, YUY2, UYVY, YVYU, YVU9, RGB 32, RGB 24, RGB 565, RGB 555 en RGB 8. De audiocodecs ondersteunen PCM-audio.

Voer de volgende stappen uit om de invoerindelingen op te sommen die worden ondersteund door een codec:

  1. Maak een writer-object en stel een profiel in dat moet worden gebruikt. Zie Profielen gebruiken met de Writervoor meer informatie over hoe u profielen instelt in Writer.
  2. Bepaal het nummer waarvoor u de invoerformaten wilt controleren. Zie Invoer per getal identificerenvoor meer informatie over het identificeren van invoernummers.
  3. Haal het totale aantal invoerindelingen op dat wordt ondersteund door de gewenste invoer door IWMWriter::GetInputFormatCountaan te roepen.
  4. Doorloop alle ondersteunde invoerindelingen en voer de volgende stappen voor elke indeling uit.
    • Haal de IWMInputMediaProps-interface voor de invoerindeling op door IWMWriter::GetInputFormataan te roepen.
    • Haal de WM_MEDIA_TYPE structuur op voor de invoerindeling. Roep IWMMediaProps::GetMediaTypeaan, waarbij NULL- wordt doorgegeven voor de parameter pType om de grootte van de structuur op te halen. Wijs vervolgens geheugen toe om de structuur vast te houden en GetMediaType opnieuw aan te roepen om de structuur op te halen. IWMInputMediaProps erft van IWMMediaProps, zodat u de aanroepen naar GetMediaType kunt uitvoeren vanuit het exemplaar van IWMInputMediaProps dat in de vorige stap is opgehaald.
    • De indeling die wordt beschreven in de WM_MEDIA_TYPE structuur bevat alle relevante informatie over de invoerindeling. De basisindeling van de media wordt geïdentificeerd door WM_MEDIA_TYPE.subtype. Voor videostreams verwijst de pbFormat lidstructuur naar een dynamisch toegewezen WMVIDEOINFOHEADER structuur die meer details bevat over de stream, inclusief rechthoekige afmetingen. De grootte van de invoerframes hoeft niet exact overeen te komen met een grootte die wordt ondersteund door de codec. Als ze niet overeenkomen, zullen de runtimeonderdelen van de SDK in veel gevallen de invoervideoframes automatisch schalen naar iets dat de codec kan accepteren.

De volgende voorbeeldcode zoekt de invoerindeling van het subtype dat als parameter is doorgegeven. Voor meer informatie over het gebruik van deze code, zie De codevoorbeelden gebruiken.

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 Interface

ASF-bestanden schrijven