共用方式為


SAMI (CC) 剖析器篩選

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

剖析來自同步處理可存取媒體交換 (SAMI) 檔案的數據標題。

SAMI 是類似 HTML 的文字格式,用於編碼以時間為基礎的標題。 此篩選會將 SAMI 資料轉換成文字數據流。 數據流中的每個範例都包含一個標題專案,以及格式資訊。 範例上的時間戳是從 SAMI 檔案中的時間信息產生。

此篩選器的設計目的是要與 內部腳本命令轉譯器 篩選搭配使用。 內部腳本命令轉譯器會以事件通知的形式接收文字範例,並將其傳送至應用程式。 如需詳細資訊,請參閱一節。

標籤 價值
篩選介面 IAMStreamSelectIBaseFilter
輸入釘選媒體類型 MEDIATYPE_Stream
輸入釘選介面 IPinIQualityControl
輸出釘選媒體類型 MEDIATYPE_Text,MEDIASUBTYPE_NULL
輸出釘選介面 IMediaSeekingIPinIQualityControl
篩選 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 介面。

DirectShow 篩選