Share via


Utilisation de Demux avec des flux PSI

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Pour obtenir des informations PSI à partir d’un flux de transport MPEG-2 à l’aide du filtre demux MPEG-2, créez une broche de sortie sur le demux avec le type de média suivant :

  • Type principal : KSDATAFORMAT_TYPE_MPEG2_SECTIONS
  • Sous-type : MEDIASUBTYPE_None
  • Type de format : GUID_NULL

Appelez ensuite la méthode IMPEG2PIDMap::MapPID de la broche de sortie avec le PID souhaité et l’indicateur 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();
}

Chaque section PSI complète est fournie dans un exemple de média. Pour récupérer le numéro PID associé à une section de table, appelez IMediaSample2::GetProperties sur l’exemple de média. Le PID est donné dans les 13 bits faibles de l’indicateur dwTypeSpecificFlags dans la structure AM_SAMPLE2_PROPERTIES . Cela est utile si vous mappez plusieurs PID PSI à la même broche de sortie.

Utilisation du démultiplexeur MPEG-2