SAMI 媒体源
同步的可访问媒体交换 (SAMI) 是一种用于向数字媒体添加字幕的格式。 标题存储在文件扩展名为 .smi 或 .sami 的单独文本文件中。
在 Media Foundation 中,通过 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 来更改流选择。 每个流描述符包含以下属性。
Attribute | 说明 |
---|---|
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服务标识符。
以下示例设置由 index 指定的当前 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属性中的 演示文稿描述符上。
相关主题