Condividi tramite


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.

DirectShow Filtri