DirectShow Editing Services でのデコーダーの選択
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
[この API はサポートされていないため、今後変更または使用できない可能性があります。]
DirectShow Editing Services (DES) がビデオ編集プロジェクトをレンダリングすると、レンダリング エンジンによって必要なデコーダーが自動的に選択されます。 これは 、IRenderEngine::ConnectFrontEnd メソッド内、またはレンダリング中に動的に発生する可能性があります。
ユーザーは、特定のファイルをデコードできるデコーダーをいくつかインストールする場合があります。 複数のデコーダーが使用可能な場合、DES は インテリジェント接続 アルゴリズムを使用してデコーダーを選択します。
アプリケーションで使用するデコーダーを直接指定する方法はありません。 ただし、 IAMGraphBuilderCallback コールバック インターフェイスを使用して、デコーダーを間接的に選択できます。 アプリケーションでこのインターフェイスを実装することで、グラフ構築プロセス中に通知を受け取り、グラフから特定のフィルターを拒否できます。
まず、 IAMGraphBuilderCallback インターフェイスを公開するクラスを実装します。
class GraphBuilderCB : public IAMGraphBuilderCallback
{
public:
// Method declarations (not shown).
};
次に、Filter Graph Manager のインスタンスを作成し、コールバック通知を受け取るクラスを登録します。
// Declare an instance of the callback object.
GraphBuilderCB GraphCB;
// Create the Filter Graph Manager.
CComPtr<IGraphBuilder> pGraph;
hr = pGraph.CoCreateInstance(CLSID_FilterGraph);
if (FAILED(hr))
{
// Handle error (not shown).
}
// Register to receive the callbacks.
CComQIPtr<IObjectWithSite> pSite(pGraph);
if (pSite)
{
hr = pSite->SetSite((IUnknown*)&GraphCB);
}
次に、レンダー エンジンを作成し、フィルター グラフ マネージャーへのポインターを使用して IRenderEngine::SetFilterGraph メソッドを呼び出します。 これにより、レンダリング エンジンは独自の Filter Graph Manager を作成せず、代わりにコールバック用に構成したインスタンスを使用します。
CComPtr<IRenderEngine> pRender;
hr = pRender.CoCreateInstance(CLSID_RenderEngine);
if (FAILED(hr))
{
// Handle error (not shown).
}
hr = pRender->SetFilterGraph(pGraph);
プロジェクトがレンダリングされると、フィルター グラフ マネージャーが新しいフィルターを作成する直前に、アプリケーションの IAMGraphBuilderCallback::SelectedFilter メソッドが呼び出されます。 SelectedFilter メソッドは、フィルターのモニカーを表す IMoniker インターフェイスへのポインターを受け取ります。 モニカーを調べて、フィルターを拒否する場合は、 SelectedFilter メソッドからエラー コードを返します。
難しいのは、デコーダーを表すモニカー、特に拒否するデコーダーを表すモニカーを特定することです。 1 つの解決策は次のとおりです。
プロジェクトをレンダリングする前に、 IFilterMapper2::EnumMatchingFilters メソッドを 使用して、目的の入力の種類を受け入れるように登録されているフィルターの一覧を作成します。 ビデオまたはオーディオの圧縮の種類の場合、この一覧はデコーダーのセットにマップする必要があります。
EnumMatchingFilters メソッドはモニカーのコレクションを返します。 コレクション内のモニカーごとに、「フィルター マッパーの使用」の説明に従って DisplayName プロパティを取得します。
表示名の一覧を格納しますが、デコードに使用するフィルターに一致する表示名は省略します。 ソフトウェア フィルターの表示名の形式は次のとおりです。
OLESTR("@device:sw:{CategoryGUID}\{FilterCLSID}");
where
CategoryGUID
はフィルター カテゴリの GUID であり、
FilterCLSID
はフィルターの CLSID です。 DMU の場合、形式は同じですが、 に変更
sw
しますdmo
。リストには、目的のメディアの種類を出力するすべてのフィルターの表示名が含まれるようになりましたが、推奨されるフィルターではありません。
SelectedFilter メソッドで、提案されたモニカーの DisplayName プロパティを取得し、格納されているリストに対してチェックします。 表示名がリスト内のエントリと一致する場合は、そのフィルターを拒否します。 それ以外の場合は、S_OKを返して受け入れます。
関連トピック