SAMI 미디어 원본

SAMI(Synchronized Accessible Media Interchange)는 디지털 미디어에 캡션을 추가하는 형식입니다. 캡션은 파일 이름 확장명 .smi 또는 .sami가 있는 별도의 텍스트 파일에 저장됩니다.

Media Foundation에서 SAMI 캡션 파일은 SAMI 미디어 원본을 통해 지원됩니다. 원본 확인자를 사용하여 URL 또는 바이트 스트림에서 SAMI 미디어 원본의 instance 만듭니다. Media Foundation은 SAMI 캡션을 표시하는 구성 요소를 제공하지 않습니다. 애플리케이션은 SAMI 미디어 원본에서 수신하는 캡션 데이터를 해석해야 합니다.

다음은 예제 SAMI 파일을 보여줍니다.

<SAMI>
<HEAD>
    <STYLE TYPE="text/css">
    <!--
    P {
        font-family: Arial;
        background: #000000;
        text-align: center;
        }

#standard {Name: Standard; color: #FFFFFF; font-size: 14pt; } 
#hilite {Name: Youth; color: greenyellow; font-size: 18pt;}

    .ENUSCC { Name: English; lang: EN-US-CC; }
    .FRFRCC { Name: French; lang: fr-FR; } 

    -->
    </STYLE>
</HEAD>
<BODY>
    <SYNC Start="0">
        <P Class="ENUSCC">The <I>first</I> caption.</P>
        <P Class="FRFRCC">Un</P>
    </SYNC>
    <SYNC Start="3000">
        <P Class="ENUSCC">The <I>second</I> caption.</P>
        <P Class="FRFRCC">Deux</P>
    </SYNC>
    <SYNC Start="5000">
        <P Class="ENUSCC">The <I>third</I> caption.</P>
        <P Class="FRFRCC">Trois</P>
    </SYNC>
</BODY>
</SAMI>

요소에는 <STYLE> 스타일 정보가 포함됩니다. 이 예제에는 두 개의 명명된 스타일인 "standard" 및 "hilite"와 함께 요소에 대한 <P> 기본 스타일이 포함되어 있습니다. 명명된 스타일은 기본 스타일을 수정하는 데 사용됩니다. 캡션은 요소 내에 <SYNC> 배치됩니다. start 특성은 해당 캡션 대한 프레젠테이션 시간을 밀리초 단위로 제공합니다. 이 예제의 캡션은 RFC-1766 언어 태그인 "en-US" 및 "fr -FR"로 지정된 두 가지 언어로 제공됩니다. 캡션 내에서 언어는 클래스 이름으로 식별됩니다. 이 경우 "ENUSCC" 및 "FRFRCC"입니다.

SAMI 미디어 원본은 각 언어에 대해 하나의 미디어 스트림을 만듭니다. 기본적으로 첫 번째 스트림이 선택되고 나머지 스트림은 선택 취소됩니다. 애플리케이션은 IMFPresentationDescriptor::SelectStreamIMFPresentationDescriptor::D eselectStream을 호출하여 스트림 선택을 변경할 수 있습니다. 각 스트림 설명자에는 다음 특성이 포함됩니다.

attribute Description
MF_SD_LANGUAGE 특성에 의해 지정된 언어 태그입니다 lang .
MF_SD_SAMI_LANGUAGE 특성에서 지정한 Name 언어 이름입니다.

 

각 스트림에는 다음과 같은 미디어 유형이 있습니다.

attribute
MF_MT_MAJOR_TYPE MFMediaType_SAMI
MF_MT_ALL_SAMPLES_INDEPENDENT TRUE

 

SAMI 소스는 별도의 미디어 샘플에서 각 캡션 제공합니다. 샘플 타임스탬프는 요소에서 <SYNC> 파생됩니다. 샘플에 포함된 미디어 버퍼는 캡션 ASCII 텍스트로 저장합니다. 캡션 스타일은 인라인 STYLE 특성으로 캡션 포함됩니다. 예를 들어 이전 SAMI 파일을 지정하고 기본 스타일이 있는 영어 스트림을 사용하면 첫 번째 미디어 버퍼에 다음 데이터가 포함됩니다. 줄 바꿈은 여기에 표시된 것과 다를 수 있습니다.

<P STYLE="
    font-family: Arial;
    background: #000000;
    text-align: center;
    Name: English; lang: EN-US-CC;  
    Name: Standard; color: #FFFFFF; 
    font-size: 14pt; ">The<I>first</I> caption.

SAMI 스타일

현재 스타일을 변경하려면 IMFSAMIStyle 인터페이스를 사용합니다. 이 인터페이스는 SAMI 미디어 원본에서 IMFGetService::GetService 를 호출하여 가져옵니다. (미디어 세션에서 SAMI 미디어 원본을 사용하는 경우 미디어 세션에서 GetService 를 호출합니다.) 서비스 식별자가 MF_SAMI_SERVICE.

다음 예제에서는 인덱스로 지정된 현재 SAMI 스타일을 설정합니다.

HRESULT SetSAMIStyleByIndex(IMFMediaSource *pSource, DWORD index)
{
    IMFSAMIStyle *pSami = NULL;

    DWORD cStyles;
    PROPVARIANT varStyles;

    HRESULT hr = MFGetService(pSource, MF_SAMI_SERVICE, IID_PPV_ARGS(&pSami));
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pSami->GetStyleCount(&cStyles);
    if (FAILED(hr))
    {
        goto done;
    }

    if (index >= cStyles)
    {
        hr = E_INVALIDARG;
        goto done;
    }

    hr = pSami->GetStyles(&varStyles);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pSami->SetSelectedStyle(varStyles.calpwstr.pElems[index]);

done:
    PropVariantClear(&varStyles);
    SafeRelease(&pSami);
    return hr;
}

이 예제에서는 SAMI 미디어 원본에서 다음 메서드를 호출합니다.

스타일 이름 목록은 MF_PD_SAMI_STYLELIST 특성의 프레젠테이션 설명자에도 저장됩니다.

미디어 원본 및 싱크

미디어 파운데이션에서 지원되는 미디어 형식