CodeZine(コードジン)

特集ページ一覧

Enhanced Video Rendererを使ってみよう

DirectShowからEVRを使って動画再生を行うアプリケーションの制作

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/06/12 14:00

ダウンロード サンプルコード (17.9 KB)

 Windows Vistaでは新しいビデオレンダラとしてEnhanced Video Rendererが追加されました。本稿では、それを使ってウォーターマークのビットマップを合成しながら動画を再生するアプリケーションを作成します。

目次

はじめに

 Windows XP以前ではDirectShowにおける静止画や動画の表示に使われるレンダラーとして、Video Renderer、Overlay Mixer、Video Mixing Renderer(以下、VMR)、VMR9が使われてきました。Windows Vistaでは、これらは引き続き使用可能ではありますが、新たにEnhanced Video Renderer(以下、EVR)と呼ばれるコンポーネントがインストールされています。

 本稿では、EVRの概要を説明します。それから、実際にEVRを使って動画をウォーターマークと共に再生する方法を説明します。

対象読者

  • C++言語、ATLが分かる方
  • DirectShowを使ったアプリケーションを作成したことのある方

 本稿のサンプルコードはATLを使っていますが、EVRを使うための必須条件ではありません。

必要な環境

EVRとは?

 EVRは、入力したフレームを画面に表示するビデオレンダラーコンポーネントです。

 EVRは、従来のレンダラーのようにDirectShowフィルタとして機能するだけでなく、新たな映像・音声プラットフォームであるMedia Foundationのメディアシンクとしても機能します。これはEVRというコンポーネントがDirectShowとMedia Foundationの両方のインターフェイスを持っているからです。

EVRを構成しているコンポーネント

 EVRは「ミキサー」と「プレゼンタ」と呼ばれる2つのコンポーネントで構成されています。ミキサーは入力したフレームを合成し、プレゼンタはミキサーから合成したフレームを受け取り、レンダリングします(図1)。

図1. EVR内部の構成
図1

 これら2つのコンポーネントは独自のものに置き換えることができます。例えば、EVRに既定で割り当てられている標準プレゼンタは指定したウィンドウにフレームを表示するだけですが、独自のプレゼンタをEVRに割り当てることにより、自前で用意したDirect3Dサーフェイスなどへレンダリングすることもできます。

EVRにおける操作モード

 EVRにはVMRにおける「操作モード」がないという大きな違いがあります。

 VMRには、3つの表示モード「ウィンドウモード」「ウィンドウレスモード」「レンダリングレス再生モード」と、複数の入力ストリームの合成を行う「ミキシングモード」という、「操作モード」と呼ばれる仕組みがありました。アプリケーションは、必要に応じて、これらのモードを選択していました。

 EVRには、このような区別がありません。あえて言うと、常にミキシングモードが有効であり、レンダリングレス再生モードです。

 EVRではミキサーが常にロードされた状態となっています。VMRでは入力ストリームの数が1であった場合、ミキサーはロードされませんでしたが、EVRでは常にロードされます。

 また、レンダリングレス再生モードなので、何らかのプレゼンタが常に使われます。EVRでは標準プレゼンタが用意されていて、既定ではこれがロードされています。これはウィンドウレスモードのように動作をします。つまり、プレゼンタ自身がウィンドウを作成しないので、アプリケーション側で表示先となるウィンドウを用意し、それを指定します。

EVRの準備とインスタンスの作成

 では実装に入っていきましょう。DirectShowとEVRを使うには、次のファイルをインクルードし、ライブラリをリンクします。

  • dshow.h
  • strmiids.lib
  • evr.h

 ウォーターマークを表示するために必要なIMFVideoMixerBitmapインターフェイスを使うために、次のファイルを追加でインクルードします。

  • evr9.h
  • d3d9.h

 EVRのインスタンスを作成します。CLSIDとしてCLSID_EnhancedVideoRendererを指定します。DirectShowで使うために、インターフェイスはIBaseFilterとします。

CComPtr<IBaseFilter> m_Evr;
hr=m_Evr.CoCreateInstance(CLSID_EnhancedVideoRenderer);

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5