다음을 통해 공유


PSI 파서 필터 샘플

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

Description

PSI 파서 필터는 MPEG-2 전송 스트림에서 PSI(프로그램별 정보)를 수신하고 PAT(프로그램 연결 테이블) 및 PMT(프로그램 맵 테이블)에서 프로그램 정보를 추출합니다. 이 정보를 사용하면 애플리케이션에서 MPEG-2 Demultiplexer를 구성할 수 있습니다. 필터는 PSI 정보를 검색하기 위한 사용자 지정 인터페이스인 IMpeg2PsiParser를 지원합니다.

이 필터는 IEEE 1394 MPEG-2 캠코더 및 D-VHS 디바이스와 같은 MPEG-2 디바이스용으로 설계되었습니다. 자세한 내용은 MSTape 드라이버를 참조하세요. 디지털 텔레비전 브로드캐스트 원본은 TIF 필터를 사용하여 프로그램 정보를 가져와야 합니다.

사용량

다음과 같이 GraphEdit에서 PSI 파서 필터를 테스트할 수 있습니다.

  1. GraphEdit를 시작합니다.

  2. MPEG-2 전송 원본을 삽입합니다. MPEG-2 캠코더 및 D-VHS 디바이스는 비디오 캡처 원본 범주에 "Microsoft AV/C 테이프 하위 장치"로 표시됩니다.

  3. 원본 필터를 MPEG-2 Demultiplexer 필터에 연결합니다.

  4. demux의 속성 페이지를 사용하여 "MPEG-2 PSI" 미디어 형식의 출력 핀을 만듭니다. 이 핀은 PAT 및 PMT 섹션을 제공합니다.

  5. demux 속성 페이지를 사용하여 PID 0x00 출력 핀에 매핑합니다. 콘텐츠 형식을 "MPEG2 PSI 섹션"으로 설정합니다.

  6. 다음 다이어그램과 같이 demux 출력 핀을 PSI 파서에 연결합니다.

    psi 파서 필터 그래프

  7. PSI 데이터를 PSI 파서 필터에 공급하기 위해 그래프를 실행합니다. 필터는 PAT 섹션을 디코딩하므로 PMT 섹션을 받을 수 있도록 PMT PID를 demux의 동일한 출력 핀에 자동으로 매핑합니다.

  8. PSI 파서 속성 페이지를 사용하여 프로그램 번호를 선택합니다. 속성 페이지의 기본 스트림 목록에는 선택한 프로그램의 각 기본 스트림과 연결된 PID 및 스트림 유형이 표시됩니다. 속성 페이지는 ISO/IEC 13818-1에 정의된 스트림 형식을 인식하도록 설계되었습니다.

  9. 오디오 PID 편집 상자에 오디오 PID 번호를 입력하고 비디오 PID 편집 상자에 비디오 PID 번호를 입력합니다.

  10. 프로그램 보기 단추를 클릭합니다. PSI 파서는 프로그램 스트림 정보와 일치하고 핀을 렌더링하도록 demux의 출력 핀을 구성합니다.

참고

PSI 파서 속성 페이지는 테스트를 더 쉽게 하고 MPEG-2 Demultiplexer를 구성하는 샘플 코드를 제공하기 위해 제공됩니다. 애플리케이션에서 사용하지 않는 것이 좋습니다. 애플리케이션은 demux를 프로그래밍 방식으로 구성해야 합니다.

 

애플리케이션에서 PSI 파서 필터를 사용하려면 먼저 MPEG-2 원본에서 MPEG-2 demux로 필터 그래프를 빌드합니다. 정확한 그래프 구성은 원본에 따라 달라지므로 이 단계의 코드는 여기에 표시되지 않습니다.

다음으로, PSI 데이터에 대한 demux에 출력 핀을 만듭니다. 다음 코드와 같이 PAT 섹션용으로 예약된 PID 0x00 이 핀에 매핑합니다.

// Set the media type to MPEG-2 table sections.
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = KSDATAFORMAT_TYPE_MPEG2_SECTIONS;

// Create the pin.
IPin *pPsiPin;
hr = pDemux->CreateOutputPin(&mt, L"PSI", &pPsiPin);
if (SUCCEEDED(hr))
{
    // Map to PID 0.
    ULONG Pid = 0x00;
    hr = pPid->MapPID(1, &Pid, MEDIA_MPEG2_PSI);
}

자세한 내용은 MPEG-2 Demultiplexer 사용을 참조하세요.

PSI 파서 필터를 그래프에 추가하고 demux의 출력 핀에 연결합니다. IMpeg2PsiParser 인터페이스에 대한 PSI 파서 쿼리 이제 그래프를 실행하고 새 PAT 또는 PMT 섹션을 알리는 EC_PROGRAM_CHANGED 이벤트를 기다립니다. 이 이벤트는 PSI 파서 필터에서 정의한 사용자 지정 이벤트입니다. EC_PROGRAM_CHANGED 이벤트를 받으면 IMpeg2PsiParser 메서드를 호출하여 사용 가능한 PSI 정보를 가져올 수 있습니다. 이 섹션에서는 가장 자주 필요한 메서드에 대해 설명합니다.

프로그램 수를 얻으려면 IMpeg2PsiParser::GetCountOfPrograms 메서드를 사용합니다.

int NumProgs = 0;
hr = pPsi->GetCountOfPrograms(&NumProgs);

특정 프로그램의 프로그램 번호를 얻으려면 IMpeg2PsiParser::GetRecordProgramNumber 메서드를 사용합니다.

WORD ProgNum = 0;
for (int i = 0; i < NumProgs; i++)
{
    hr = pPsi->GetRecordProgramNumber(i, &ProgNum);
    ...
}

프로그램 번호는 개별 프로그램에 대한 PMT 항목을 가져오는 데 사용됩니다. 프로그램의 기본 스트림 수를 얻으려면 GetCountOfElementaryStreams 메서드를 사용합니다.

WORD cElemStreams = 0;
hr = pPsi->GetCountOfElementaryStreams(ProgNum, &cElemStreams);

각 기본 스트림에 대해 IMpeg2PsiParser::GetRecordElementaryPid 메서드는 PID를 반환하고 IMpeg2PsiParser::GetRecordStreamType 메서드는 스트림 형식을 반환합니다.

BYTE ESType = 0;
WORD ESPid = 0;
for (WORD j = 0; j < cElemStreams; j++)
{
    hr = pPsi->GetRecordElementaryPid(ProgNum, j, &ESPid);
    hr = pPsi->GetRecordStreamType(ProgNum, j, &ESType);
}

PID 및 스트림 유형을 사용하면 MPEG-2 Demultiplexer에서 새 출력 핀을 구성할 수 있습니다. 이렇게 하려면 원본에 대한 지식이 필요할 수 있습니다. 예를 들어 ISO/IEC 13818-1은 0xFF 통해 0x80 스트림 형식을 "사용자 프라이빗"으로 정의하지만 MPEG-2를 기반으로 하는 다른 표준은 이러한 형식에 다른 의미를 할당할 수 있습니다.

MPEG-2 Demultiplexer는 그래프가 실행되는 동안 새 핀과 새 PID 매핑을 만들 수 있지만 핀을 연결하려면 그래프를 중지해야 합니다.

샘플 다운로드

DirectShow SDK 샘플을 다운로드하려면 최신 버전의 Windows SDK를 설치합니다.

이 샘플은 [SDK 루트]\Samples\Multimedia\DirectShow\Filters\PSIParser 경로 아래에 설치됩니다.

DirectShow 샘플

IMpeg2PsiParser 인터페이스