この記事では、Microsoft DirectShowについてよく寄せられる質問に回答します。
どのようなオペレーティング システムDirectShowサポートされていますか?
DirectShowは、サポートされているすべてのバージョンのWindowsで使用できます。
DirectShowを使用してプログラミングするには、どのくらいの COM 知識が必要ですか?
アプリケーション開発では、COM オブジェクトの操作の基本 (インスタンス化、公開されているインターフェイスへのアクセス、それらのインターフェイスの参照カウントの管理) を理解する必要があります。 フィルターの開発には、より多くの COM 知識が必要です。
どのような形式DirectShowサポートされていますか?
DirectShowでサポートされている形式を参照してください。
DirectShowハードウェア互換性リスト (HCL) はありますか?
いいえ。 DirectShowは、Microsoft DirectDraw と Microsoft DirectSound ハードウェア機能が使用可能な場合に使用します。 特別なハードウェアが使用できない場合、DirectShowは GDI を使用してビデオを描画し、waveOut * マルチメディア API を使用してオーディオを再生します。
DirectShow アプリケーションを記述するために使用できる言語は何ですか?
DirectShowは主に C++ 開発用に設計されています。 DirectShow API の小さなサブセットは、Visual Basic 6.0 を通じて公開されますが、この機能は非推奨です。
DirectShowマネージド コードを使用してアクセスできますか?
Microsoft には、マネージド DirectShow API を実装する現在の計画はありません。
DirectShow開発に必要なコンパイラは何ですか?
コンポーネント オブジェクト モデル (COM) オブジェクトを生成できるコンパイラは、コンパイラの環境が正しく構成されたら機能する必要があります。
DirectShowは Microsoft DirectX とどのように関連していますか?
内部的には、DirectShowは、ハードウェアでサポートされている場合に DirectSound と DirectDraw を使用します。 ビデオ レンダラーとオーバーレイ Mixer フィルターでは、DirectDraw 3 サーフェスと DirectDraw 5 サーフェスが使用されます。 ビデオ ミキシング レンダラー 7 (Windows XP のみ) は DirectDraw 7 サーフェスを使用します。 ビデオ ミキシング レンダラー 9 と拡張ビデオ レンダラーでは、最新の Microsoft Direct3D API が使用されます。 他の DirectX API を使用してDirectShow アプリケーションを作成する必要はありませんが、それらを組み合わせることができます。
DirectShowは Microsoft ActiveMovie とどのように関連していますか?
ActiveMovie は、DirectShowの元の名前でした。 ActiveMovie という用語は使用されなくなりました。
GraphEdit ユーティリティのソース コードは使用できますか? GraphEdit は再配布できますか?
いいえ。ソースは使用できず、Graphedt.exeは再頒布可能ではありません。
DMO は DirectShow フィルターを置き換えますか?
Microsoft DirectX Media Objects (DTO) は、DirectShow アプリケーションで使用できます。 エンコーダー、デコーダー、エフェクトの場合は、DirectShow フィルターではなくDMOを記述することをお勧めします。 (注: デコーダーで DirectX ビデオ アクセラレータを使用する場合は、フィルターとして実装する必要があります)。その他の目的では、DirectShow フィルターの方が適切な場合があります。 DMO の詳細については、「 DirectX メディア オブジェクト」を参照してください。
Windows メディア プレーヤーでAVIフォーマットファイルを再生しています。 私はオーディオを聞くことができますが、代わりにビデオがないようです、私はちょうど黒を見る。 理由
おそらく、ファイルは、システムに存在しないコーデックでエンコードされました。 AVI ファイル形式は一般的ですが、AVI ファイルはさまざまな圧縮形式 (コーデック) で作成できます。 サポートされていないコーデックを使用する AVI ファイルを再生しようとすると、オーディオ コンポーネントが読み上げられる可能性がありますが、ビデオは黒い画面として表示されるか、画面の内容は変更されません。
Note
Windows メディア プレーヤーは、コーデックがシステムに存在しない場合に、コーデックのダウンロードとインストールを試みることがよくあります。
アプリケーション操作方法ビルドしますか? 必要なライブラリとヘッダー ファイル
ビルド環境の設定を参照してください。
GraphEdit には、文書化されていないフィルターが多数表示されます。 これらのフィルターとは
GraphEdit は、システムに登録されているすべてのフィルターをフィルター カテゴリに列挙します。 これには、サード パーティ製アプリケーションによってインストールされたフィルターや、Windows Media や NetMeeting などの他の Microsoft テクノロジによってインストールされたフィルターが含まれる場合があります。 また、一部のDirectShow フィルターはコーデックまたはハードウェア デバイスのラッパーとして機能し、各コーデックまたはデバイスは個別のフィルターとして表示されます。 Microsoft H.263 ビデオ コーデックは NetMeeting によって使用され、DirectShowではサポートされなくなりました。 詳細については、「 デバイスとフィルターの列挙」を参照してください。
カスタム グラフをプログラムで作成する際に問題が発生しています。
最初に、GraphEdit を使用してフィルター グラフを構築してみてください。 このツールを使用すると、多くの可能性をすばやくシミュレートできます。 GraphEdit は、ソース コードを使用してグラフをビルドする前に、グラフをテストするのに常に最適な場所です。
グラフの作成の詳細については、次の記事を参照してください。
特定のコンピューターにDirectShowがインストールされているかどうかを検出するにはどうすればよいですか?
CoCreateInstance を呼び出して、フィルター Graph マネージャーのインスタンスを作成します。 この呼び出しが成功すると、DirectShowがコンピューターにインストールされます。 この処理方法を、次のコードで示します。
IGraphBuilder *pGraph;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **) &pGraph);
プロパティ ページを表示せずにフィルターの設定を変更操作方法。
ほとんどのフィルターでは、フィルターにプロパティを設定するための 1 つ以上のインターフェイスが公開されます。 該当するフィルターについては、参照ページを参照してください。 (「DirectShow フィルター」を参照してください)。
GraphEdit でフィルターをテストできますか?
フィルターの開発中に、GraphEdit はフィルター間の接続を視覚化するのに役立ちます。 また、フィルターの機能を簡単にテストすることもできます。 ただし、堅牢なテスト プラットフォームとして意図されていません。
フィルターはどのような特権リングで実行されますか?
フィルターはリング 3 で実行されますが、一部のフィルターはリング 0 で実行されるストリーミング デバイスを制御します。 詳細については、「ハードウェア デバイスがフィルター Graphに参加する方法」を参照してください。
カーネル デバッガーを使用する必要がありますか?
これは、特定のプロジェクトによって異なります。 DirectX デバッグ ランタイム ライブラリをインストールすると、デバッグ ドライバーやその他のカーネル モード コンポーネントがインストールされ、アプリケーションによってこれらのコンポーネントのいずれかでデバッグ アサートが発生した場合、プロセスにカーネル デバッガーがアタッチされていない限り、マシンは自動的に再起動されます。
デバッガーでアプリケーションを実行すると、アプリケーションがクラッシュします。
一部のデコーダーは、アプリケーションがデバッガーにアタッチされている間は動作しないように設計されています。 デバッガーの外部でアプリケーションを実行してみてください。
DEFINE\_GUID マクロのしくみ
DEFINE_GUID マクロは、ソース コードで GUID 値への参照を宣言するextern
問題を解決します。 たとえば、プロジェクトに Src1.cpp、Src2.cpp、Src3.cpp の 3 つのソース ファイルがあり、3 つのファイルすべてが定義した特定の GUID 値を使用しているとします。 GUID 値はプロジェクト内で 1 回だけ定義する必要があり、他のソース ファイルはそれに対する参照を宣言 extern
する必要があります。
DEFINE_GUID マクロを使用すると、両方の目的で同じヘッダー ファイルを使用できます。 ヘッダー ファイルで、次のように GUID を宣言します。
DEFINE_GUID(CLSID_MyObject,
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
(この例にゼロがある場合は、実際の GUID 値を配置します)。Guidgen.exe ユーティリティを使用して新しい GUID を作成し、 DEFINE_GUID 形式でヘッダー ファイルに貼り付けることができます。 GUID を参照するすべてのソース ファイルにこのヘッダー ファイルを含めます。 ソース ファイルの 1 つに、ヘッダー ファイルの前にヘッダー ファイル Initguid.h を含めます。 次に例を示します。
// Src1.cpp
#include <initguid.h>
#include "MyGuids.h"
// Src2.cpp
#include "MyGuids.h"
// Src3.cpp
#include "MyGuids.h"
Initguid.h ヘッダー ファイルが含まれていない場合は、 DEFINE_GUID マクロによって GUID 値への参照が作成 extern
されます。 Initguid.h ヘッダー ファイルを含めると、 DEFINE_GUID マクロが再定義され、 GUID の 定義宣言DEFINE_GUID作成されます。
いずれかのソース ファイルに Initguid.h を含めなかった場合は、リンク エラー "未解決の外部シンボル" が表示されます。同じ GUID に Initguid.h を 2 回含める場合は、コンパイル エラー "redefinition; " が発生します。複数の初期化。これらのエラーを解決するには、Initguid.h が 1 回だけ含まれていることを確認します。 また、プリコンパイル済みヘッダー ファイル内に Initguid.h を含めないでください。これは、実質的にすべてのソース ファイルにプリコンパイル済みヘッダーが含まれるためです。