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() 和媒体基础编码器之间的奇怪连接的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义身份调用 QueryInterface

在 DCOM 中设置远程启动

DCOM CoCreateInstanceEx E_ACCESSDENIED

WCF 服务中的模拟和传播到 COM 对象

Eclipse中快捷键Ctrl + Alt + 向上箭头 或者 Ctrl + Alt + 向下箭头与Windows冲突