共用方式為


關於 DirectShow (DirectShow) 的媒體類型

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

因為 DirectShow 是模組化的,所以需要一種方式來描述篩選圖表中每個點的資料格式。 例如,請考慮 AVI 播放。 資料會將圖形輸入為 RIFF 區塊的資料流程。 這些會剖析成視訊和音訊資料流程。 視訊串流是由可能壓縮的視訊畫面所組成。 解碼之後,視訊資料流程是一系列未壓縮的點陣圖。 音訊資料流程會經過類似的程式。

媒體類型:DirectShow 如何代表格式

媒體類型是描述數位媒體格式的通用且可延伸的方式。 當兩個篩選連線時,它們同意媒體類型。 媒體類型可識別上游篩選將傳遞至下游篩選的資料類型,以及資料的實體配置。 如果兩個篩選無法同意媒體類型,它們將不會連線。

對於某些應用程式,您永遠不會擔心媒體類型。 例如,在檔案播放中,DirectShow 會處理所有詳細資料。 其他類型的應用程式可能需要直接使用媒體類型。

媒體類型是使用 AM_MEDIA_TYPE 結構來定義。 此結構包含下列資訊:

  • 主要類型:主要類型是定義資料整體類別的 GUID。 主要類型包括視訊、音訊、未剖析的位元組資料流程、MIDI 資料等等。

  • 子類型:子類型是另一個 GUID,進一步定義格式。 例如,在影片主要類型中,RGB-24、RGB-32、UYVY 等有子類型。 在音訊中,有 PCM 音訊、MPEG-1 承載和其他承載。 子類型提供比主要類型更多的資訊,但不會定義格式的所有專案。 例如,視訊子類型不會定義影像大小或畫面播放速率。 這些是由格式區塊所定義,如下所述。

  • 格式區塊:格式區塊是描述詳細格式的資料區塊。 格式區塊會與 AM_MEDIA_TYPE 結構分開配置。 AM_MEDIA_TYPE結構的pbFormat成員會指向格式區塊。

    pbFormat成員是類型void* ,因為格式區塊的配置會根據媒體類型而變更。 例如,PCM 音訊會使用一個其一體。 影片使用各種結構,包括 VIDEOINFOHEADERVIDEOINFOHEADER2AM_MEDIA_TYPE結構的formattype成員是 GUID,指定格式區塊中包含哪一個結構。 每個格式結構都會指派 GUID。 cbFormat成員會指定格式區塊的大小。 一律先檢查這些值,再取值 pbFormat 指標。

如果格式區塊已填入,則主要類型和子類型包含備援資訊。 不過,主要類型和子類型提供一個方便的方式,可識別沒有完整格式區塊的格式。 例如,您可以指定一般 24 位 RGB 格式 (MEDIASUBTYPE_RGB24) ,而不需要知道 VIDEOINFOHEADER 結構所需的所有資訊,例如影像大小和畫面播放速率。

例如,篩選準則可能會使用下列程式碼來檢查媒體類型:

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

AM_MEDIA_TYPE結構也包含一些選擇性欄位。 這些可用來提供其他資訊,但不需要篩選才能使用這些資訊:

  • lSampleSize。 如果此欄位為非零,則會定義每個樣本的大小。 如果是零,表示樣本大小可能會從樣本變更為 sample。
  • bFixedSizeSamples。 如果這個布林值旗標為 TRUE,表示 lSampleSize 中的值有效。 否則,您應該忽略 lSampleSize
  • bTemporalCompression。 如果這個布林值旗標為 FALSE,表示所有畫面都是主要畫面格。

篩選圖形及其元件