Filtr analyzátoru SAMI (CC)
[Funkce přidružená k této stránce DirectShow je starší funkce. Byla nahrazena MediaPlayer, MMFMediaEnginea Audio/Video Capture v Media Foundation. Tyto funkce jsou optimalizované pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal MediaPlayer, MMFMediaEngine a Audio/Video Capture v Media Foundation místo DirectShow, pokud je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]
Analyzuje data titulků ze synchronizovaných souborů SAMI (Accessible Media Interchange).
SAMI je textový formát podobný html a používá se pro kódování časových titulků. Tento filtr převede data SAMI na textový datový proud. Každá ukázka ve streamu obsahuje jednu položku titulků spolu s informacemi o formátu. Časová razítka ukázek se generují z informací o čase v souboru SAMI.
Tento filtr je navržený tak, aby se používal s filtrem Interní skriptový renderer. Renderer příkazu interního skriptu obdrží textové ukázky a odešle je do aplikace ve formě oznámení událostí. Další informace najdete v části Poznámky.
Označit | Hodnota |
---|---|
Rozhraní filtru | IAMStreamSelect, IBaseFilter |
Typy médií připnutí vstupu | MEDIATYPE_Stream |
Rozhraní vstupního pinu | IPin, IQualityControl |
Typy médií připnutí výstupu | MEDIATYPE_Text, MEDIASUBTYPE_NULL |
Rozhraní výstupního připínáčku | IMediaSeeking, IPin, IQualityControl |
Filtr CLSID | {33FACFE0-A9BE-11D0-A520-00A0D10129C0} |
CLSID stránky vlastností | Žádná stránka vlastností |
Spustitelný | quartz.dll |
Merit | MERIT_UNLIKELY |
kategorie filtru | CLSID_LegacyAmFilterCategory |
Poznámky
Následuje jednoduchý soubor 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>
Značka STYLE definuje dvě nastavení jazyka– angličtina (. ENCC) a francouzština (. FRCC). Definuje také dva styly, #NORMAL a #GREENTEXT. Každá značka SYNC definuje počáteční čas titulku v milisekundách. Značky P obsahují text titulku, zatímco atribut CLASS určuje nastavení jazyka, na který se titulek vztahuje.
Pro každý jazyk a styl vytvoří filtr logický datový proud. Kdykoli je povolený právě jeden datový proud jazyka a jeden datový proud stylu. Když filtr vygeneruje ukázku, vybere titulek pro aktuální jazyk a použije aktuální styl. Ve výchozím nastavení je povolen první jazyk a styl deklarovaný v souboru. Aplikace může pomocí metody IAMStreamSelect::Enable povolit jiný datový proud.
Při výchozím nastavení vytvoří první titulek v ukázkovém souboru následující výstup:
<P STYLE=" Name: English; lang:en-US; SAMI_TYPE: CC; Name: Normal; font-family: arial;">One
Pokud výstup přejde do rendereru příkazu interního skriptu, odešle tento filtr oznámení EC_OLE_EVENT událostí. Druhý parametr události je BSTR s textem titulku. Aplikace může načíst událost a zobrazit titulek.
Následující příklad ukazuje, jak vykreslit soubor SAMI, načíst informace o streamu, povolit streamy a zobrazovat text titulků. Příklad předpokládá, že předchozí soubor SAMI je uložen jako C:\Sami_test_file.sami.
Pro stručnost se v tomto příkladu použily pevně zakódované indexy datových proudů při volání metody IAMStreamSelect::Enable. Provádí také minimální kontrolu chyb.
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();
}
Tento filtr používá rozhraní IAsyncReader k načtení ukázek ze zdrojového filtru. Proto nepodporuje rozhraní IMemInputPin na vstupním pin kódu.
Související témata