DirectShow ( DSまたはDShowと略されることもある)、コードネームQuartz は、ソフトウェア開発者がメディア ファイルやストリームに対してさまざまな操作を実行するためにMicrosoftが作成したマルチメディア フレームワークおよびAPI です。これは、Microsoft の以前のVideo for Windowsテクノロジーの後継です。 [ 1 ] Microsoft Windowsコンポーネント オブジェクト モデル(COM) フレームワーク に基づいて、DirectShow はさまざまなプログラミング言語間でメディアの共通インターフェイスを提供し、ユーザーまたは開発者の要求に応じてメディア ファイルをオンデマンドでレンダリングまたは記録できる拡張可能なフィルタベースのフレームワークです。DirectShow の開発ツールとドキュメントは、当初DirectX SDKの一部として配布されていました。[ 2 ]現在、これらはWindows SDK (以前は Platform SDK として知られていました)の一部として配布されています。 [ 3 ]
Microsoft は、将来の Windows バージョンで DirectShow をMedia Foundationで段階的に完全に置き換える予定です。Microsoft が挙げた理由の 1 つは、「コンテンツ保護システムに対するはるかに堅牢なサポート」を提供することです[ 4 ] (デジタル著作権管理を参照)。Microsoft の Becky Weiss は 2006 年に、「Media Foundation を使用するには、DirectShow を使用する場合よりも少し低いレベルで作業する必要があることに気づくでしょう。また、Media Foundation には (まだ) 含まれていない DirectShow の機能もまだあります」と確認しました。[ 4 ] [ 5 ] Media Foundation の記事で説明されているように、Windows VistaおよびWindows 7アプリケーションは、いくつかのメディア関連のタスクで DirectShow の代わりに Media Foundation を使用します。
DirectShow の直接の前身であるActiveMovie (コードネーム Quartz) は、Windows でMPEG-1サポートを提供するために設計されました。また、32 ビット環境に完全に移植されておらず、 COM も使用していなかったVideo for WindowsやMedia Control Interfaceなどのメディア処理フレームワークの将来的な代替となることも意図されていました。[ 6 ] [ 1 ]
開発チームは、DirectShow のベースとして、コードネーム「Clockwork」と呼ばれる既存のモジュール式デジタルメディアプロセッサプロジェクトを使用した。Clockwork は以前、Microsoft Interactive Television プロジェクトで使用されていた。[ 7 ]
このプロジェクトは当初「ActiveMovie」という名前で、1996 年 5 月にInternet Explorer 3.0のベータ版に同梱されてリリースされました。[ 8 ] [ 9 ] 1997 年 3 月、Microsoft は ActiveMovie がDirectX 5 スイートのテクノロジーの一部になると発表し、7 月頃から DirectShow と呼ばれるようになりました。これは、当時 Microsoft がハードウェアと直接連携するテクノロジーを共通の命名規則の下に統合しようとしていたことを反映しています。[ 10 ] [ 11 ] [ 12 ] DirectShow はWindows 98以降、すべての Windows オペレーティングシステムの標準コンポーネントになりました。[ 13 ]ただし、最新の DirectX 再頒布可能パッケージをインストールすれば、Windows 95でも使用できます。 [ 14 ] DirectX バージョン 8.0 では、DirectShow は他の DirectX API とともにコア DirectX SDK の一部になりました。[ 15 ]
2004 年 10 月、DirectShow はメインの DirectX ディストリビューションから削除され、DirectX Extras ダウンロードに移動されました。2005年 4 月、DirectShow は DirectX から完全に削除され、Windows Server 2003 SP1 バージョンの SDK から Windows SDK に移動されました。[ 3 ]ただし、DirectShow のサンプルの一部をビルドするには、DirectX SDK がまだ必要でした。[ 16 ]
2007年11月以降、DirectShow APIはWindows SDKの一部となっています。これには、拡張ビデオレンダラー(EVR)やDXVA 2.0(DirectXビデオアクセラレーション)などの新しい機能強化、コーデック、フィルターの更新が含まれています。[ 17 ]
DirectShow は、複雑なマルチメディア タスク (ビデオ再生など) を、フィルタと呼ばれる一連の基本的な処理ステップに分割します。[ 18 ] [ 19 ] 各フィルタ(データ処理の 1 つの段階を表す) には、フィルタを他のフィルタに接続するために使用できる入力ピンおよび/または出力ピンがあります。この接続メカニズムの汎用性により、フィルタをさまざまな方法で接続して、さまざまな複雑な機能を実装できます。[ 20 ]特定の複雑なタスクを実装するには、開発者はまず必要なフィルタのインスタンスを作成してフィルタ グラフを構築し、次にフィルタ同士を接続する必要があります。[ 21 ]
フィルターには主に3つの種類があります。
レンダリング処理中、フィルタグラフはWindowsレジストリから登録済みのフィルタを検索し、指定された場所に基づいてフィルタグラフを構築します。その後、フィルタ同士を接続し、開発者の要求に応じて、作成されたグラフを実行(再生、一時停止など)します。DirectShowフィルタグラフは、ビデオ再生(フィルタはファイル解析、ビデオおよびオーディオの多重分離、解凍、レンダリングなどの機能を実装します)だけでなく、ビデオおよびオーディオの録画、編集、エンコード、トランスコード、メディアのネットワーク送信にも広く使用されています。DVDナビゲーションなどのインタラクティブなタスクもDirectShowで制御できます。

