我目前正在设计一款带有Metro应用程序框架的应用程序,该框架包括实时视频聊天功能。我使用的是MediaCapture示例中包含的GrayscaleTransform MFT(此时只需从示例中复制和粘贴)。
然而,当我试图将灰度效果添加到相机的图像流中时,我会遇到一个"类未注册"的致命错误。我知道这是因为我必须"激活并注册"媒体扩展,但我不知道如何如何注册媒体扩展
非常感谢所有的帮助,我总是接受答案!
更新:我的灰度IDL文件如下所示:
import "Windows.Media.idl";
#include <sdkddkver.h>
namespace GrayscaleTransform
{
[version(NTDDI_WIN8), activatable(NTDDI_WIN8)]
runtimeclass GrayscaleEffect
{
[default] interface Windows.Media.IMediaExtension;
}
}
媒体扩展在包清单的扩展部分中被指定为<Extension>
(或扩展点),但您需要手动插入它(即,以代码形式打开appxmanifest,而不是双击。)
使用GrayscaleTransform示例,在媒体扩展示例中,打开MediaExtensions项目的包.appxmanifest(作为代码),并在<Extensions>
部分中查找:
<Extension Category="windows.activatableClass.inProcessServer">
<InProcessServer>
<Path>GrayscaleTransform.dll</Path>
<ActivatableClass ActivatableClassId="GrayscaleTransform.GrayscaleEffect" ThreadingModel="both" />
</InProcessServer>
</Extension>
在应用程序合同和扩展中有更多关于扩展的一般信息。
正如Chris Bowen在回答中所解释的,您的应用程序的AppXManifest缺少媒体扩展模块中可激活类所需的扩展元素。所有(非Windows提供的)可激活类都需要在AppXManifest中列出。将Extension节点添加到AppXManifest的解决方案本身就可以工作,这就是MediaExtensions示例应用程序所做的。
但是,您通常不需要手动编辑扩展名列表。如果添加对Windows运行时组件项目、松散的WinMD文件或扩展SDK的引用,则构建应自动为引用组件中的每个可激活类生成extension元素。
没有发生这种情况的原因是,媒体扩展在IDL中没有用[activable]属性进行注释,因此它们在生成的WinMD中没有用ActivatableAttribute进行属性化。您可以在其IDL定义中将类型声明为可激活的,而不是手动编辑AppXManifest。
例如,要更新GeometricSource.GeometricSchemeHandler
,可以将其在IDL中的定义从:更改为
[version(NTDDI_WIN8)]
runtimeclass GeometricSchemeHandler
{
}
至:
[version(NTDDI_WIN8), activatable(NTDDI_WIN8)]
runtimeclass GeometricSchemeHandler
{
[default] interface Windows.Media.IMediaExtension;
}
注意添加的activatable
属性和添加的[default]
接口。如果您对每个扩展进行这些更改并清理/重建,则不需要在AppXManifest中显式指定可激活类型:构建系统将自动添加它们。