在Media Foundation中使用COINIT_APARTMENTTHREADED或COINIT_MULTITHREADED?

时间:2017-07-26 18:29:30

标签: windows multithreading com video-streaming ms-media-foundation

在我对媒体基金会的研究中,我遇到了一些看似矛盾的建议来自两个非常有信誉的消息来源。

来自MSDN: Media Foundation和COM: https://msdn.microsoft.com/en-us/library/windows/desktop/ee892371(v=vs.85).aspx

  

在Media Foundation中,异步处理和回调由工作队列处理。工作队列始终具有多线程单元(MTA)线程,因此如果应用程序在MTA线程上运行,则它将具有更简单的实现。因此,建议使用 COINIT_MULTITHREADED 标志调用CoInitializeEx。

然后从“开发Microsoft Media Foundation应用程序 - 作者:Anton Polinger”一书第24页开始:

  

注意MF是一个自由线程系统,这意味着COM接口方法可以   从任意线程调用。因此,在调用CoInitializeEx()时,必须初始化   通过传入 COINIT_来COM与公寓线程对象的并发性   APARTMENTTHREADED 参数。您的对象可能还需要使用同步   原语,如锁,通过并发运行来控制对内部变量的访问   线程。

此外,我在GitHub中看到很多使用COINIT_APARTMENTTHREADED的Media Foundation示例代码。

我正在开发一个RTSP客户端,它使用Media Foundation将多个IP摄像头视频源流式传输到Windows显示器。我将在我的应用程序中使用多个线程,所以我认为在这个问题上获得明确的答案非常重要。有人可以解释这个矛盾,并就正确的方法提出建议吗?

1 个答案:

答案 0 :(得分:1)

Media Foundation不会使用编组(即,他们使用直接通信),并且其对象使用“Both”公寓模型,并在运行时使用免费的线程编组。

您可以自由选择公寓型号,MTA和STA都可以选择。然而,由Media Foundation启动的工作线程将始终初始化为MTA(特别是因为MF的设计不建议线程对齐,例如在工作队列上,并且在执行STA时没有任何意义;应用程序初始化的控制线程可以是STA )。

也就是说,将控制线程初始化为STA没有任何问题。它对Media Foundation API调用没有影响。文档建议MTA初始化的唯一原因是将所有线程初始化为MTA,没有机会错误地混淆公寓,这将特别容易,因为API在线程之间主动传递COM指针而忽略了标准的COM公寓规则。如果您了解自己不会受到此行为的影响,则STA初始化将很适合您。您已经找到了许多Media Foundation示例,并且应用程序正在进行STA初始化。