다음을 통해 공유


PSI 스트림과 함께 Demux 사용

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 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 사용