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::SelectStream 和 IMFPresentationDescriptor::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 媒體來源上呼叫下列方法:
- IMFSAMIStyle::GetStyleCount 會取得樣式的數目。
- IMFSAMIStyle::GetStyles 會取得儲存在 PROPVARIANT中的樣式名稱清單。
- IMFSAMIStyle::SetSelectedStyle 會依名稱設定樣式。
樣式名稱的清單也會儲存在簡報描述元的 MF_PD_SAMI_STYLELIST 屬性中。
相關主題