SAMI (CC) 分析器筛选器
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
分析来自已同步辅助媒体交换 (SAMI) 文件中的字幕数据。
SAMI 是一种类似于 HTML 的文本格式,用于对基于时间的字幕进行编码。 此筛选器将 SAMI 数据转换为文本流。 流中的每个示例都包含一个描述文字条目以及格式信息。 样本上的时间戳是从 SAMI 文件中的时间信息生成的。
此筛选器旨在与 内部脚本命令呈现器 筛选器一起使用。 内部脚本命令呈现器接收文本示例,并将其以事件通知的形式发送到应用程序。 有关详细信息,请参见“备注”部分。
Label | 值 |
---|---|
筛选器接口 | IAMStreamSelect、 IBaseFilter |
输入引脚媒体类型 | MEDIATYPE_Stream |
输入引脚接口 | IPin、 IQualityControl |
输出引脚媒体类型 | MEDIATYPE_Text、MEDIASUBTYPE_NULL |
输出引脚接口 | IMediaSeeking、 IPin、 IQualityControl |
筛选器 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 接口。
相关主题