在我对Media Foundation的研究中,我遇到了来自两个非常有名的消息来源的一些看似矛盾的建议。

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



然后从《开发Microsoft Media Foundation应用程序-Anton Polinger》第24页开始:



另外,我在GitHub上看到了许多使用COINIT_APARTMENTTHREADED的Media Foundation示例代码。

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

最佳答案

Media Foundation不会使用编码(marshal)处理(即,它们使用直接通信),并且其对象使用“两个”单元模型,并在运行时提供免费的线程编码(marshal)处理。

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

也就是说,将控制线程初始化为STA并没有错。它对Media Foundation API调用没有影响。该文档提出MTA初始化的唯一原因是,所有线程都被初始化为MTA,因此没有机会错误地混淆单元,这特别容易,因为API会在线程之间主动传递COM指针,而忽略标准COM单元规则。如果您知道自己不会受到此行为的影响,则STA初始化将非常适合您。您会发现许多Media Foundation示例,并且应用程序正在执行STA初始化。

关于windows - 在Media Foundation中使用COINIT_APARTMENTTHREADED还是COINIT_MULTITHREADED?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45334838/

10-13 05:54