SAMI (CC) 分析器筛选器

[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayerIMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]

分析同步可访问媒体交换 (SAMI) 文件中的字幕数据。

SAMI 是类似于 HTML 的文本格式,用于编码基于时间的字幕。 此筛选器将 SAMI 数据转换为文本流。 流中的每个示例都包含一个标题条目以及格式信息。 样本上的时间戳是从 SAMI 文件中的时间信息生成的。

此筛选器旨在与 内部脚本命令呈现器 筛选器一起使用。 内部脚本命令呈现器以事件通知的形式接收文本示例并将其发送到应用程序。 有关详细信息,请参阅“备注”部分。

标签 价值
筛选器接口 IAMStreamSelectIBaseFilter
输入引脚媒体类型 MEDIATYPE_Stream
输入引脚接口 IPinIQualityControl
输出引脚媒体类型 MEDIATYPE_Text,MEDIASUBTYPE_NULL
输出引脚接口 IMediaSeekingIPinIQualityControl
筛选 CLSID {33FACFE0-A9BE-11D0-A520-00A0D10129C0}
属性页 CLSID 无属性页
可执行 quartz.dll
优点 MERIT_UNLIKELY
筛选器类别 CLSID_LegacyAmFilterCategory

 

言论

下面是一个简单的 SAMI 文件:

<SAMI>
<Head>
<STYLE TYPE="text/css"> <!--
    .ENCC {Name: English; lang:en-US; SAMI_TYPE: CC;}
    .FRCC {Name: French; lang:fr-FR; SAMI_TYPE: CC;}
    #NORMAL {Name: Normal; font-family: arial;}
    #GREENTEXT {Name: GreenText; color:green; font-family: verdana;}
-->
</STYLE>
</Head>
<BODY>
<Sync Start=1000>
    <P CLASS="ENCC">One
    <P CLASS="FRCC">Un

<Sync Start=2000>
    <P CLASS="ENCC">Two
    <P CLASS="FRCC">Deux

<Sync Start=3000>
    <P CLASS="ENCC">Three
    <P CLASS="FRCC">Trois
</BODY>
</SAMI>

STYLE 标记定义两种语言设置(英语)。ENCC)和法语(.FRCC)。 它还定义了两种样式,#NORMAL 和 #GREENTEXT。 每个 SYNC 标记定义标题的开始时间(以毫秒为单位)。 P 标记包含标题文本,而 CLASS 属性指定标题应用于的语言设置。

对于每种语言和样式,筛选器都会创建一个逻辑流。 随时只启用一个语言流和一个样式流。 当筛选器生成示例时,它将选择当前语言的标题并应用当前样式。 默认情况下,将启用文件中声明的第一种语言和样式。 应用程序可以使用 IAMStreamSelect::Enable 方法启用其他流。

使用默认设置时,示例文件中的第一个标题将生成以下输出:

<P STYLE=" Name: English; lang:en-US; SAMI_TYPE: CC; Name: Normal; font-family: arial;">One

如果输出转到内部脚本命令呈现器,该筛选器将发送 EC_OLE_EVENT 事件通知。 第二个事件参数是包含标题文本的 BSTR。 应用程序可以检索事件并显示标题。

以下示例演示如何呈现 SAMI 文件、检索流信息、启用流和显示标题文本。 该示例假定以前的 SAMI 文件保存为 C:\Sami_test_file.sami。

为简洁起见,此示例在调用 IAMStreamSelect::Enable 方法时使用了硬编码流索引。 它还执行最少的错误检查。

void __cdecl main()
{
    HRESULT hr;
    IGraphBuilder *pGraph;
    IMediaControl *pMediaControl;
    IMediaEventEx *pEv;
    IBaseFilter   *pSAMI;

    CoInitialize(NULL);
    
    // Create the filter graph manager.
    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, 
                        IID_IGraphBuilder, (void **)&pGraph);
    pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
    pGraph->QueryInterface(IID_IMediaEventEx, (void**)&pEv);

    // Create the graph and find the SAMI parser.
    pGraph->RenderFile(L"C:\\Sami_test_file.sami", NULL);
    hr = pGraph->FindFilterByName(L"SAMI (CC) Parser", &pSAMI);
    if (SUCCEEDED(hr)) 
    {
        IAMStreamSelect *pStrm = NULL;
        hr = pSAMI->QueryInterface(IID_IAMStreamSelect, (void**)&pStrm);
        if (SUCCEEDED(hr)) 
        {
            DWORD dwStreams = 0;
            pStrm->Count(&dwStreams);
            printf("Stream count: %d\n", dwStreams);

            // Select French and "GreenText"
            hr = pStrm->Enable(1, AMSTREAMSELECTENABLE_ENABLE);
            hr = pStrm->Enable(3, AMSTREAMSELECTENABLE_ENABLE);

            // Print the name of each logical stream.
            for (DWORD index = 0; index < dwStreams; index++)
            {
                DWORD dwFlags;
                WCHAR *wszName;
                hr = pStrm->Info(index, NULL, &dwFlags, NULL, NULL,
                    &wszName, NULL, NULL);
                if (hr == S_OK)
                {
                    wprintf(L"Stream %d: %s [%s]\n", index, wszName, 
                        (dwFlags ?  L"ENABLED" : L"DISABLED"));
                    CoTaskMemFree(wszName);
                }
            }
            pStrm->Release();
        }
        pSAMI->Release();
    }

    // Run the graph and display the captions.
    pMediaControl->Run();
    while (1)
    {
        long evCode, lParam1, lParam2;
        pEv->GetEvent(&evCode, &lParam1, &lParam2, 100);
        
        if (evCode == EC_OLE_EVENT) {
            wprintf(L"%s\n", (BSTR)lParam2);
        }
        pEv->FreeEventParams(evCode, lParam1, lParam2);

        if (evCode == EC_USERABORT || evCode == EC_COMPLETE || evCode == EC_ERRORABORT)
            break;
    }

    // Clean up.
    pMediaControl->Release();
    pEv->Release();
    pGraph->Release();
    CoUninitialize();
}

此筛选器使用 IAsyncReader 接口从源筛选器中提取示例。 因此,它不支持其输入引脚上的 IMemInputPin 接口。

DirectShow 筛选器