2

我目前正在使用 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;
}
}
4

2 回答 2

2

<Extension>媒体扩展在包清单的Extensions部分中指定为(或扩展点) ,但您需要手动插入(即打开 appxmanifest 作为代码而不是双击。)

使用 GrayscaleTransform 示例,在媒体扩展示例中,打开 MediaExtensions 项目的 package.appxmanifest(作为代码)并在以下<Extensions>部分中查找:

<Extension Category="windows.activatableClass.inProcessServer">
    <InProcessServer>
        <Path>GrayscaleTransform.dll</Path>
        <ActivatableClass ActivatableClassId="GrayscaleTransform.GrayscaleEffect" ThreadingModel="both" />
    </InProcessServer>
</Extension>

在App contracts 和 extensions中有更多关于扩展的一般信息。

于 2012-07-31T00:49:59.190 回答
0

正如 Chris Bowen 在他的回答中解释的那样,您的应用程序的 AppXManifest 缺少媒体扩展模块中可激活类所需的扩展元素。所有(非 Windows 提供的)可激活类都需要在 AppXManifest 中列出。自己将扩展节点添加到 AppXManifest 的解决方案将起作用,这就是 MediaExtensions 示例应用程序似乎已经完成的工作。

但是,您通常不需要手动编辑扩展列表。如果添加对 Windows 运行时组件项目、松散 WinMD 文件或扩展 SDK 的引用,则生成应自动为引用组件中的每个可激活类生成扩展元素。

没有发生这种情况的原因是媒体扩展没有使用 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 中显式指定可激活类型:构建系统将自动添加它们。

于 2012-07-31T01:48:39.320 回答