クローズド キャプションの表示

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

アナログ テレビでクローズド キャプションをサポートするために、キャプチャ フィルターは、VBI または閉じたキャプション データを配信するピンを公開します。 ピンには、次のいずれかのピン カテゴリがあります。

  • VBI ピン (PIN_CATEGORY_VBI)。 VBI 波形サンプルのストリームを提供します。 これらは、クローズド キャプション データを抽出するデコーダー フィルターに渡されます。
  • CC ピン (PIN_CATEGORY_CC)。 21 行目のデータから抽出された、閉じたキャプションバイト ペアを提供します。
  • ハードウェア スライス CC ピン (PINNAME_VIDEO_CC_CAPTURE)。

クローズド キャプションをプレビューするには、VBI ピン カテゴリで ICaptureGraphBuilder2::RenderStream を呼び出し、失敗した場合は CC カテゴリで再度呼び出します。

hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 0, 0);
if (FAILED(hr))
{
    hr = pBuild->RenderStream(&PIN_CATEGORY_CC, 0, pCap, 0, 0);
}

次の図は、クローズド キャプションを表示するための一般的なフィルター グラフを示しています。

クローズド キャプション プレビュー グラフ

このグラフでは、閉じたキャプション表示に次のフィルターが使用されます。

  • Tee/Sink-to-Sink コンバーター。 キャプチャ フィルターから VBI 情報を受け入れ、シグナル上に存在するデータ サービスごとに個別のストリームに分割します。 Microsoft では、クローズド キャプション、NABTS、World Standard Teletext (WST) 用の VBI コーデックを提供しています。
  • CC デコーダー。 キャプチャ フィルタによって提供されるサンプリングされた VBI 波形から CC データをデコードします。
  • 21 行目デコーダー。 CC バイト ペアを変換し、キャプションテキストをビットマップに描画します。 ダウンストリーム フィルター (この場合はオーバーレイ ミキサー) は、ビットマップをビデオにオーバーレイします。

Capture Graph Builder の RenderStream メソッドは、これらのフィルターを自動的に追加します。 キャプチャ フィルターに VBI ピンではなく CC ピンがある場合、CC ピンは Line 21 デコーダー フィルターに直接接続されます。

注意

レンダリングにビデオ ミキシング レンダラー (VMR) フィルターを使用している場合は、Line 21 デコーダー フィルター 2 を使用します。 このフィルターは、Line 21 デコーダーと同じ機能を備えていますが、CLSID はCLSID_Line21Decoder2。

 

注意

WINDOWS Vista で CC デコーダー フィルターが削除されました。 新しいアプリケーションでは、Microsoft TV Technologies のドキュメントに記載されている VBICodec フィルターを使用する必要があります。

 

キャプチャ デバイスでビデオ ポートが使用されている場合、キャプチャ フィルターにビデオ ポート VBI ピン (PIN_CATEGORY_VIDEOPORT_VBI) が設定されている可能性があります。 このピンは、キャプチャされた VBI データを保持するためにサーフェスを割り当てる VBI Surface Allocator フィルターに接続する必要があります。 RenderStream メソッドは、必要に応じてこのフィルターを追加します。 次の図は、VBI Surface Allocator を含むフィルター グラフを示しています。

vbi surface allocator を使用したクローズド キャプション プレビュー グラフ

キャプションの有効化と無効化

キャプション表示を制御するには、Line 21 デコーダー フィルターの IAMLine21Decoder インターフェイスを使用します。 たとえば、次のように IAMLine21Decoder::SetServiceState メソッドを使用してキャプション表示をオフにすることができます。

// Use the FindInterface method to find the interface.
IAMLine21Decoder *pLine21 = NULL;
hr = pBuild->FindInterface(
    &LOOK_DOWNSTREAM_ONLY, // Look downstream from pCap 
    NULL,                  // No particular media type
    pCap,                  // Pointer to the capture filter.
    IID_IAMLine21Decoder, (void**)&pLine21);
if (SUCCEEDED(hr))
{
    pLine21->SetServiceState(AM_L21_CCSTATE_Off);
    // (Use AM_L21_CCSTATE_On to enable.)
    pLine21->Release();
}

この例では、 ICaptureGraphBuilder2::FindInterface メソッドを使用して IAMLine21Decoder インターフェイスを見つけます。 FindInterface の最初のパラメーターは&LOOK_DOWNSTREAM_ONLYで、キャプチャ フィルター (pCap) からダウンストリームで検索することを指定します。

クローズド キャプション ビットマップのキャプチャ

キャプションビットマップをファイルにキャプチャできます。 そのためには、「ビデオをファイルにキャプチャする」の説明に従って、フィルター グラフの ファイル作成セクションを追加します。 次に、CC または VBI ピンを mux フィルターにレンダリングします。

hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 0, pMux);
if (FAILED(hr))
{
    hr = pBuild->RenderStream(&PIN_CATEGORY_CC, 0, pCap, 0, pMux);
}

ビデオもキャプチャしている場合は、2 つの個別のビデオ ストリームを含むファイルが作成されます。 画像の上にキャプションがオーバーレイされたビデオはキャプチャされません。

クローズド キャプションと Teletext