C++ でのクローズド キャプションの表示
このトピックは Windows XP にのみ適用。
クローズド キャプション (CC) を表示するには、アプリケーションはクローズド キャプション フィーチャーをアクティブにする必要がある。アナログ TV の場合、アプリケーションはデータ サービス フィーチャーもアクティブにする必要がある。ビデオ コントロールの使用可能なフィーチャーのコレクションを列挙することによって、フィーチャーを検索できる。フィーチャーをアクティブにするには、フィーチャーをアクティブ フィーチャー コレクションに追加する。
クローズド キャプション フィーチャーをアクティブにするには、以下のステップを実行する。
CoCreateInstance を使って空のフィーチャー コレクションを MSVidFeatures オブジェクトとして作成する。
IMSVidCtl::get_FeaturesAvailable メソッドを呼び出して使用可能なフィーチャーをビデオ コントロールから取得する。
返されたコレクションを順番に処理し、各フィーチャーの CLSID を CC フィーチャーの CLSID と比較する。アナログ TV では、データ サービス フィーチャーに対して同じ処理を実行する。IMSVidDevice::get__ClassID メソッドを呼び出して各フィーチャーの CLSID を取得する。
一致するフィーチャーが見つかった場合は、それをステップ 1 で作成したフィーチャー コレクションに追加する。また、IMSVidClosedCaptioning インターフェイスの CC フィーチャーを問い合わせて、後で使えるように格納する。
IMSVidCtl::put_FeaturesActive メソッドを呼び出して、新しいフィーチャー コレクションをビデオ コントロールのアクティブ フィーチャー コレクションとして設定する。
これらのステップは、グラフを作成する前、つまり IMSVidCtl::Build または IMSVidCtl::Run を呼び出す前に実行すること。グラフが既に作成されている場合は、IMSVidCtl::Decompose を呼び出して破棄し、後で再度作成する。
CC フィーチャーをアクティブ フィーチャー コレクションに追加したら、グラフを作成できる。いつでも IMSVidClosedCaptioning::put_Enable メソッドを呼び出してクローズド キャプションを有効または無効にできる。デフォルトでは、このフィーチャーは無効になっている。
注 CC フィーチャーをアクティブにすると、クローズド キャプションを受け取って表示できるフィルタ グラフがビデオ コントロールによって作成される。CC フィーチャーを有効にすると、キャプションが表示される。
次のコード例では、CC をアクティブにしてから有効にしている。m_pVidControl がコントロール コンテナのメンバ変数で、ビデオ コントロールの IMSVidCtl インターフェイスへのポインタを保持すると想定している。bWantDataSvc パラメータはデータ サービスをインクルードするかどうかを指定する。簡略化のため、この例では最小限のエラー チェックのみを実行している。
HRESULT CMyContainer::ActivateCC(bool bWantDataSvc)
{
HRESULT hr = S_OK;
_ASSERT(m_pVidControl != NULL);
// 使用可能なフィーチャーを取得する。
CComPtr<IMSVidFeatures> pFeatures;
hr = m_pVidControl->get_FeaturesAvailable(&pFeatures);
if (SUCCEEDED(hr))
{
// 空のフィーチャー コレクションを作成する。
CComPtr<IMSVidFeatures> pActiveFeatures;
hr = pActiveFeatures.CoCreateInstance(__uuidof(MSVidFeatures),
NULL, CLSCTX_INPROC_SERVER);
// フィーチャーを列挙し、CC を探す。
long lCount = 0;
pFeatures->get_Count(&lCount);
for (long ix = 0; ix < lCount; ix++)
{
CComVariant var(ix);
CComPtr<IMSVidFeature> pFeature;
GUID clsid;
hr = pFeatures->get_Item(var, &pFeature);
hr = pFeature->get__ClassID(&clsid);
if (clsid == __uuidof(MSVidClosedCaptioning))
{
// CC が見つかったらコレクションに追加する。
hr = pActiveFeatures->Add(pFeature);
CComQIPtr<IMSVidClosedCaptioning> pCC(pFeature);
if (pCC) {
hr = pCC->put_Enable(VARIANT_TRUE);
}
}
else if (bWantDataSvc && clsid == __uuidof(MSVidDataServices))
{
hr = pActiveFeatures->Add(pFeature);
}
}
// このコレクションをアクティブなフィーチャー コレクションとして設定する。
hr = m_pVidControl->put_FeaturesActive(pActiveFeatures);
}
return hr;
}