Поделиться через


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

фильтры DirectShow