Win10 Universal App 中的自定义媒体效果
Custom media effect in Win10 Universal App
我正在开发一个使用相机的通用 Windows 应用程序,我需要为相机创建自定义效果。该应用程序是用 C# 编写的,效果是一个使用媒体基础和 IDL 定义自定义 WinRT 组件的 C++ DLL。
我已经在 Windows 8.1 上成功执行了几次,并记录了以下技巧 here, or here。
我现在想在 Windows 10 UWP 上移植它。我知道 Windows 10 上存在一个已知问题,它会导致编译器失败并显示错误 "Failed to load a dependency file. Windows.winmd"(请参阅 here)。但即使有了这个修复,我也无法成功构建组件。
这是 IDL:
import "Windows.Media.idl";
#include <sdkddkver.h>
namespace MyEffect
{
[version(NTDDI_WIN10), activatable(NTDDI_WIN10)]
runtimeclass MyEffect
{
[default] interface Windows.Media.IMediaExtension;
}
}
MIDL 命令行(经过格式化以提高可读性):
/env win32 /h "MyEffect_h.h" /W1 /char signed /enum_class
/tlb "$(OutDir)\MyEffect.tlb" /ns_prefix
/metadata_dir "$(WindowsSDK_MetadataFoundationPath)"
/nologo /winrt
/winmd "$(OutDir)\MyEffect.winmd"
此命令成功。然后我添加以下自定义构建步骤:
mdmerge -metadata_dir “<metadata_dir>”
-i “$(OutDir).”
-o “$(OutDir)merged”
-partial
-v
并且根据以下内容,此命令总是失败并出现不同的错误:
如果我输入 $(WindowsSDK_MetadataFoundationPath)
,它解析为 c:\Program Files (x86)\Windows Kits\References\windows.foundation.foundationcontract.0.0.0
,或 $(WindowsSDK_MetadataPath)
,它解析为 c:\Program Files (x86)\Windows Kits\References
它 returns 错误:
MDMERGE : error MDM2002: The type "Windows.Media.IMediaExtension" defined in file <...>\MyEffect.winmd was referenced by type MyEffect.MyEffect but could not be found.
如果我输入 $(TargetPlatformSdkMetadataLocation)
,解析为 c:\Program Files (x86)\Windows Kits\References\CommonConfiguration\Neutral
,它 returns 错误:
MDMERGE : error MDM2012: Error 3 has occured while enumerating files in C:\Program Files (x86)\Windows Kits\References\CommonConfiguration\Neutral\*.winmd.
有人知道如何为 UWP 编译自定义 Windows 媒体效果吗?
将 -metadata_dir
设置为 "C:\Program Files (x86)\Windows Kits\UnionMetadata" 对我有用。
我正在开发一个使用相机的通用 Windows 应用程序,我需要为相机创建自定义效果。该应用程序是用 C# 编写的,效果是一个使用媒体基础和 IDL 定义自定义 WinRT 组件的 C++ DLL。
我已经在 Windows 8.1 上成功执行了几次,并记录了以下技巧 here, or here。
我现在想在 Windows 10 UWP 上移植它。我知道 Windows 10 上存在一个已知问题,它会导致编译器失败并显示错误 "Failed to load a dependency file. Windows.winmd"(请参阅 here)。但即使有了这个修复,我也无法成功构建组件。
这是 IDL:
import "Windows.Media.idl";
#include <sdkddkver.h>
namespace MyEffect
{
[version(NTDDI_WIN10), activatable(NTDDI_WIN10)]
runtimeclass MyEffect
{
[default] interface Windows.Media.IMediaExtension;
}
}
MIDL 命令行(经过格式化以提高可读性):
/env win32 /h "MyEffect_h.h" /W1 /char signed /enum_class
/tlb "$(OutDir)\MyEffect.tlb" /ns_prefix
/metadata_dir "$(WindowsSDK_MetadataFoundationPath)"
/nologo /winrt
/winmd "$(OutDir)\MyEffect.winmd"
此命令成功。然后我添加以下自定义构建步骤:
mdmerge -metadata_dir “<metadata_dir>”
-i “$(OutDir).”
-o “$(OutDir)merged”
-partial
-v
并且根据以下内容,此命令总是失败并出现不同的错误:
如果我输入 $(WindowsSDK_MetadataFoundationPath)
,它解析为 c:\Program Files (x86)\Windows Kits\References\windows.foundation.foundationcontract.0.0.0
,或 $(WindowsSDK_MetadataPath)
,它解析为 c:\Program Files (x86)\Windows Kits\References
它 returns 错误:
MDMERGE : error MDM2002: The type "Windows.Media.IMediaExtension" defined in file <...>\MyEffect.winmd was referenced by type MyEffect.MyEffect but could not be found.
如果我输入 $(TargetPlatformSdkMetadataLocation)
,解析为 c:\Program Files (x86)\Windows Kits\References\CommonConfiguration\Neutral
,它 returns 错误:
MDMERGE : error MDM2012: Error 3 has occured while enumerating files in C:\Program Files (x86)\Windows Kits\References\CommonConfiguration\Neutral\*.winmd.
有人知道如何为 UWP 编译自定义 Windows 媒体效果吗?
将 -metadata_dir
设置为 "C:\Program Files (x86)\Windows Kits\UnionMetadata" 对我有用。