SAMI 媒体源

同步的辅助媒体交换(SAMI)是向数字媒体添加字幕的格式。 标题存储在文件扩展名为 .smi 或 .sami 的单独文本文件中。

在媒体基础中,SAMI 字幕文件通过 SAMI 媒体源受支持。 使用 源解析程序 从 URL 或字节流创建 SAMI 媒体源的实例。 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> 元素包含样式信息。 此示例包含 <P> 元素的基样式,以及两个命名样式“standard”和“hilite”。 命名样式用于修改基样式。 标题放置在 <SYNC> 元素中。 起始属性为该标题提供演示文稿时间(以毫秒为单位)。 此示例中的标题采用两种语言提供,由 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 属性中。

媒体源和接收器

媒体基础 中支持 媒体格式