So enumerieren Sie Eingabeformate

[Das dieser Seite zugeordnete Feature Windows Media Format 11 SDK ist ein Legacyfeature. Sie wurde durch den Quellleser und den Senkenschreiber ersetzt. Quellleser und Senkenschreiber wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit den Quellleser und senkenden Writer anstelle des Windows Media Format 11 SDK verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Jeder Der Windows Media-Codecs akzeptiert einen oder mehrere Arten von Eingabemedien für die Komprimierung. Mit dem Windows Media Format SDK können Sie eine größere Vielfalt von Formaten als die von den Codecs unterstützten eingeben. Dazu führt das SDK bei Bedarf Transformationen für die Eingaben vor, z. B. ändern sie die Größe von Videoframes oder die Audiowiedergabe. 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 im Writer festgelegt wird, wenn das Profil geladen wird. Sie können das Standardeingabeformat untersuchen, indem Sie IWMWriter::GetInputProps aufrufen.

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

Führen Sie die folgenden Schritte aus, um die von einem Codec unterstützten Eingabeformate aufzulisten:

  1. Erstellen Sie ein Writer-Objekt, 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. Geben Sie die Eingabenummer an, 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 Gesamtanzahl der Eingabeformate ab, die von der gewünschten Eingabe unterstützt werden, indem Sie IWMWriter::GetInputFormatCount aufrufen.
  4. Durchlaufen Sie alle unterstützten Eingabeformate, wobei Sie 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::GetMediaType auf, und übergeben Sie NULL für den pType-Parameter , um die Größe der Struktur abzurufen. Ordnen Sie dann Arbeitsspeicher zu, um die Struktur zu speichern, und rufen Sie GetMediaType erneut auf, um die Struktur abzurufen. IWMInputMediaProps erbt von IWMMediaProps, sodass Sie die Aufrufe von GetMediaType aus dem instance der im vorherigen Schritt abgerufenen IWMInputMediaProps tätigen können.
    • Das in der WM_MEDIA_TYPE-Struktur beschriebene Format enthält alle relevanten Informationen zum Eingabeformat. Das Basisformat der Medien wird durch WM_MEDIA_TYPE.subtype identifiziert. Bei Videostreams zeigt 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 ist nicht erforderlich, um genau einer größe zu entsprechen, die vom Codec unterstützt wird. Wenn sie nicht übereinstimmen, ändern die SDK-Laufzeitkomponenten in vielen Fällen die Größe der Eingabevideoframes automatisch in etwas, das der Codec akzeptieren kann.

Der folgende Beispielcode findet das Eingabeformat des Als Parameter übergebenen Untertyps. 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