CoInitializeSecurity() 和媒体基础编码器之间的奇怪连接
Posted
技术标签:
【中文标题】CoInitializeSecurity() 和媒体基础编码器之间的奇怪连接【英文标题】:Weird connection between CoInitializeSecurity() and Media Foundation Encoders 【发布时间】:2019-12-17 06:28:04 【问题描述】:这个问题与this question有关。
获取此代码:
CoInitializeSecurity(0, -1, 0, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_ANONYMOUS, 0, EOAC_NONE, NULL);
UINT32 count = 0;
IMFActivate** ppActivate = NULL; // Array of activation objects.
MFTEnumEx(
MFT_CATEGORY_VIDEO_ENCODER,
MFT_ENUM_FLAG_ALL,
0, // Input type
0, // Output type
&ppActivate,
&count
);
CoTaskMemFree(ppActivate);
如果没有CoInitializeSecurity
,我的系统中的计数是 9。当使用 RPC_C_IMP_LEVEL_ANONYMOUS 调用 CoInitializeSecurity
时,某些编解码器不再可用。
问题是我需要将安全设置为匿名才能加载远程插件。有没有办法覆盖这种行为?
如果没有,有没有办法在尝试使用其中一个 MF 编码器时逆转 CoInitializeSecurity 的影响?
【问题讨论】:
您的MFStartup
相对于这些提到的 API 调用在哪里?
在应用启动时,在 CoInitializeSecurity() 之前
@MichaelChourdakis 无论是否调用CoInitializeSecurity
,它们都会导致“计数为7”。你能检查一下哪些编解码器不再可用CoInitializeSecurity
调用吗?
编解码器 HEVCVideoExtensionEncoder,MF_MT_SUBTYPE MFVideoFormat_HEVC。此编解码器不会出现在枚举列表中。基本上,它开始是因为我无法从媒体基金会生成 HEVC/H265 视频,当我取消对 CoInitializeSecurity 的调用时,它突然起作用了。
这与编解码器被打包为 Windows 应用商店应用这一事实有关。减少的 COM 权限显然会阻止枚举此类。
【参考方案1】:
MFTEnumEx 需要高于 ANONYMOUS 级别的令牌。此问题的解决方法是您可以为匿名创建另一个线程,并像往常一样在主线程中实现并使用默认级别。
有关此问题的详细信息,您也可以参考以下链接:
Media Foundation API primitive styling of WinRT windows.mediaCodec
【讨论】:
以上是关于CoInitializeSecurity() 和媒体基础编码器之间的奇怪连接的主要内容,如果未能解决你的问题,请参考以下文章