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 屬性中。
相關主題