搭配 PSI 資料流程使用 Demux

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

若要使用 MPEG-2 demux 篩選從 MPEG-2 傳輸資料流程取得 PSI 資訊,請使用下列媒體類型在 demux 上建立輸出針腳:

  • 主要類型:KSDATAFORMAT_TYPE_MPEG2_SECTIONS
  • 子類型:MEDIASUBTYPE_None
  • 格式類型:GUID_Null

然後使用所需的 PID 和旗標MEDIA_MPEG2_PSI呼叫輸出針腳的 IMPEG2PIDMap::MapPID 方法。

// Query the demux filter for IMpeg2Demultiplexer.
IMpeg2Demultiplexer *pDemux = NULL;
hr = pFilter->QueryInterface(IID_IMpeg2Demultiplexer, (void**)&pDemux);
if (SUCCEEDED(hr))
{
    // Define the media type.
    AM_MEDIA_TYPE mt;
    ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
    mt.majortype = KSDATAFORMAT_TYPE_MPEG2_SECTIONS;
    mt.subtype = MEDIASUBTYPE_None;

    // Create a new output pin.
    IPin *pPin;
    hr = pDemux->CreateOutputPin(&mt, L"PSI Pin", &pPin);
    if (SUCCEEDED(hr))
    {
        // Map the PID.
        IMPEG2PIDMap *pPidMap = NULL;
        hr = pPin->QueryInterface(IID_IMPEG2PIDMap, (void**)&pPidMap);
        if (SUCCEEDED(hr))
        {
            ULONG Pid[] = { 0x00 }; // Map any desired PIDs. 
            ULONG cPid = 1;
            hr = pPidMap->MapPID(cPid, Pid, MEDIA_MPEG2_PSI);
            pPidMap->Release();
        }
        pPin->Release();
    }
    pDemux->Release();
}

每個完整的 PSI 區段都會在一個媒體範例中傳遞。 若要擷取與資料表區段相關聯的 PID 號碼,請在媒體範例上呼叫 IMediaSample2::GetProperties 。 PID 會在AM_SAMPLE2_PROPERTIES結構中dwTypeSpecificFlags 旗標的低 13 位中提供。 如果您將多個 PSI PID 對應至相同的輸出針腳,這會很有用。

使用 MPEG-2 Demultiplexer