DirectShow (DS またはDShow とも略される)は、マイクロソフト によるメディアファイルまたはストリームに対する様々な操作を行うマルチメディアフレームワークとAPI であり、Video for Windows の後継となっている[ 1] 。コードネームはQuartz であった。COM をベースとしており、多数のプログラミング言語で利用可能な共通のインターフェイス を公開し、拡張性も高いものとなっている。フィルターベースでアプリケーションユーザーまたはソフトウェアプログラマーの要求に応じてメディアの再生・記録などの操作を行えるようになっている。DirectShowの開発ツールや文書は当初DirectX SDKに収録されていたが、現在ではWindows SDK (移管当時Platform SDK)に含まれている[ 2] [ 3] [ 4] 。
DirectShowに対するものとしてApple のQuickTime 、Linux 向けにGStreamer やXine などのマルチメディアフレームワークが存在する。
Windows Vista からは、Media Foundation を後継とすることが計画されている[ 5] 。
歴史
DirectShowの直接の前身はActiveMovie (コードネームQuartz) であり、当初はWindowsをMPEG-1 ファイル再生に対応させるために作られた。そこから、Bフレーム 未対応のVideo for Windows や、完全32ビット化やCOM化されなかったMedia Control Interface (英語版 ) (MCI) の後継たるマルチメディアフレームワークとして拡張されることとなった[ 1] 。
ActiveMovieは1996年3月に公表され[ 6] 、同年5月ベータ版のInternet Explorer 3.0で初公開となった[ 7] 。1997年3月、ActiveMovieはDirectX 5 の一部となることが公表され[ 8] 、直接的にハードウェアを扱う技術に共通の命名を行う方針を受けて7月にはDirectShowと呼ばれ始めた[ 9] [ 10] 。そして、Windows 98からすべてのWindowsに標準搭載されるようになった[ 11] 。DirectX 8.0から他のDirectX APIと同様に重要なコンポーネントとして扱われるようになっている[ 12] 。
2004年10月、DirectShowはDirectX SDKから外されDirectX SDK Extrasに含まれるようになり、さらには2005年4月、DirectShowはDirectX SDKから完全に取り除かれ、当時Windows Server 2003 SP1版だったPlatform SDKに移管された[ 2] 。ただし、現在 [いつ? ] でもDirectShowのサンプルプログラムのビルドには依然としてDirectX SDKが必要である[ 13] [ 14] 。
アーキテクチャ
DirectShowは大きなマルチメディアタスク(映像・音声再生など)をフィルター の並びへ小さく分割して取り扱う[ 15] [ 16] 。各々のフィルターはデータ加工の1段階を表す。フィルターには、さらに入出力を意味し他のフィルターとの接点となる「ピン」があり、ピンの接続の仕方によって様々な機能を実現できるようになっている[ 17] 。DirectShowを使用するプログラムでは、フィルターインスタンスの作成と接続を行なってフィルターグラフ (英語版 ) を構築する[ 18] 。
フィルターは主に3種類ある。
ソースフィルター
ファイルから読み込むなど、データストリームを提供する。
変換フィルター
他のフィルターの出力を受け取り、変換を行う。例えば、非圧縮ビデオにテキストを付加するなど。
レンダーフィルター
レンダリング を行う。サウンドカードに音声を送ったり、画面にビデオを描画したり、ファイルに書き出したりするものなど。
フィルターグラフ (英語版 ) を視覚的に構築して試すことができるツールとしてGraphEdit (英語版 ) が存在する[ 19] 。GraphEditでは、レジストリ から登録されているフィルターを探し、接続して、実行(再生、一時停止など)を行える。再生にあたって、フィルターグラフは再生(再生1つ取ってもファイルパース、音声と映像の分離、圧縮解除、レンダリングと細分される)・録画・録音・編集・圧縮・変換・ネットワーク転送など幅広く使用されており、それだけでなくDirectShowではDVD操作などインタラクティブな操作も可能となっている。
大半のフィルターはDirectShow基底クラス (Base Classes) と呼ばれるDirectShow SDK収録のC++ クラスを使用して作られている[ 20] [ 21] [ 22] 。DirectShow基底クラスは、フィルターの作成・接続や、フィルターグラフがフィルターを自動的に使用できるよう必要なレジストリへの登録を扱ってくれる。自動的に使わせたくないフィルターでは、登録させないことも可能である。
実行中のグラフへの修正は困難である。大抵はグラフを停止させ、新たに作り直すほうが簡単である。これに対処するため、DirectShow 8.0では動的なグラフの作成・再接続、フィルターの連鎖の機能が追加された[ 23] 。しかし、ほとんどのフィルター製作者がこの機能を無視しているため、実行中のグラフの作成が問題なく行えるとは言い難い状況である。
特徴
標準では一般的なメディア形式のフィルターしか導入されない。例えば、コーデックとしてMPEG-1 , MP3 , Windows Media Audio , Windows Media Video , MIDI 、コンテナフォーマット ではAVI , ASF , WAV 、それ以外には分離・多重化・入力元・出力先(シンク )・静的な画像のフィルターなどである[ 24] 。これらの特許はWindowsにライセンスされており、別途ライセンスを受ける必要はない。現在、評判が良く標準が制定された現代的なMPEG-4 ASP , AAC , H.264 , Vorbis のコーデックやOgg , MOV , MP4 などのコンテナなどが含まれていないことに注意が必要である。使用には、別途コーデックを得る必要がある。
しかし、DirectShowは、市販品やオープンソースのソースフィルターを使って拡張でき、様々なコンテナ形式や音声・映像のコーデックがある。例えば、Ogg Vorbis [ 25] , Musepack [ 26] , AC3 [ 27] などが挙げられる。さらに、VLC のように[ 28] 、他のマルチメディアAPIの機能を提供するブリッジフィルターというものも存在する。
フィルターグラフの構築には、様々な方法が考えられる。もっとも単純なのは、ファイルやURLなどからDirectShowに自動でフィルターグラフを構築させる方法である[ 29] 。それが不可能なら、ソースフィルターなどと必要に応じて既存のカスタムフィルターを手動で追加する方法が考えられる。その場合、接続はDirectShowに任せたり必要に応じて手動で行ったりする。また、適当なフィルターがなければ、カスタムフィルターの作成から行うことになる。
再生時、MoviesTaskを呼び続けないといけないQuickTimeのC APIと違い、DirectShowは透過的に扱う。つまりバックグラウンドスレッドを作って、プログラマーに余計な負担を強いることなくスムーズな再生を実現している。もう1つ、QuickTimeとの違いとして、URLからの読み込みとコンピュータ内のローカルファイルとの読み込みの手順で特に違いが存在しないということが挙げられる。これは、DirectShowのフィルターグラフが差異を吸収するためであり、QuickTime (ActiveXコントロール ) でも最近 [いつ? ] はこの点が改善されている。
DirectShow編集サービス
DirectShow編集サービス (DirectShow Editing Services, DES) は、Windowsムービーメーカー のため[ 1] 、DirectX 8.0 / Windows XPで導入されたDirectShowのアーキテクチャ上で構築された映像編集を行うAPIである。これには、タイムライン、トラック、サイズ変更、クロップ、映像・音声へのエフェクト、トランジション、キーイング 、自動フレームレート 、サンプリング周波数変換 やその他ノンリニア編集 で用いられる無数の機能が搭載されている。さらに、高水準の実行時合成、シーク対応、グラフ管理は低水準のDirectShowの機能を使用中でも利用できる。
DirectShow編集サービスはVisual C++ 向けにインターフェイスが用意されているが、最近 [いつ? ] ではC# やVB.NET などといった.NET言語で利用できるようにするサードパーティのライブラリとしてDirectShow Lib が存在する[ 30] 。
ほかには、DirectShow編集サービスも含めたDirectShowのAPIをDelphi 5, 6, 7およびC++ Builder 6などで利用可能にするサードパーティのライブラリとしてDSPackが存在する[ 31] 。
ビデオレンダラーフィルター
当初、DirectShowが映像を再生する手段としてビデオレンダラー フィルターが用いられた。これは、まずDirectDraw 、それが駄目ならGDI を用いて描画するレンダラーである [ 32] 。ビデオレンダラーでは、ビデオウィンドウへのアクセスが制限される。Video for Windows では、映像再生用ウィンドウのハンドルに対して、アプリケーションが適切な扱いをしないことに起因するデッドロック に苦慮したため、初期のDirectShowでは、再生するためのウィンドウへのハンドルがアプリケーションから隠蔽されていたこともあった。そのため、画面の映像上に字幕の文字や絵を描画する確実な方法は当時存在しなかった。
DirectShow 6.0では、DirectX Media の一部として、オーバーレイミキサー をリリースした。これは、字幕を付けてのDVD やストリーミング放送の再生のために作られ、DirectDraw をレンダリングに用いる。なお、オーバーレイミキサーの使用の際には、ウィンドウ管理のためフィルター接続の下流に「ビデオレンダラー」フィルターが必要である。オーバーレイミキサーは(PCIを通さず直接ビデオカードへ映像信号を送る)オーバーレイ対応のアナログTVチューナー カードと協調するためのVideo Port Extensions (VPE) もサポートしている。また、DXVA 接続にも対応している。
Windows XP ではVideo Mixing Renderer 7 (VMR-7 、単にVMR と表記されることも) が導入された。この7は、GDIを全く使用せずDirectDraw バージョン7を描画に用いることに由来する。VMR-7の特徴は、複数のストリームやグラフィックスの混合が可能になったことである。例えば、アプリケーションが映像上に文字や絵を乗せることが可能になったのである[ 33] 。また、VMR-7にはウィンドウハンドルの扱いに関する問題を改善した「ウィンドウレスモード」が存在する[ 34] 。公式には、VMR-7はWindows XP以降にしか用意されていない。
DirectX 9ではVMR-9 が搭載されている。これはDirectDrawではなく、Direct3D 9を描画に用いる[ 35] 。こちらは、DirectX 9が使用可能なすべてのWindowsで利用可能である。
Windows Vista では、Media Foundation とEnhanced Video Renderer (EVR )[ 36] と呼ばれる新しいレンダラーが用意されている。EVRはDXVA 2.0に対応しているが、Windows Vistaには搭載されていない[ 37] 。
関連項目
参考
脚注
外部リンク
マイクロソフトのAPIとフレームワーク
グラフィック オーディオ マルチメディア ウェブ データアクセス ネットワーク コミュニケーション 管理 コンポーネントモデル ライブラリ デバイスドライバ セキュリティ .NET ソフトウェアファクトリー IPC アクセシビリティ テキストと多言語 サポート