CoCreateInstance を使用したエンコーダーの作成
メディア ファイルを ASF 形式に変換する場合は、Windows Media エンコーダーを使用できます。 これらのエンコーダーを使用するには、システムに登録する必要があります。 エンコーダーは Media Foundation 変換 (MFT ) として実装され、IMFTransform インターフェイスを公開する必要があります。 このトピックでは、アプリケーションが必要な MFT エンコーダーの IMFTransform インターフェイスへのポインターを取得し、使用するためにインスタンス化する方法について説明します。
エンコーダーの登録の詳細については、「 エンコーダー MFT のインスタンス化」を参照してください。
エンコーダーの IMFTransform インターフェイスの使用
システムに Windows Media エンコーダーが正常に登録されると、アプリケーションは MFTEnum を呼び出すことによってエンコーダーを列挙できます。 適切なエンコーダーを検索するには、次を指定する必要があります。
カテゴリを表す GUID ( MFT_CATEGORY_AUDIO_ENCODER または MFT_CATEGORY_VIDEO_ENCODER)。
一致する形式。 これは、 エンコーダーがサンプル を生成するメディアの種類の主な型とサブタイプを指定するMFT_REGISTER_TYPE_INFO構造体で設定されます。 この構造体は 、pOutputType パラメーターで渡されます。 サポートされている種類の詳細については、「 メディアの種類の GUID」を参照してください。
注意
pInputType パラメーターの入力型情報は必要ありません。 これは、入力の種類がアプリケーションに認識されており、エンコーダーが入力ストリームが非圧縮形式であると想定しているためです。
MFTEnum は、検索条件に一致するエンコーダー MFT の IMFTransform ポインターの配列を返します。 COM 関数 CoCreateInstance を呼び出し、使用するエンコーダーの CLSID を渡すことで、エンコーダーをインスタンス化できます。 この関数は、エンコーダーを表す IMFTransform インターフェイスへのポインターを返します。 この関数呼び出しの詳細については、コンポーネント オブジェクト モデル (COM) の Windows SDK ドキュメントを参照してください。
エンコーダーの作成の例
次のコード例は、オーディオ エンコーダーまたはビデオ エンコーダーを作成する方法を示しています。
HRESULT FindEncoder(
const GUID& subtype,
BOOL bAudio,
IMFTransform **ppEncoder
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
CLSID *ppCLSIDs = NULL;
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnum(
bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
0, // Reserved
NULL, // Input type
&info, // Output type
NULL, // Reserved
&ppCLSIDs,
&count
);
if (SUCCEEDED(hr) && count == 0)
{
hr = MF_E_TOPO_CODEC_NOT_FOUND;
}
// Create the first encoder in the list.
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(ppCLSIDs[0], NULL,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(ppEncoder));
}
CoTaskMemFree(ppCLSIDs);
return hr;
}
関連トピック