SAMI (CC) 剖析器篩選
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
剖析同步存取媒體交換 (SAMI) 檔案的輔助字幕資料。
SAMI 是類似 HTML 的文字格式,用於編碼以時間為基礎的標題。 此篩選會將 SAMI 資料轉換成文字資料流程。 資料流程中的每個範例都包含一個標題專案,以及格式資訊。 範例上的時間戳記是從 SAMI 檔案中的時間資訊產生。
此篩選是設計成與 內部指令碼命令轉譯器 篩選一起使用。 內部指令碼命令轉譯器會接收文字範例,並以事件通知的形式將它們傳送至應用程式。 如需詳細資訊,請參閱<備註>一節。
標籤 | 值 |
---|---|
篩選介面 | IAMStreamSelect、 IBaseFilter |
輸入釘選媒體類型 | MEDIATYPE_Stream |
輸入針腳介面 | IPin、 IQualityControl |
輸出釘選媒體類型 | MEDIATYPE_Text,MEDIASUBTYPE_Null |
輸出針腳介面 | IMediaSeeking、 IPin、 IQualityControl |
篩選 CLSID | {33FACFE0-A9BE-11D0-A520-00A0D10129C0} |
屬性頁 CLSID | 沒有屬性頁 |
可執行檔 | quartz.dll |
優點 | MERIT_UNLIKELY |
篩選類別 | CLSID_LegacyAmFilterCategory |
備註
以下是簡單的 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>
STYLE標籤會定義兩種語言設定:英文 (。ENCC) 和法文 (。FRCC) 。 它也會定義兩種樣式,#NORMAL和#GREENTEXT。 每個SYNC標記都會以毫秒為單位定義標題的開始時間。 P標籤包含標題文字,而CLASS屬性會指定套用標題的語言設定。
針對每個語言和樣式,篩選準則會建立邏輯資料流程。 隨時都只啟用一個語言資料流程和一個樣式資料流程。 當篩選產生範例時,它會選取目前語言的標題,並套用目前的樣式。 根據預設,會啟用檔案中宣告的第一種語言和樣式。 應用程式可以使用 IAMStreamSelect::Enable 方法來啟用不同的資料流程。
使用預設設定時,範例檔案中的第一個標題會產生下列輸出:
<P STYLE=" Name: English; lang:en-US; SAMI_TYPE: CC; Name: Normal; font-family: arial;">One
如果輸出移至內部指令碼命令轉譯器,該篩選會傳送 EC_OLE_EVENT 事件通知。 第二個事件參數是具有標題文字的 BSTR。 應用程式可以擷取事件,並顯示標題。
下列範例示範如何轉譯 SAMI 檔案、擷取資料流程資訊、啟用資料流程,以及顯示標題文字。 此範例假設先前的 SAMI 檔案會儲存為 C:\Sami_test_file.sami。
為了簡潔起見,這個範例會在呼叫 IAMStreamSelect::Enable 方法時使用硬式編碼資料流程索引。 它也會執行最少的錯誤檢查。
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();
}
此篩選會使用 IAsyncReader 介面從來源篩選提取範例。 因此,它不支援其輸入針腳上的 IMemInputPin 介面。
相關主題