SAMI (CC)-Parserfilter
[Das dieser Seite zugeordnete Feature DirectShow-ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngineund Audio/Video Capture in Media Foundationersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-, IMFMediaEngine und Audio-/Videoaufnahme in Media Foundation anstelle von DirectShow-verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben werden.]
Analysiert Beschriftungsdaten aus Synchronized Accessible Media Interchange (SAMI)-Dateien.
SAMI ist ein Textformat ähnlich wie HTML und wird für die Codierung zeitbasierter Beschriftungen verwendet. Dieser Filter konvertiert SAMI-Daten in einen Textstream. Jedes Beispiel im Datenstrom enthält einen Beschriftungseintrag sowie Formatinformationen. Die Zeitstempel für die Beispiele werden aus den Zeitinformationen in der SAMI-Datei generiert.
Dieser Filter ist für die Verwendung mit dem Internen Skriptbefehls-Renderer Filter konzipiert. Der interne Skriptbefehls-Renderer empfängt die Textbeispiele und sendet sie in Form von Ereignisbenachrichtigungen an die Anwendung. Weitere Informationen finden Sie im Abschnitt "Hinweise".
Etikett | Wert |
---|---|
Filterschnittstellen | IAMStreamSelect, IBaseFilter |
Eingabe-Pin-Medientypen | MEDIATYPE_Stream |
Eingabe-Pin-Schnittstellen | IPin, IQualityControl |
Ausgabe-Pin-Medientypen | MEDIATYPE_Text, MEDIASUBTYPE_NULL |
Ausgabeheftschnittstellen | IMediaSeeking, IPin, IQualityControl |
Filter CLSID | {33FACFE0-A9BE-11D0-A520-00A0D10129C0} |
Eigenschaftenseite CLSID | Keine Eigenschaftenseite |
Ausführbar | quartz.dll |
Merit | 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 Formatvorlagen definiert, #NORMAL und #GREENTEXT. Jedes SYNC Tag definiert die Startzeit für eine Beschriftung in Millisekunden. Die P--Tags enthalten den Beschriftungstext, während das attribut CLASS die Spracheinstellung angibt, auf die die Beschriftung angewendet wird.
Für jede Sprache und jeden Stil erstellt der Filter einen logischen Datenstrom. Jederzeit sind genau ein Sprachdatenstrom und ein Stilstream aktiviert. Wenn der Filter ein Beispiel generiert, wählt er die Beschriftung für die aktuelle Sprache aus und wendet die aktuelle Formatvorlage an. Standardmäßig ist die erste in der Datei deklarierte Sprache und Formatvorlage aktiviert. Eine Anwendung kann die IAMStreamSelect::Enable-Methode verwenden, um einen anderen Datenstrom zu aktivieren.
Mit den Standardeinstellungen erzeugt die erste Beschriftung 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 wechselt, sendet dieser Filter eine EC_OLE_EVENT Ereignisbenachrichtigung. Der zweite Ereignisparameter ist ein BSTR mit dem Beschriftungstext. Die Anwendung kann das Ereignis abrufen und die Beschriftung anzeigen.
Das folgende Beispiel zeigt, wie Sie eine SAMI-Datei rendern, Datenstrominformationen abrufen, Datenströme aktivieren und Beschriftungstext anzeigen. Im Beispiel wird davon ausgegangen, dass die vorherige SAMI-Datei als C:\Sami_test_file.sami gespeichert wird.
Aus Platzgründen wurde in diesem Beispiel hartcodierte Datenstromindizes 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 abzurufen. Daher wird die IMemInputPin- Schnittstelle auf der Eingabenadel nicht unterstützt.
Verwandte Themen