将 Demux 与 PSI 流配合使用

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 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 多路复用器