다음을 통해 공유


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 인터페이스를 지원하지 않습니다.

DirectShow 필터