Compartilhar via


Filtro analisador SAMI (CC)

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Analisa os dados de legendagem de arquivos SAMI (Synchronized Accessible Media Interchange).

SAMI é um formato de texto semelhante ao HTML e é usado para codificar legendas baseadas em tempo. Esse filtro converte dados SAMI em um fluxo de texto. Cada exemplo no fluxo contém uma entrada legenda, juntamente com informações de formato. Os carimbos de data/hora nos exemplos são gerados com base nas informações de hora no arquivo SAMI.

Esse filtro foi projetado para ser usado com o filtro do Renderizador de Comando de Script Interno . O Renderizador de Comando de Script Interno recebe os exemplos de texto e os envia para o aplicativo, na forma de notificações de evento. Para obter mais informações, consulte a seção Comentários.

Rótulo Valor
Interfaces de filtro IAMStreamSelect, IBaseFilter
Tipos de mídia de pino de entrada MEDIATYPE_Stream
Interfaces de pino de entrada IPin, IQualityControl
Tipos de mídia de pino de saída MEDIATYPE_Text, MEDIASUBTYPE_NULL
Interfaces de pino de saída IMediaSeeking, IPin, IQualityControl
Filtrar CLSID {33FACFE0-A9BE-11D0-A520-00A0D10129C0}
CLSID da página de propriedades Nenhuma página de propriedades
Executável quartz.dll
Mérito MERIT_UNLIKELY
Categoria de Filtro CLSID_LegacyAmFilterCategory

 

Comentários

Veja a seguir um arquivo SAMI simples:

<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>

A marca STYLE define duas configurações de idioma, inglês (. ENCC) e francês (. FRCC). Ele também define dois estilos, #NORMAL e #GREENTEXT. Cada marca SYNC define a hora de início de um legenda, em milissegundos. As marcas P contêm o texto legenda, enquanto o atributo CLASS especifica a configuração de idioma à qual o legenda se aplica.

Para cada idioma e estilo, o filtro cria um fluxo lógico. A qualquer momento, exatamente um fluxo de idioma e um fluxo de estilo estão habilitados. Quando o filtro gera um exemplo, ele seleciona o legenda para o idioma atual e aplica o estilo atual. Por padrão, o primeiro idioma e o estilo declarados no arquivo estão habilitados. Um aplicativo pode usar o método IAMStreamSelect::Enable para habilitar um fluxo diferente.

Com as configurações padrão, o primeiro legenda no arquivo de exemplo produz a seguinte saída:

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

Se a saída for para o Renderizador de Comando de Script Interno, esse filtro enviará uma notificação de evento EC_OLE_EVENT . O segundo parâmetro de evento é um BSTR com o texto legenda. O aplicativo pode recuperar o evento e exibir o legenda.

O exemplo a seguir mostra como renderizar um arquivo SAMI, recuperar informações de fluxo, habilitar fluxos e exibir legenda texto. O exemplo pressupõe que o arquivo SAMI anterior seja salvo como C:\Sami_test_file.sami.

Para fins de brevidade, este exemplo usou índices de fluxo embutidos em código ao chamar o método IAMStreamSelect::Enable . Ele também executa a verificação mínima de erros.

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();
}

Esse filtro usa a interface IAsyncReader para efetuar pull de amostras do filtro de origem. Portanto, ele não dá suporte à interface IMemInputPin em seu pin de entrada.

Filtros do DirectShow