我目前正在使用Metro应用程序框架设计一个应用程序,其中包含实时视频聊天功能。我正在使用MediaCapture样本中包含的GrayscaleTransform MFT(此时只需从样本中复制粘贴)。
然而,当我尝试将灰度效果添加到相机的图像流时,我得到一个“类未注册”的致命错误。我理解这是因为我必须“激活并注册”媒体扩展,但我不知道如何。 如何注册媒体扩展程序?
非常感谢所有帮助,我总是接受答案!
更新:我的GrayScale IDL文件如下所示:
import "Windows.Media.idl";
#include <sdkddkver.h>
namespace GrayscaleTransform
{
[version(NTDDI_WIN8), activatable(NTDDI_WIN8)]
runtimeclass GrayscaleEffect
{
[default] interface Windows.Media.IMediaExtension;
}
}
答案 0 :(得分:2)
媒体扩展在包清单的Extensions部分中被指定为<Extension>
(或扩展点),但您需要手动插入(即打开appxmanifest作为代码而不是双击。)
使用GrayscaleTransform示例,在Media extensions sample中,打开MediaExtensions项目的package.appxmanifest(作为代码),并在<Extensions>
部分中查找:
<Extension Category="windows.activatableClass.inProcessServer">
<InProcessServer>
<Path>GrayscaleTransform.dll</Path>
<ActivatableClass ActivatableClassId="GrayscaleTransform.GrayscaleEffect" ThreadingModel="both" />
</InProcessServer>
</Extension>
App contracts and extensions中有关于扩展程序的更多常规信息。
答案 1 :(得分:0)
正如Chris Bowen在his answer中解释的那样,您的应用程序的AppXManifest缺少媒体扩展模块中可激活类所需的Extension元素。所有(非Windows提供的)可激活类都需要在AppXManifest中列出。将Extension节点添加到AppXManifest的解决方案将起作用,这就是MediaExtensions示例应用程序似乎已经完成的工作。
但是,您通常不需要手动编辑扩展名列表。如果添加对Windows运行时组件项目,松散的WinMD文件或扩展SDK的引用,则构建应自动为引用的组件中的每个可激活类生成Extension元素。
没有发生这种情况的原因是媒体扩展没有使用IDL中的[activatable]属性进行注释,因此它们不会被生成的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中明确指定可激活类型:构建系统将自动添加它们。