Фильтр синтаксического анализа SAMI (CC)
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Анализирует данные подписей из синхронизированных файлов обмена мультимедиа (SAMI).
SAMI — это текстовый формат, аналогичный HTML, и используется для кодирования подписей на основе времени. Этот фильтр преобразует данные SAMI в текстовый поток. Каждый пример в потоке содержит одну запись заголовка, а также сведения о формате. Метки времени для примеров создаются из сведений о времени в файле SAMI.
Этот фильтр предназначен для использования с фильтром внутреннего отрисовщика команд скрипта. Командный отрисовщик внутренних скриптов получает текстовые примеры и отправляет их в приложение в виде уведомлений о событиях. Дополнительные сведения см. в разделе "Примечания".
Ярлык | Ценность |
---|---|
Интерфейсы фильтров | 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 на входном закреплении.
Связанные разделы