Filtro do analisador SAMI (CC)
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture na 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 no 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 a legenda de dados de arquivos SAMI (Intercâmbio de Mídia Acessível Sincronizado).
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 de legenda, juntamente com informações de formato. Os carimbos de data/hora nos exemplos são gerados com base nas informações de tempo 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.
Etiqueta | Valor |
---|---|
Interfaces de filtro | IAMStreamSelect, IBaseFilter |
Tipos de mídia de pino de entrada | MEDIATYPE_Stream |
Interfaces de pin 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 propriedade |
Executável | quartz.dll |
de Mérito | MERIT_UNLIKELY |
de categoria de filtro de | CLSID_LegacyAmFilterCategory |
Observações
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 uma legenda, em milissegundos. As marcas P contêm o texto da legenda, enquanto o atributo CLASS especifica a configuração de idioma à qual a 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 a legenda do 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, a primeira 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 da legenda. O aplicativo pode recuperar o evento e exibir a legenda.
O exemplo a seguir mostra como renderizar um arquivo SAMI, recuperar informações de fluxo, habilitar fluxos e exibir texto de legenda. 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 codificados quando chama 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 deIAsyncReader para efetuar pull de exemplos do filtro de origem. Portanto, ele não dá suporte à interfaceIMemInputPin em seu pin de entrada.
Tópicos relacionados