上記の例では、左から右へ、グラフにはMP3ファイルを読み込むソースフィルタ、音声を解析およびデコードするストリームスプリッタフィルタとデコーダフィルタ、そして生の音声サンプルを再生するレンダリングフィルタが含まれています。各フィルタには、そのフィルタを他のフィルタに接続するために使用できるピンが1つ以上あります。各ピンは、あるフィルタから別のフィルタへデータが流れるための出力ソースまたは入力ソースとして機能します。フィルタによっては、フィルタ間でデータを転送するために、入力ピンからデータが「プル」されるか、出力ピンに「プッシュ」されます。各ピンは他の1つのピンにしか接続できず、送信するデータの種類について合意する必要があります。
ほとんどのフィルタは、DirectShow SDK で提供される DirectShow ベース クラスと呼ばれる C++ クラスのセットを使用して構築されます。これらは、フィルタの作成、登録、および接続ロジックの大部分を処理します。[ 23 ]フィルタ グラフがフィルタを自動的に使用するには、フィルタを別の DirectShow レジストリ エントリに登録するとともに、COM にも登録する必要があります。この登録は、DirectShow ベース クラスによって管理できます。ただし、アプリケーションがフィルタを手動で追加する場合は、フィルタをまったく登録する必要はありません。残念ながら、既に実行中のグラフを変更するのは困難です。通常は、グラフを停止して、最初から新しいグラフを作成する方が簡単です。DirectShow 8.0 以降、実行中のグラフを変更するのに役立つ動的グラフ構築、動的再接続、およびフィルタ チェーンが導入されました。[ 24 ] ただし、一部のフィルタ ベンダーはこの機能を無視しているため、グラフの処理が開始された後にグラフを変更すると問題が生じます。
DirectShowは、指定されたメディアタイプをレンダリングするためのグラフを動的に構築する機能を備えていますが、場合によっては開発者がこの機能に頼りきれないことがあり、結果として得られるフィルタグラフが可変である場合は、手動でフィルタグラフを構築する必要があります。コンピュータに新しいフィルタがインストールされると、フィルタグラフが時間とともに変化する可能性があります。
DirectShow には、デフォルトでは、MPEG-1、MP3、Windows Media Audio、Windows Media Video、MIDIなどの一般的なメディア ファイル フォーマット、 AVI、ASF、WAVなどのメディア コンテナ、いくつかのスプリッター/デマルチプレクサ、マルチプレクサ、ソース フィルターとシンクフィルター、いくつかの静止画像フィルター、いくつかのビデオ アクセラレーション、および最小限のデジタル著作権管理(DRM) サポートをデコードするための多数のフィルターが含まれています。[ 25 ] [ 26 ] DirectShow の標準フォーマット レパートリーは、さまざまなフィルターを使用して簡単に拡張でき、DirectShow が事実上すべてのコンテナ フォーマットと任意のオーディオまたはビデオ コーデックをサポートできるようになります。たとえば、Ogg Vorbis、Musepack、およびAC3用のフィルターが開発されており、 MPEG-4 Advanced Simple Profile、AAC、H.264、Vorbisなどのコーデックと、コンテナMOV、MP4は、 ffdshow、K-Lite、CCCPなどのサードパーティから入手できます。[ 27 ] [ 28 ] [ 29 ]このような追加のコーデックのサポートを組み込むには、関係するコーデック技術の開発者または特許権者にライセンス料を支払う必要がある場合があります。最後に、 VLCなどの基盤となるマルチメディア API の機能を公開することで、複数のフォーマットやストリーム多重化などの機能を同時にサポートする「ブリッジ」フィルターがあります。[ 30 ]
フィルタグラフを実装するために必要な作業量は、いくつかの要因によって異なります。最も単純なケースでは、DirectShow はファイルや URL などのソースからフィルタグラフを自動的に作成できます。[ 31 ]これが不可能な場合は、開発者はソースファイルからフィルタグラフを手動で作成し、場合によってはカスタムフィルタを追加して、DirectShow にフィルタ同士を接続させてフィルタグラフを完成させることができます。次のレベルでは、開発者は必要なフィルタを手動で追加して接続することにより、フィルタグラフをゼロから構築する必要があります。最後に、必須のフィルタが利用できない場合は、フィルタグラフを構築する前に、開発者はカスタムフィルタを作成する必要があります。
QuickTimeのメインC APIでは、メディアファイルを読み込むためにループ内でMoviesTaskを呼び出す必要がありますが、DirectShowではこれらすべてが透過的に処理されます。DirectShowは複数のバックグラウンドスレッドを作成し、プログラマーがほとんど何もする必要なく、要求されたファイルまたはURLをスムーズに再生します。また、QuickTimeとは異なり、ディスク上のローカルファイルではなくURLを読み込むために特別な処理は必要ありません。DirectShowのフィルタグラフがこれらの詳細をプログラマーから抽象化しているためです。ただし、QuickTimeの最近の開発(ActiveXコントロールを含む)により、この差は縮小しています。
GraphEdit は DirectShow のフィルタ グラフを構築およびテストするためのビジュアル ツールです。フィルタはボックスとして表示され、テキスト キャプションにはフィルタ名が表示されます。GraphEdit は DirectShow フィルタ グラフのプロトタイプ作成に使用できます。[ 32 ]
DirectShow Editing Services (DES) は、DirectX 8.0/ Windows XPで導入された、ビデオ編集タスクを対象とした API であり、コア DirectShow アーキテクチャの上に構築されています。DirectShow Editing Services は、 Microsoft のWindows Movie Maker用に導入されました。[ 1 ] タイムラインおよびスイッチング サービス、サイズ変更、トリミング、ビデオおよびオーディオ エフェクト、トランジション、キーイング、自動フレーム レートおよびサンプル レート変換などの機能の API が含まれており、複数のソース オーディオおよびビデオ ストリームから複合メディアを作成できる非線形ビデオ編集で使用されます。DirectShow Editing Services は、より高レベルのランタイム合成、シーク サポート、およびグラフ管理を可能にしながら、アプリケーションが低レベルの DirectShow 機能にアクセスできるようにします。
オリジナルの API は C++ ですが、DirectShow Editing Services は、サードパーティのコード ライブラリ「DirectShowNet Library」を使用することで、 Microsoft Visual C#や Microsoft Visual Basicを含む、Microsoft .NET 互換の言語でアクセスできます。 [ 33 ]また、DirectShow Editing Services を含む DirectShow API 全体は、サードパーティのソフトウェア ライブラリ「DSPack」を使用することで、 Borland Delphi 5、6、7、C++ Builder 6、およびそれ以降のバージョンから、若干の変更を加えるだけでアクセスできます。[ 34 ]
2012年3月現在[ 35 ](そして、どうやら2009年には既に[ 36 ])、MicrosoftはDirectShow編集サービスの「APIはサポートされておらず、将来変更されるか利用できなくなる可能性がある」と述べています。
元々、Windows 9xでは、DirectShow はビデオ レンダラーフィルターを使用していました。これはDirectDraw 3を使用して画像を描画しましたが、状況によっては (ビデオ ウィンドウの表示とビデオ カードの機能に応じて) GDIまたはオーバーレイ描画モードにフォールバックすることもできました。[ 14 ] [ 37 ]ビデオウィンドウへのアクセスは制限されていました。Video for Windows は、アプリケーションによるビデオ ウィンドウの不適切な処理が原因でデッドロックが発生するという問題に悩まされていたため、初期の DirectShow リリースでは、再生ウィンドウのハンドルはアプリケーションから隠されていました。また、ビデオの上にキャプション テキストやグラフィックを描画する確実な方法もありませんでした。
DirectX Mediaの一部としてリリースされたDirectShow 6.0では、DVD再生やクローズドキャプションと字幕付きの放送ビデオストリーム用に設計されたOverlay Mixerレンダラーが導入されました。Overlay MixerはレンダリングにDirectDraw 5を使用します。[ 14 ]ウィンドウ管理には、ビデオレンダラーとのダウンストリーム接続が必要です。Overlay Mixerはビデオポート拡張機能(VPE)もサポートしており、オーバーレイ機能を備えたアナログTVチューナー( PCIバス経由ではなくアナログリンク経由でビデオをビデオカードに直接送信)と連携できます。Overlay MixerはDXVA接続もサポートしています。常にオーバーレイでレンダリングするため、 TV出力へのフルスクリーンビデオは常に有効になります。
DirectX 7.0とWindows 2000ではDXVA 1.0が導入されました。DXVA 1.0は通常、より信頼性の高いWDMグラフィックスドライバに基づいています。DirectX 7.0以降では、DirectShowはDXVAの下位互換性のあるAPIです。
Windows 2000以降、ビデオ ミキシング レンダラー 7 ( VMR-7 、または単にVMRと呼ばれることもある)と呼ばれる新しいフィルターが導入されました。番号 7 は、VMR-7 がビデオのレンダリングにDirectDrawバージョン 7 のみを使用し、GDI 描画を使用するオプションがなかったためです。VMR-7 の主な新機能は、アルファ ブレンディングを使用して複数のストリームとグラフィックスをミックスできる機能で、アプリケーションがビデオ上にテキストやグラフィックスを描画したり、カスタム エフェクトをサポートしたりできるようになりました。[ 38 ]また、「ウィンドウレス モード」(レンダリング前の合成画像へのアクセス)も搭載されており、ウィンドウ ハンドルへのアクセスに関する問題を解決しました。[ 39 ]
DirectX 9 では、Windows XP SP2 以降に含まれるVMR-9が導入されました。 [ 40 ]このバージョンではDirectDraw の代わりにDirect3D 9 を使用しているため、開発者は Direct3D ピクセル シェーダーを使用してビデオ イメージを変換できます。[ 41 ]これは、DirectX 9 再頒布可能パッケージの一部として、すべての Windows プラットフォームで利用可能です。VMR -7と同様に、ウィンドウレス モードを提供します。ただし、オーバーレイ ミキサーやVMR-7とは異なり、ビデオ ポートはサポートしていません。[ 42 ] /3GB ブート オプションを使用すると、VMR-9 が失敗する可能性があります。[ 43 ]
Windows VistaとWindows 7には、 Media Foundationコンポーネントと DirectShow フィルターの両方として利用できる新しいビデオ レンダラー、 Enhanced Video Renderer ( EVR ) が付属しています。[ 44 ] EVR は、デスクトップ ウィンドウ マネージャーと連携するように設計されており、 Windows Vista と Windows 7 で利用可能なDXVA 2.0 をサポートしています。 [ 45 ] Microsoft によると、パフォーマンスと品質が向上しています。[ 46 ] Windows Vistaでは、マルチメディア フレームワークが書き直され、ビデオ デコードのみがハードウェア アクセラレーションされ、オーディオ デコード ( MP3など) は CPU ベースになっています。[ 47 ]
2007年1月8日、マイクロソフトは第58回テクノロジー&エンジニアリング・エミー賞でストリーミングメディアアーキテクチャおよびコンポーネント部門のエミー賞を受賞しました。[ 48 ]
DirectShow にファイルを再生するように指示するのは比較的簡単な作業です。しかし、DirectShow にビデオウィンドウから特定のウィンドウメッセージを表示させたり、カスタムフィルターを作成したりするなど、より高度なカスタマイズをプログラミングする際には、多くの開発者が困難を訴えています。[ 49 ] [ 50 ]これは、Microsoft の最も複雑な開発ライブラリ/API の 1 つと見なされています。[ 51 ]
開発者が DirectShow フィルターをゼロから作成することは稀です。むしろ、DirectShow ベース クラスを使用します。ベース クラスを使用すると、プログラマーが特定のタスクを省略できるため、開発が簡素化されることがよくあります。ただし、プロセスは比較的複雑になる可能性があり、ベース クラスに含まれるコードは、MFC ライブラリ全体のほぼ半分のサイズになります。そのため、ベース クラスを使用しても、DirectShow に含まれる COM オブジェクトの数は、開発者にとって負担となることがよくあります。場合によっては、DirectShow の API は、特にメソッドで使用されるパラメーターに関して、従来の COM ルールから逸脱しています。DirectShow独自の COM ルールによる困難を克服するために、開発者は、DirectShow を使用するより高レベルの API、特にWindows Media Player SDKに頼ることがよくあります。この API は、扱う COM インターフェイスが少ない ActiveX コントロールを開発者に提供します。
DirectShowは、指定されたメディアタイプをレンダリングするためのグラフを動的に構築する機能を備えていますが、場合によっては開発者がこの機能に頼りきれないことがあり、結果として得られるフィルタグラフが可変である場合は、手動でフィルタグラフを構築する必要があります。コンピュータに新しいフィルタがインストールされると、フィルタグラフが時間とともに変化する可能性があります。
コーデック地獄( DLL地獄に由来する用語)とは、複数のDirectShowフィルターが同じタスクを実行するために競合する状態を指します。現在、多くの企業がDirectShowフィルターの形でコーデックを開発しており、その結果、同じメディアタイプをデコードできるフィルターが複数存在することになります。[ 52 ] [ 53 ]この問題は、DirectShowのメリットシステムによってさらに悪化します。このシステムでは、フィルターの実装が、より高い優先順位で登録することで互いに競合することになります。[ 53 ]
マイクロソフトのテッド・ユーマンズは、「DirectShowはメリットシステムに基づいており、フィルターのメリットとメディアタイプ/サブタイプの具体性を組み合わせることで、毎回適切なコーデックを選択できるという考えに基づいていた。これは、メリットを競う核兵器開発競争のために設計されたものではない」と説明した。[ 53 ]
コーデック地獄のトラブルシューティングに役立つツールとしてよく挙げられるのは、GSpot Codec Information Appliance です。これは、AVIやその他のコンテナ内のビデオ ファイルのレンダリングに使用されているコーデックを特定するのに役立ちます。[ 54 ] GraphEdit は、DirectShow がメディア ファイルのレンダリングに使用しているフィルターのシーケンスを理解するのにも役立ちます。コーデック地獄は、フィルター グラフを手動で構築するか、フィルター メリットを無視または上書きするメディア プレーヤーを使用するか、 Windows レジストリでフィルター メリットを変更するフィルター マネージャーを使用することで解決できます。[ 22 ]
DirectShowは開発者中心のフレームワークおよびAPIであるため、エンドユーザーがコンテンツのエンコードを直接制御することはできず、インストール済みのコーデックを使用したエンコードや異なるフォーマットへのエンコードのためのユーザーインターフェイスも組み込まれていません。その代わりに、開発者がAPIを使用してソフトウェアを開発することに依存しています。これに対し、QuickTimeやVideo for Windowsなどの他のマルチメディアフレームワークでは、エンドユーザーが異なるコーデックを使用した再エンコードやファイルおよびストリームの編集など、ビデオ関連の基本的なタスクを実行できます。エンドユーザーGUIが提供する利便性は明らかであり、例えばVirtualDubのように、 Video for Windowsで使用されているAVIフォーマットとコーデックは今でも使用されています。
{{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)