注册 DMO
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
为了使客户端能够使用 DMO,必须在用户的系统上注册 CLSID。 这是通过 DLL 的 DllRegisterServer 函数完成的。 如果使用活动模板库 (ATL) ,ATL 向导将自动生成此函数。
还可以在一个或多个标准 DMO 类别下注册 DMO。 这使客户端可以使用 DMOEnum 函数发现 DMO 。 类别由 GUID 定义,并在 DMO GUID 部分列出。
在类别下注册 DMO 是可选的。 为此,请调用 DMORegister 函数并指定 DMO、CLSID 和类别的友好名称。 (可选)还可以注册一组 DSO 支持的媒体类型。 有关详细信息,请参阅 DMO 媒体类型。
以下示例演示如何注册支持 PCM 音频输入和输出的音频效果 DMO。 在这种情况下,输入类型和输出类型相同。
STDAPI DllRegisterServer(void)
{
// Register the DMO as a PCM audio effect DMO
DMO_PARTIAL_MEDIATYPE mt;
mt.type = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
HRESULT hr = DMORegister(
L"MyDMO", // Friendly name
CLSID_MyDMO, // CLSID
DMOCATEGORY_AUDIO_EFFECT, // Category
0, // Flags
1, // Number of input types
&mt, // Array of input types
1, // Number of output types
&mt); // Array of output types
if (FAILED(hr)) return hr;
// Registers the object, with no typelib.
return _Module.RegisterServer(FALSE);
}
此示例假定使用 ATL 创建项目;函数的最后一行调用标准 ATL 方法来注册 COM 服务器。 如果不使用 ATL,函数看起来会有所不同。
注销 DMO
DllUnregisterServer 函数必须删除 DllRegisterServer 函数创建的任何注册表项。 如果在注册 DMO 时调用 DMORegister,则注销 DMO 时必须具有同一类别的 DMOUnregister。
以下示例删除在上一示例中创建的注册表项:
STDAPI DllUnregisterServer(void)
{
DMOUnregister(CLSID_MyDMO, DMOCATEGORY_AUDIO_EFFECT);
return _Module.UnregisterServer(TRUE);
}
DirectShow 优点值
为了生成筛选器图,DirectShow 会向 D 莫分配默认优点值。 可以通过在 HKEY_CLASSES_ROOT\CLSID 中向 DMO 的注册表项添加注册表项来替代此值。 包括名为 Merit
的 DWORD 值,其值指定优点。
相关主题