Freigeben über


Informationen zu Medientypen (DirectShow)

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Da DirectShow modular ist, ist eine Möglichkeit erforderlich, das Format der Daten an jedem Punkt im Filterdiagramm zu beschreiben. Betrachten Sie beispielsweise die AVI-Wiedergabe. Daten werden als Stream von RIFF-Blöcken in das Diagramm eingegeben. Diese werden in Video- und Audiostreams analysiert. Der Videostream besteht aus Videoframes, die wahrscheinlich komprimiert sind. Nach der Decodierung besteht der Videostream aus einer Reihe nicht komprimierter Bitmaps. Der Audiostream durchläuft einen ähnlichen Prozess.

Medientypen: Wie DirectShow Formate darstellt

Der Medientyp ist eine universelle und erweiterbare Möglichkeit, digitale Medienformate zu beschreiben. Wenn zwei Filter eine Verbindung herstellen, stimmen sie auf einen Medientyp überein. Der Medientyp gibt an, welche Art von Daten der Upstream-Filter an den Downstreamfilter übermittelt, und das physische Layout der Daten. Wenn sich zwei Filter nicht auf einen Medientyp einigen können, wird keine Verbindung hergestellt.

Bei einigen Anwendungen müssen Sie sich nie um Medientypen kümmern. Bei der Dateiwiedergabe verarbeitet DirectShow beispielsweise alle Details. Andere Arten von Anwendungen müssen möglicherweise direkt mit Medientypen arbeiten.

Medientypen werden mithilfe der AM_MEDIA_TYPE-Struktur definiert. Diese Struktur enthält die folgenden Informationen:

  • Haupttyp: Der Haupttyp ist eine GUID, die die Gesamtkategorie der Daten definiert. Zu den wichtigsten Typen gehören Video, Audio, nicht analysierter Bytestream, MIDI-Daten usw.

  • Untertyp: Der Untertyp ist eine weitere GUID, die das Format weiter definiert. Beispielsweise gibt es innerhalb des Video-Haupttyps Untertypen für RGB-24, RGB-32, UYVY usw. Innerhalb von Audio gibt es PCM-Audio, MPEG-1-Nutzlast und andere. Der Untertyp bietet mehr Informationen als der Haupttyp, definiert aber nicht alles über das Format. Videountertypen definieren beispielsweise nicht die Bildgröße oder die Bildrate. Diese werden durch den Formatblock definiert, der unten beschrieben wird.

  • Formatblock: Der Formatblock ist ein Datenblock, der das Format detailliert beschreibt. Der Formatblock wird getrennt von der AM_MEDIA_TYPE-Struktur zugeordnet. Das pbFormat-Element der AM_MEDIA_TYPE-Struktur zeigt auf den Formatblock.

    Das pbFormat-Element wird void* eingegeben, da sich das Layout des Formatblocks je nach Medientyp ändert. PcM-Audio verwendet beispielsweise eine WAVEFORMATEX-Struktur . Video verwendet verschiedene Strukturen, einschließlich VIDEOINFOHEADER und VIDEOINFOHEADER2. Das Formattypelement der AM_MEDIA_TYPE-Struktur ist eine GUID, die angibt, welche Struktur im Formatblock enthalten ist. Jeder Formatstruktur wird eine GUID zugewiesen. Das cbFormat-Element gibt die Größe des Formatblocks an. Überprüfen Sie immer diese Werte, bevor Sie den pbFormat-Zeiger ableiten.

Wenn der Formatblock ausgefüllt ist, enthalten der Haupt- und Untertyp redundante Informationen. Der Haupt- und Untertyp bieten jedoch eine bequeme Möglichkeit, Formate ohne vollständigen Formatblock zu identifizieren. Sie können beispielsweise ein generisches 24-Bit-RGB-Format (MEDIASUBTYPE_RGB24) angeben, ohne alle für die VIDEOINFOHEADER-Struktur erforderlichen Informationen wie Bildgröße und Bildrate zu kennen.

Beispielsweise kann ein Filter den folgenden Code verwenden, um einen Medientyp zu überprüfen:

HRESULT CheckMediaType(AM_MEDIA_TYPE *pmt)
{
    if (pmt == NULL) return E_POINTER;

    // Check the major type. We're looking for video.
    if (pmt->majortype != MEDIATYPE_Video)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the subtype. We're looking for 24-bit RGB.
    if (pmt->subtype != MEDIASUBTYPE_RGB24)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the format type and the size of the format block.
    if ((pmt->formattype == FORMAT_VideoInfo) &&
         (pmt->cbFormat >= sizeof(VIDEOINFOHEADER) &&
         (pmt->pbFormat != NULL))
    {
        // Now it's safe to coerce the format block pointer to the
        // correct structure, as defined by the formattype GUID.
        VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    
        // Examine pVIH (not shown). If it looks OK, return S_OK.
        return S_OK;
    }

    return VFW_E_INVALIDMEDIATYPE;
}

Die AM_MEDIA_TYPE-Struktur enthält auch einige optionale Felder. Diese können verwendet werden, um zusätzliche Informationen bereitzustellen, aber Filter sind nicht erforderlich, um sie zu verwenden:

  • lSampleSize. Wenn dieses Feld ungleich 0 ist, definiert es die Größe jedes Beispiels. Wenn sie 0 ist, gibt dies an, dass sich die Stichprobengröße möglicherweise von Sample zu Sample ändert.
  • bFixedSizeSamples. Wenn dieses boolesche Flag TRUE ist, bedeutet dies, dass der Wert in lSampleSize gültig ist. Andernfalls sollten Sie lSampleSize ignorieren.
  • bTemporalCompression. Wenn dieses boolesche Flag FALSE ist, bedeutet dies, dass alle Frames Keyframes sind.

Das Filterdiagramm und seine Komponenten