Share via


SAMI (CC) パーサー フィルター

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

同期されたアクセシビリティ対応メディア交換 (SAMI) ファイルのキャプション データを解析します。

SAMI は HTML に似たテキスト形式であり、時間ベースのキャプションをエンコードするために使用されます。 このフィルターは、SAMI データをテキスト ストリームに変換します。 ストリーム内の各サンプルには、1 つのキャプションエントリと書式情報が含まれています。 サンプルのタイム スタンプは、SAMI ファイル内の時刻情報から生成されます。

このフィルターは、 内部スクリプト コマンド レンダラー フィルターで使用するように設計されています。 内部スクリプト コマンド レンダラーは、テキスト サンプルを受け取り、イベント通知の形式でアプリケーションに送信します。 詳細については、「解説」を参照してください。

Label
フィルター インターフェイス 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 タグは、英語 () という 2 つの言語設定を定義します。ENCC) とフランス語 (.FRCC)。 また、#NORMALと#GREENTEXTの 2 つのスタイルも定義します。 各 SYNC タグは、キャプションの開始時刻をミリ秒単位で定義します。 P タグにはキャプションテキストが含まれますが、CLASS 属性は、キャプションが適用される言語設定を指定します。

言語とスタイルごとに、フィルターによって論理ストリームが作成されます。 いつでも、1 つの言語ストリームと 1 つのスタイル ストリームが有効になります。 フィルターは、サンプルを生成するときに、現在の言語のキャプションを選択し、現在のスタイルを適用します。 既定では、ファイルで宣言されている最初の言語とスタイルが有効になります。 アプリケーションでは、 IAMStreamSelect::Enable メソッドを使用して別のストリームを有効にすることができます。

既定の設定では、サンプル ファイルの最初のキャプションによって次の出力が生成されます。

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

出力が内部スクリプト コマンド レンダラーに送信された場合、そのフィルターは EC_OLE_EVENT イベント通知を送信します。 2 番目のイベント パラメーターは、キャプションテキストを含む 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 フィルター