World Standard Teletext 보기
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
참고
이 기능은 Windows Vista 이상 운영 체제에서 제거되었습니다. Microsoft Windows 2000, Windows XP 및 Windows Server 2003 운영 체제에서 사용할 수 있습니다.
WST(World Standard Teletext)는 아날로그 텔레비전 신호의 VBI(세로 공백 간격)로 인코딩됩니다. 원격 텍스트를 미리 보기 위한 필터 그래프는 선택 자막을 보는 데 사용되는 그래프와 유사합니다. 다음 다이어그램에서는 이 그래프를 보여 줍니다.
이 그래프는 WST 디스플레이에 대해 다음 필터를 사용합니다.
- Tee/Sink-to-Sink 변환기. 캡처 필터에서 VBI 정보를 수락하고 신호에 있는 각 데이터 서비스에 대해 별도의 스트림으로 분할합니다.
- WST 코덱. VBI 샘플에서 Teletext 데이터를 디코딩합니다.
- WST 디코더. 원격 텍스트 데이터를 변환하고 텍스트를 비트맵에 그립니다. 다운스트림 필터(이 경우 오버레이 믹서)는 비트맵을 비디오에 오버레이합니다.
Capture Graph Builder의 RenderStream 메서드는 WST 필터를 직접 지원하지 않으므로 애플리케이션에서 몇 가지 추가 작업을 수행해야 합니다.
필터 그래프에 오버레이 믹서 필터를 추가합니다. 다음 코드에서는 CLSID로 필터 추가에 설명된 AddFilterByCLSID 함수를 사용합니다. (AddFilterByCLSID는 DirectShow API가 아닙니다.)
IBaseFilter *pOvMix = NULL; // Pointer to the Overlay Mixer filter. hr = AddFilterByCLSID(pGraph, CLSID_OverlayMixer, L"OVMix", &pOvMix); if (FAILED(hr)) { // Handle the error ... }
오버레이 믹서에서 비디오 렌더러 필터에 미리 보기 핀을 연결합니다. 다음과 같이 RenderStream 메서드를 사용할 수 있습니다.
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, pOvMix, 0);
Tee/Sink-to-Sink 변환기 필터를 필터 그래프에 추가합니다. 다음 코드에서는 Kernel-Mode 필터 만들기에 설명된 CreateKernelFilter 함수를 사용합니다. (CreateKernelFilter는 DirectShow API가 아닙니다.)
IBaseFilter* pKernelTee = NULL; hr = CreateKernelFilter(AM_KSCATEGORY_SPLITTER, OLESTR("Tee/Sink-to-Sink Converter"), &pKernelTee); if (SUCCEEDED(hr)) { hr = pGraph->AddFilter(pKernelTee, L"Kernel Tee"); }
WST 코덱 필터를 필터 그래프에 추가합니다.
IBaseFilter* pWstCodec = NULL; hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, OLESTR("WST Codec"), &pWstCodec); if (SUCCEEDED(hr)) { hr = pGraph->AddFilter(pWstCodec, L"WST Codec"); }
RenderStream을 호출하여 캡처 필터의 VBI 핀을 Tee/Sink-to-Sink 변환기에 연결하고 Tee/Sink-to-Sink 변환기를 WST 코덱 필터에 연결합니다.
hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, pKernelTee, pWstCodec);
RenderStream을 다시 호출하여 WST 코덱 필터를 오버레이 믹서에 연결합니다. WST 디코더 필터가 그래프로 자동으로 가져옵니다.
hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
모든 필터 인터페이스를 해제해야 합니다.
pOvMix->Release(); pKernelTee->Release(); pWstCodec->Release();
참고
현재 WST 디코더 필터는 VMR(비디오 혼합 렌더러) 필터에 대한 연결을 지원하지 않습니다. 따라서 레거시 Video Renderer 필터를 사용하여 텔레텍스트를 확인해야 합니다.
캡처 필터에 비디오 포트 VBI 핀(PIN_CATEGPORY_VIDEOPORT_VBI)이 있는 경우 VBI Surface 할당자 필터에 연결합니다. 그렇지 않으면 그래프가 올바르게 실행되지 않습니다. 다음 코드 예제에서는 CLSID로 필터 추가에 설명된 AddFilterByCLSID 함수와 Pin 범주 작업에 설명된 FindPinByCategory 함수를 사용합니다. (두 함수 모두 DirectShow API가 아닙니다.)
// Look for a video port VBI pin on the capture filter.
IPin *pVPVBI = NULL;
hr = FindPinByCategory(pCap, PINDIR_OUTPUT,
PIN_CATEGORY_VIDEOPORT_VBI, &pVPVBI);
if (FAILED(hr))
{
// No video port VBI pin; nothing else to do. OK to run the graph.
}
else
{
// Found one. Connect it to the VBI Surface Allocator.
IBaseFilter *pSurf = NULL;
hr = AddFilterByCLSID(pGraph, CLSID_VBISurfaces, L"VBI Surf", &pSurf);
if (SUCCEEDED(hr))
{
hr = pBuild->RenderStream(NULL, NULL, pVPVBI, 0, pSurf);
pSurf->Release();
}
if (FAILED(hr))
{
// Handle the error (not shown). It is probably not safe to
// run the graph at this point.
}
pVPVBI->Release();
}
관련 항목