次の方法で共有


World Standard Teletext の表示

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

注意

この機能は、Windows Vista 以降のオペレーティング システムから削除されました。 Microsoft Windows 2000、Windows XP、および Windows Server 2003 オペレーティング システムで使用できます。

 

World Standard Teletext (WST) は、アナログ テレビ信号の垂直ブランキング間隔 (VBI) でエンコードされます。 テレテキストをプレビューするためのフィルター グラフは、クローズド キャプションの表示に使用されるグラフに似ています。 次の図は、このグラフを示しています。

wst プレビュー グラフ

このグラフでは、WST 表示に次のフィルターを使用します。

  • Tee/Sink-to-Sink コンバーター。 キャプチャ フィルターから VBI 情報を受け入れ、シグナルに存在するデータ サービスごとに個別のストリームに分割します。
  • WST コーデック。 VBI サンプルから Teletext データをデコードします。
  • WST デコーダー。 テレテキスト データを変換し、テキストをビットマップに描画します。 ダウンストリーム フィルター (この場合はオーバーレイ ミキサー) は、ビットマップをビデオにオーバーレイします。

Capture Graph Builder の RenderStream メソッドは WST フィルターを直接サポートしていないため、アプリケーションで追加の作業を行う必要があります。

  1. オーバーレイ ミキサー フィルターをフィルター グラフに追加します。 次のコードでは、「 CLSID によるフィルターの追加」で説明されている AddFilterByCLSID 関数を使用します。 (AddFilterByCLSID は DirectShow API ではありません)。

    IBaseFilter *pOvMix = NULL;  // Pointer to the Overlay Mixer filter.
    hr = AddFilterByCLSID(pGraph, CLSID_OverlayMixer, L"OVMix", &pOvMix);
    if (FAILED(hr)) 
    {
        // Handle the error ...
    }
    
  2. オーバーレイ ミキサーを使用して、プレビュー ピンをビデオ レンダラー フィルターに接続します。 RenderStream メソッドは、次のように使用できます。

    hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
        pCap, pOvMix, 0);
    
  3. Tee/Sink-to-Sink Converter フィルターをフィルター グラフに追加します。 次のコードでは、「 Kernel-Mode フィルターの作成」で説明されている CreateKernelFilter 関数を使用します。 (CreateKernelFilter は DirectShow API ではありません)。

    IBaseFilter* pKernelTee = NULL;
    hr = CreateKernelFilter(AM_KSCATEGORY_SPLITTER, 
        OLESTR("Tee/Sink-to-Sink Converter"), &pKernelTee);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pKernelTee, L"Kernel Tee");
    }
    
  4. WST コーデック フィルターをフィルター グラフに追加します。

    IBaseFilter* pWstCodec = NULL;
    hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, 
        OLESTR("WST Codec"), &pWstCodec);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pWstCodec, L"WST Codec");
    }
    
  5. RenderStream を呼び出して、キャプチャ フィルターの VBI ピンを Tee/Sink-to-Sink コンバーターに接続し、Tee/Sink-to-Sink Converter を WST コーデック フィルターに接続します。

    hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 
        pKernelTee, pWstCodec);
    
  6. 再び RenderStream を呼び出して、WST コーデック フィルターをオーバーレイ ミキサーに接続します。 WST デコーダー フィルターが自動的にグラフに取り込まれる。

    hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
    
  7. すべてのフィルター インターフェイスを解放することを忘れないでください。

    pOvMix->Release();
    pKernelTee->Release();
    pWstCodec->Release();
    

注意

現在、WST デコーダー フィルターでは、ビデオ 混合レンダラー (VMR) フィルターへの接続はサポートされていません。 したがって、テレテキストを表示するには、従来のビデオ レンダラー フィルターを使用する必要があります。

 

キャプチャ フィルターにビデオ ポート VBI ピン (PIN_CATEGPORY_VIDEOPORT_VBI) がある場合は、 VBI Surface Allocator フィルターに接続します。 それ以外の場合、グラフは正しく実行されません。 次のコード例では、「 CLSID によるフィルターの追加」で説明されている AddFilterByCLSID 関数と、「 ピン カテゴリの操作」で説明されている FindPinByCategory 関数を使用します。 (どちらの関数も DirectShow API でもありません。

// Look for a video port VBI pin on the capture filter.
IPin *pVPVBI = NULL;
hr = FindPinByCategory(pCap, PINDIR_OUTPUT, 
    PIN_CATEGORY_VIDEOPORT_VBI, &pVPVBI);
if (FAILED(hr))
{
    // No video port VBI pin; nothing else to do. OK to run the graph.
}
else
{
    // Found one. Connect it to the VBI Surface Allocator.
    IBaseFilter *pSurf = NULL;
    hr = AddFilterByCLSID(pGraph, CLSID_VBISurfaces, L"VBI Surf", &pSurf);
    if (SUCCEEDED(hr))
    {
        hr = pBuild->RenderStream(NULL, NULL, pVPVBI, 0, pSurf);
        pSurf->Release();
    }
    if (FAILED(hr))
    {
        // Handle the error (not shown). It is probably not safe to 
        // run the graph at this point.
    }
    pVPVBI->Release();
}

クローズド キャプションとテレテキスト