Фильтр средства синтаксического анализа 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 на входном контакте.
Связанные темы