So enumerieren Sie Eingabeformate

Jeder der Windows Mediencodecs akzeptiert einen oder mehrere Arten von Eingabemedien für die Komprimierung. Mit Windows Media Format SDK können Sie eine größere Bandbreite von Formaten eingeben, als von den Codecs unterstützt werden. Das SDK führt dazu bei Bedarf Vorverarbeitungstransformationen für die Eingaben durch, z. B. das Ändern der Größe von Videoframes oder das Resampling von Audio. In jedem Fall müssen Sie sicherstellen, dass die Eingabeformate für die dateien, die Sie schreiben, mit den Daten übereinstimmen, die Sie an den Writer senden. Jeder Codec verfügt über ein Standardformat für Eingabemedien, das beim Laden des Profils im Writer festgelegt wird. Sie können das Standardeingabeformat untersuchen, indem Sie IWMWriter::GetInputProps aufrufen.

Die Videocodecs unterstützen die folgenden Formate: IYUV, I420, YV12, YUY2, UYCLIP, YVCCA, YUV9, RGB 32, RGB 24, RGB 565, RGB 555 und RGB 8. Die Audiocodecs unterstützen PCM-Audio.

Um die von einem Codec unterstützten Eingabeformate aufzählen zu können, führen Sie die folgenden Schritte aus:

  1. Erstellen Sie ein Writerobjekt, und legen Sie ein zu verwendende Profil fest. Weitere Informationen zum Festlegen von Profilen im Writer finden Sie unter So verwenden Sie Profile mit dem Writer.
  2. Identifizieren Sie die Eingabenummer, für die Sie die Formate überprüfen möchten. Weitere Informationen zum Identifizieren von Eingabenummern finden Sie unter So identifizieren Sie Eingaben nach Zahl.
  3. Rufen Sie die Gesamtzahl der Eingabeformate ab, die von der gewünschten Eingabe unterstützt werden, indem Sie IWMWriter::GetInputFormatCount aufrufen.
  4. Schleife durch alle unterstützten Eingabeformate, die jeweils die folgenden Schritte ausführen.
    • Rufen Sie die IWMInputMediaProps-Schnittstelle für das Eingabeformat ab, indem Sie IWMWriter::GetInputFormat aufrufen.
    • Rufen Sie die WM _ MEDIA _ TYPE-Struktur für das Eingabeformat ab. Rufen Sie IWMMediaProps::GetMediaTypeauf, und übergeben Sie NULL für den pType-Parameter, um die Größe der Struktur zu erhalten. Ordnen Sie dann Arbeitsspeicher zu, um die Struktur zu halten, und rufen Sie Erneut GetMediaType auf, um die Struktur zu erhalten. IWMInputMediaProps erbt von IWMMediaProps,sodass Sie die Aufrufe von GetMediaType aus der Instanz von IWMInputMediaProps, die im vorherigen Schritt abgerufen wurde, tätigen können.
    • Das in der WM _ MEDIA _ TYPE-Struktur beschriebene Format enthält alle relevanten Informationen zum Eingabeformat. Das grundlegende Format des Mediums wird durch WM _ MEDIA _ TYPE.subtype identifiziert. Bei Videostreams verweist das pbFormat-Element auf eine dynamisch zugeordnete WMVIDEOINFOHEADER-Struktur, die weitere Details zum Stream enthält, einschließlich der Rechteckgröße. Die Größe der Eingabeframes muss nicht genau mit einer vom Codec unterstützten Größe übereinstimmen. Wenn sie nicht übereinstimmen, ändern die SDK-Laufzeitkomponenten in vielen Fällen automatisch die Größe der Eingabevideoframes so, dass sie vom Codec akzeptiert werden können.

Der folgende Beispielcode sucht das Eingabeformat des Untertyps, der als Parameter übergeben wird. Weitere Informationen zur Verwendung dieses Codes finden Sie unter Verwenden der Codebeispiele.

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-Schnittstelle

Schreiben von ASF-Dateien