Использование Demux со потоками PSI

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Чтобы получить сведения о PSI из транспортного потока MPEG-2 с помощью демукс-фильтра MPEG-2, создайте выходную закрепку на demux со следующим типом мультимедиа:

  • Основной тип: KSDATAFORMAT_TYPE_MPEG2_SECTIONS
  • Подтип: MEDIASUBTYPE_None
  • Тип формата: GUID_NULL

Затем вызовите метод IMPEG2PIDMap::MapPID выходного закрепления с нужным PID и флагом MEDIA_MPEG2_PSI.

// 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 задается в низких 13 бит флага dwTypeSpecificFlags в структуре AM_SAMPLE2_PROPERTIES . Это полезно, если вы сопоставляете несколько PSI PID с одной и той же выходной закрепкой.

Использование демультиплексера MPEG-2