Share via


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;
}