Freigeben über


SAMI -Parserfilter (CC)

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Analysiert Beschriftungsdaten aus SAMI-Dateien (Synchronized Accessible Media Interchange).

SAMI ist ein Textformat ähnlich html und wird zum Codieren zeitbasierter Beschriftungen verwendet. Dieser Filter konvertiert SAMI-Daten in einen Textstream. Jedes Beispiel im Stream enthält einen Untertitel Eintrag sowie Formatinformationen. Die Zeitstempel in den Beispielen werden aus den Zeitinformationen in der SAMI-Datei generiert.

Dieser Filter ist für die Verwendung mit dem Internen Skriptbefehlsrenderer-Filter konzipiert. Der Interne Skriptbefehlsrenderer empfängt die Textbeispiele und sendet sie in Form von Ereignisbenachrichtigungen an die Anwendung. Weitere Informationen finden Sie im Abschnitt mit Hinweisen.

Bezeichnung Wert
Filterschnittstellen IAMStreamSelect, IBaseFilter
Eingabe-Pinmedientypen MEDIATYPE_Stream
Eingabenadelschnittstellen IPin, IQualityControl
Ausgabeheftmedientypen MEDIATYPE_Text, MEDIASUBTYPE_NULL
Ausgabe-Pinschnittstellen IMediaSeeking, IPin, IQualityControl
Filtern von CLSID {33FACFE0-A9BE-11D0-A520-00A0D10129C0}
Eigenschaftenseite CLSID Keine Eigenschaftenseite
Ausführbare Datei quartz.dll
Verdienst MERIT_UNLIKELY
Filterkategorie CLSID_LegacyAmFilterCategory

 

Bemerkungen

Es folgt eine einfache SAMI-Datei:

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

Das STYLE-Tag definiert zwei Spracheinstellungen: Englisch (. ENCC) und Französisch (. FRCC). Außerdem werden zwei Stile definiert: #NORMAL und #GREENTEXT. Jedes SYNC-Tag definiert die Startzeit für eine Untertitel in Millisekunden. Die P-Tags enthalten den Untertitel Text, während das CLASS-Attribut die Spracheinstellung angibt, für die die Untertitel gilt.

Für jede Sprache und jede Formatvorlage erstellt der Filter einen logischen Stream. Zu jedem Zeitpunkt sind genau ein Sprachstream und ein Stilstream aktiviert. Wenn der Filter ein Beispiel generiert, wählt er die Untertitel für die aktuelle Sprache aus und wendet die aktuelle Formatvorlage an. Standardmäßig sind die in der Datei deklarierte erste Sprache und der erste Stil aktiviert. Eine Anwendung kann die IAMStreamSelect::Enable-Methode verwenden, um einen anderen Stream zu aktivieren.

Mit den Standardeinstellungen erzeugt der erste Untertitel in der Beispieldatei die folgende Ausgabe:

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

Wenn die Ausgabe an den Internen Skriptbefehlsrenderer geht, sendet dieser Filter eine EC_OLE_EVENT Ereignisbenachrichtigung. Der zweite Ereignisparameter ist ein BSTR mit dem Untertitel Text. Die Anwendung kann das Ereignis abrufen und die Untertitel anzeigen.

Das folgende Beispiel zeigt, wie Sie eine SAMI-Datei rendern, Streaminformationen abrufen, Streams aktivieren und Untertitel Text anzeigen. Im Beispiel wird davon ausgegangen, dass die vorherige SAMI-Datei als C:\Sami_test_file.sami gespeichert ist.

Aus Gründen der Übersichtlichkeit wurden in diesem Beispiel hartcodierte Streamindizes verwendet, wenn die IAMStreamSelect::Enable-Methode aufgerufen wird. Außerdem wird eine minimale Fehlerüberprüfung durchgeführt.

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

Dieser Filter verwendet die IAsyncReader-Schnittstelle , um Beispiele aus dem Quellfilter zu pullen. Daher wird die IMemInputPin-Schnittstelle an ihrem Eingabepin nicht unterstützt.

DirectShow-Filter