Verwenden des Demux mit PSI-Streams

[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.]

Um PSI-Informationen aus einem MPEG-2-Transportstream mithilfe des MPEG-2-Demux-Filters abzurufen, erstellen Sie einen Ausgabepin am Demux mit dem folgenden Medientyp:

  • Haupttyp: KSDATAFORMAT_TYPE_MPEG2_SECTIONS
  • Untertyp: MEDIASUBTYPE_None
  • Formattyp: GUID_NULL

Rufen Sie dann die IMPEG2PIDMap::MapPID-Methode des Ausgabepins mit der gewünschten PID und dem Flag MEDIA_MPEG2_PSI auf.

// 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();
}

Jeder vollständige PSI-Abschnitt wird in einem Medienbeispiel bereitgestellt. Um die PID-Nummer abzurufen, die einem Tabellenabschnitt zugeordnet ist, rufen Sie IMediaSample2::GetProperties für das Medienbeispiel auf. Die PID wird in den niedrigen 13 Bits des dwTypeSpecificFlags-Flags in der AM_SAMPLE2_PROPERTIES-Struktur angegeben. Dies ist nützlich, wenn Sie demselben Ausgabenadel mehrere PSI-PIDs zuordnen.

Verwenden des MPEG-2-Demultiplexers