Condividi tramite


Filtro parser SAMI (CC)

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di 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 (Synchronized Accessible Media Interchange).

SAMI è un formato di testo simile a HTML e viene usato per codificare 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 dei comandi di script interno . Il renderer dei comandi di 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 di aggiunta di input MEDIATYPE_Stream
Interfacce pin di input IPin, IQualityControl
Tipi di supporti di pin di output MEDIATYPE_Text, MEDIASUBTYPE_NULL
Interfacce pin di output IMediaSeeking, IPin, IQualityControl
Filtro CLSID {33FACFE0-A9BE-11D0-A520-00A0D10129C0}
CLSID della pagina delle proprietà Nessuna pagina delle proprietà
File eseguibile quartz.dll
Merito MERIT_UNLIKELY
Categoria filtro CLSID_LegacyAmFilterCategory

 

Commenti

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 un didascalia, in millisecondi. I tag P contengono il testo didascalia, mentre l'attributo CLASS specifica l'impostazione della lingua a cui si applica il didascalia.

Per ogni linguaggio e stile, il filtro crea un flusso logico. In qualsiasi momento, è abilitato esattamente un flusso di linguaggio e un flusso di stile. Quando il filtro genera un esempio, seleziona il 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, il primo 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 al renderer del comando script interno, tale filtro invia una notifica di evento EC_OLE_EVENT . Il secondo parametro dell'evento è un valore BSTR con il testo didascalia. L'applicazione può recuperare l'evento e visualizzare il didascalia.

L'esempio seguente illustra come eseguire il rendering di un file SAMI, recuperare informazioni sul flusso, abilitare i flussi e visualizzare didascalia testo. 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'interfaccia IAsyncReader per estrarre campioni dal filtro di origine. Pertanto, non supporta l'interfaccia IMemInputPin sul pin di input.

Filtri DirectShow