PSI 스트림과 함께 Demux 사용
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media 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를 동일한 출력 핀에 매핑하는 경우에 유용합니다.
관련 항목