Filtro parser SAMI (CC)
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEnginee Acquisizione audio/video in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di usare un nuovo codice MediaPlayer, IMFMediaEngine e Acquisizione audio/video in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Analizza i dati di didascalia dai file SAMI (Accessible Media Interchange) sincronizzati.
SAMI è un formato di testo simile al codice HTML e viene usato per codificare le didascalie basate sul tempo. Questo filtro converte i dati SAMI in un flusso di testo. Ogni esempio nel flusso contiene una voce didascalia, insieme alle informazioni sul formato. I timestamp negli esempi vengono generati dalle informazioni sull'ora nel file SAMI.
Questo filtro è progettato per essere usato con il filtro renderer interno dei comandi script. Il renderer del comando script interno riceve gli esempi di testo e li invia all'applicazione, sotto forma di notifiche degli eventi. Per altre informazioni, vedere la sezione Osservazioni.
Etichetta | Valore |
---|---|
Interfacce di filtro | IAMStreamSelect, IBaseFilter |
Tipi di supporti pin di input | MEDIATYPE_Stream |
Interfacce del pin di input | IPin, IQualityControl |
Tipi di supporti pin di output | MEDIATYPE_Text, MEDIASUBTYPE_NULL |
Interfacce pin di output | IMediaSeeking, IPin, IQualityControl |
Filtrare CLSID | {33FACFE0-A9BE-11D0-A520-00A0D10129C0} |
CLSID della pagina delle proprietà | Nessuna pagina delle proprietà |
Eseguibile | quartz.dll |
Merit | MERIT_UNLIKELY |
categoria filtro | CLSID_LegacyAmFilterCategory |
Osservazioni
Di seguito è riportato un semplice file 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>
Il tag STYLE definisce due impostazioni della lingua, inglese (. ENCC) e francese (. FRCC). Definisce anche due stili, #NORMAL e #GREENTEXT. Ogni tag SYNC definisce l'ora di inizio per una didascalia, espressa in millisecondi. I tag P contengono il testo della didascalia, mentre l'attributo CLASSE specifica l'impostazione della lingua a cui si applica la didascalia.
Per ogni lingua e stile, il filtro crea un flusso logico. In qualsiasi momento, sono abilitati esattamente un flusso linguistico e un flusso di stile. Quando il filtro genera un esempio, seleziona la didascalia per la lingua corrente e applica lo stile corrente. Per impostazione predefinita, la prima lingua e lo stile dichiarati nel file sono abilitati. Un'applicazione può usare il metodo IAMStreamSelect::Enable per abilitare un flusso diverso.
Con le impostazioni predefinite, la prima didascalia nel file di esempio genera l'output seguente:
<P STYLE=" Name: English; lang:en-US; SAMI_TYPE: CC; Name: Normal; font-family: arial;">One
Se l'output passa a Internal Script Command Renderer, tale filtro invia una notifica di evento EC_OLE_EVENT. Il secondo parametro di evento è un BSTR con il testo della didascalia. L'applicazione può recuperare l'evento e visualizzare la didascalia.
L'esempio seguente illustra come eseguire il rendering di un file SAMI, recuperare informazioni sul flusso, abilitare i flussi e visualizzare il testo della didascalia. L'esempio presuppone che il file SAMI precedente venga salvato come C:\Sami_test_file.sami.
Per brevità, questo esempio usa indici di flusso hardcoded quando chiama il metodo IAMStreamSelect::Enable. Esegue anche un controllo degli errori minimo.
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();
}
Questo filtro usa l'interfacciaIAsyncReaderper eseguire il pull dei campioni dal filtro di origine. Pertanto, non supporta l'interfacciaIMemInputPin sul relativo pin di input.
Argomenti correlati