SAMI(CC) 파서 필터
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
SAMI(Synchronized Accessible Media Interchange) 파일에서 캡션 데이터를 구문 분석합니다.
SAMI는 HTML과 유사한 텍스트 형식이며 시간 기반 캡션 인코딩에 사용됩니다. 이 필터는 SAMI 데이터를 텍스트 스트림으로 변환합니다. 스트림의 각 샘플에는 형식 정보와 함께 하나의 캡션 항목이 포함되어 있습니다. 샘플의 타임스탬프는 SAMI 파일의 시간 정보에서 생성됩니다.
이 필터는 내부 스크립트 명령 렌더러 필터와 함께 사용하도록 설계되었습니다. 내부 스크립트 명령 렌더러는 텍스트 샘플을 수신하고 이벤트 알림 형식으로 애플리케이션에 보냅니다. 자세한 내용은 주의 섹션을 참조하세요.
레이블 | 값 |
---|---|
필터 인터페이스 | IAMStreamSelect, IBaseFilter |
입력 핀 미디어 형식 | MEDIATYPE_Stream |
입력 핀 인터페이스 | IPin, IQualityControl |
출력 핀 미디어 형식 | MEDIATYPE_Text, MEDIASUBTYPE_NULL |
출력 핀 인터페이스 | IMediaSeeking, IPin, IQualityControl |
CLSID 필터링 | {33FACFE0-A9BE-11D0-A520-00A0D10129C0} |
속성 페이지 CLSID | 속성 페이지 없음 |
실행 파일 | quartz.dll |
장점 | MERIT_UNLIKELY |
필터 범주 | CLSID_LegacyAmFilterCategory |
설명
다음은 간단한 SAMI 파일입니다.
<SAMI>
<Head>
<STYLE TYPE="text/css"> <!--
.ENCC {Name: English; lang:en-US; SAMI_TYPE: CC;}
.FRCC {Name: French; lang:fr-FR; SAMI_TYPE: CC;}
#NORMAL {Name: Normal; font-family: arial;}
#GREENTEXT {Name: GreenText; color:green; font-family: verdana;}
-->
</STYLE>
</Head>
<BODY>
<Sync Start=1000>
<P CLASS="ENCC">One
<P CLASS="FRCC">Un
<Sync Start=2000>
<P CLASS="ENCC">Two
<P CLASS="FRCC">Deux
<Sync Start=3000>
<P CLASS="ENCC">Three
<P CLASS="FRCC">Trois
</BODY>
</SAMI>
STYLE 태그는 영어()의 두 가지 언어 설정을 정의합니다. ENCC) 및 프랑스어(. FRCC). 또한 #NORMAL 및 #GREENTEXT 두 가지 스타일을 정의합니다. 각 SYNC 태그는 캡션 시작 시간을 밀리초 단위로 정의합니다. P 태그에는 캡션 텍스트가 포함되며 CLASS 특성은 캡션 적용되는 언어 설정을 지정합니다.
각 언어 및 스타일에 대해 필터는 논리 스트림을 만듭니다. 언제든지 정확히 하나의 언어 스트림과 하나의 스타일 스트림이 활성화됩니다. 필터가 샘플을 생성하면 현재 언어에 대한 캡션 선택하고 현재 스타일을 적용합니다. 기본적으로 파일에 선언된 첫 번째 언어와 스타일이 사용하도록 설정됩니다. 애플리케이션은 IAMStreamSelect::Enable 메서드를 사용하여 다른 스트림을 사용하도록 설정할 수 있습니다.
기본 설정을 사용하면 예제 파일의 첫 번째 캡션 다음 출력을 생성합니다.
<P STYLE=" Name: English; lang:en-US; SAMI_TYPE: CC; Name: Normal; font-family: arial;">One
출력이 내부 스크립트 명령 렌더러로 전달되면 해당 필터는 EC_OLE_EVENT 이벤트 알림을 보냅니다. 두 번째 이벤트 매개 변수는 캡션 텍스트가 있는 BSTR입니다. 애플리케이션은 이벤트를 검색하고 캡션 표시할 수 있습니다.
다음 예제에서는 SAMI 파일을 렌더링하고, 스트림 정보를 검색하고, 스트림을 사용하도록 설정하고, 캡션 텍스트를 표시하는 방법을 보여 줍니다. 이 예제에서는 이전 SAMI 파일이 C:\Sami_test_file.sami로 저장된다고 가정합니다.
간단히 하기 위해 이 예제에서는 IAMStreamSelect::Enable 메서드를 호출할 때 하드 코딩된 스트림 인덱스를 사용했습니다. 또한 최소한의 오류 검사를 수행합니다.
void __cdecl main()
{
HRESULT hr;
IGraphBuilder *pGraph;
IMediaControl *pMediaControl;
IMediaEventEx *pEv;
IBaseFilter *pSAMI;
CoInitialize(NULL);
// Create the filter graph manager.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **)&pGraph);
pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
pGraph->QueryInterface(IID_IMediaEventEx, (void**)&pEv);
// Create the graph and find the SAMI parser.
pGraph->RenderFile(L"C:\\Sami_test_file.sami", NULL);
hr = pGraph->FindFilterByName(L"SAMI (CC) Parser", &pSAMI);
if (SUCCEEDED(hr))
{
IAMStreamSelect *pStrm = NULL;
hr = pSAMI->QueryInterface(IID_IAMStreamSelect, (void**)&pStrm);
if (SUCCEEDED(hr))
{
DWORD dwStreams = 0;
pStrm->Count(&dwStreams);
printf("Stream count: %d\n", dwStreams);
// Select French and "GreenText"
hr = pStrm->Enable(1, AMSTREAMSELECTENABLE_ENABLE);
hr = pStrm->Enable(3, AMSTREAMSELECTENABLE_ENABLE);
// Print the name of each logical stream.
for (DWORD index = 0; index < dwStreams; index++)
{
DWORD dwFlags;
WCHAR *wszName;
hr = pStrm->Info(index, NULL, &dwFlags, NULL, NULL,
&wszName, NULL, NULL);
if (hr == S_OK)
{
wprintf(L"Stream %d: %s [%s]\n", index, wszName,
(dwFlags ? L"ENABLED" : L"DISABLED"));
CoTaskMemFree(wszName);
}
}
pStrm->Release();
}
pSAMI->Release();
}
// Run the graph and display the captions.
pMediaControl->Run();
while (1)
{
long evCode, lParam1, lParam2;
pEv->GetEvent(&evCode, &lParam1, &lParam2, 100);
if (evCode == EC_OLE_EVENT) {
wprintf(L"%s\n", (BSTR)lParam2);
}
pEv->FreeEventParams(evCode, lParam1, lParam2);
if (evCode == EC_USERABORT || evCode == EC_COMPLETE || evCode == EC_ERRORABORT)
break;
}
// Clean up.
pMediaControl->Release();
pEv->Release();
pGraph->Release();
CoUninitialize();
}
이 필터는 IAsyncReader 인터페이스를 사용하여 원본 필터에서 샘플을 가져옵니다. 따라서 입력 핀에서 IMemInputPin 인터페이스를 지원하지 않습니다.
관련 항목