SAMI 媒體來源

已同步處理的無障礙媒體交換 (SAMI) 是將輔助字幕新增至數位媒體的格式。 標題會儲存在副檔名為 .smi 或 .sami 的個別文字檔中。

在媒體基礎中,SAMI 標題檔案可透過 SAMI 媒體來源支援。 使用 來源解析程式 ,從 URL 或位元組資料流程建立 SAMI 媒體來源的實例。 媒體基礎不提供顯示 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> 包含樣式資訊。 此範例包含元素的 <P> 基底樣式,以及兩個具名樣式「standard」 和 「hilite」。 具名樣式可用來修改基底樣式。 標題會放在元素內 <SYNC> 。 start 屬性會提供該標題以毫秒為單位的呈現時間。 此範例中的標題會以兩種語言提供,由其 RFC-1766 語言標記、「en-US」 和 「fr -FR」 指定。 在標題內,語言會以其類別名稱來識別;在此案例中為 「ENUSCC」 和 「FRFRCC」。

SAMI 媒體來源會為每個語言建立一個媒體資料流程。 根據預設,會選取第一個資料流程,並取消選取其餘資料流程。 應用程式可以呼叫 IMFPresentationDescriptor::SelectStreamIMFPresentationDescriptor::D eselectStream來變更串流選取範圍。 每個資料流程描述項都包含下列屬性。

屬性 描述
MF_SD_LANGUAGE 語言標記,如 屬性所 lang 指定。
MF_SD_SAMI_LANGUAGE 語言名稱,如 屬性所指定 Name

 

每個資料流程都有下列媒體類型:

屬性
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 屬性中。

媒體來源和接收

媒體基礎中支援的媒體格式