Compartir a través de


Filtro del analizador SAMI (CC)

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Analiza los datos de subtítulos de los archivos de intercambio de medios accesibles sincronizados (SAMI).

SAMI es un formato de texto similar a HTML y se usa para codificar subtítulos basados en tiempo. Este filtro convierte los datos SAMI en un flujo de texto. Cada ejemplo de la secuencia contiene una entrada de subtítulo, junto con información de formato. Las marcas de tiempo de las muestras se generan a partir de la información de tiempo en el archivo SAMI.

Este filtro está diseñado para usarse con el filtro Del representador de comandos de script interno . El representador de comandos de script interno recibe los ejemplos de texto y los envía a la aplicación, en forma de notificaciones de eventos. Para obtener más información, vea la sección Comentarios.

Etiqueta Value
Interfaces de filtro IAMStreamSelect, IBaseFilter
Tipos de medios de patillas de entrada MEDIATYPE_Stream
Interfaces de patillas de entrada IPin, IQualityControl
Tipos de medios de anclaje de salida MEDIATYPE_Text, MEDIASUBTYPE_NULL
Interfaces de pin de salida IMediaSeeking, IPin, IQualityControl
Filtrar CLSID {33FACFE0-A9BE-11D0-A520-00A0D10129C0}
CLSID de página de propiedades No hay página de propiedades
Ejecutable quartz.dll
Mérito MERIT_UNLIKELY
Categoría de filtro CLSID_LegacyAmFilterCategory

 

Observaciones

A continuación se muestra un archivo SAMI simple:

<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>

La etiqueta STYLE define dos configuraciones de idioma, inglés (. ENCC) y francés (. FRCC). También define dos estilos, #NORMAL y #GREENTEXT. Cada etiqueta SYNC define la hora de inicio de un subtítulo, en milisegundos. Las etiquetas P contienen el texto subtítulo, mientras que el atributo CLASS especifica la configuración de idioma a la que se aplica el subtítulo.

Para cada idioma y estilo, el filtro crea una secuencia lógica. En cualquier momento, se habilita exactamente una secuencia de idioma y una secuencia de estilo. Cuando el filtro genera un ejemplo, selecciona el subtítulo para el idioma actual y aplica el estilo actual. De forma predeterminada, el primer idioma y estilo declarados en el archivo están habilitados. Una aplicación puede usar el método IAMStreamSelect::Enable para habilitar una secuencia diferente.

Con la configuración predeterminada, el primer subtítulo del archivo de ejemplo genera la siguiente salida:

<P STYLE=" Name: English; lang:en-US; SAMI_TYPE: CC; Name: Normal; font-family: arial;">One

Si la salida va al representador de comandos de script interno, ese filtro envía una notificación de evento EC_OLE_EVENT . El segundo parámetro de evento es un BSTR con el texto subtítulo. La aplicación puede recuperar el evento y mostrar el subtítulo.

En el ejemplo siguiente se muestra cómo representar un archivo SAMI, recuperar información de flujo, habilitar secuencias y mostrar subtítulo texto. En el ejemplo se supone que el archivo SAMI anterior se guarda como C:\Sami_test_file.sami.

Por motivos de brevedad, en este ejemplo se usan índices de flujo codificados de forma rígida cuando llama al método IAMStreamSelect::Enable . También realiza una comprobación de errores mínima.

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();
}

Este filtro usa la interfaz IAsyncReader para extraer ejemplos del filtro de origen. Por lo tanto, no admite la interfaz IMemInputPin en su pin de entrada.

Filtros directShow