2016-03-07 31 views
0

我已经设置了一个WMF会话(构建了一个指向网络摄像头的源和一个用于屏幕输出的标准EVR的IMFTopology对象),并将其指定给IMFMediaSession并开始预览。一切都很好。如何为已更改的摄像头分辨率(WMF)重置拓扑结构

现在,我停止了会议(等待实际停止),更改源的分辨率(通过其IMFMediaTypeHandler设置适当IMFMediaType),然后建立与新源新拓扑和新创建IMFActivate对象EVR。还要更改输出窗口的大小以匹配新的帧大小。

当我开始新的会话时,没有图像(或图像是乱码,或在底部切断 - 取决于分辨率的变化)。这几乎就好像新的拓扑结构试图重新使用先前设置的EVR并且它不能正常工作。

我试着在EVR上设置新媒体类型,试图强制EVR上的新窗口大小(通过调用SetWindowPos()),试图通过之前分配的streamID获得该输出节点并设置它的首选输入格式...没有任何工作 - 当我开始播放时,我得到相同的黑色(或乱码)图像。

“新”会话正确播放的唯一时间是当我选择回原始源格式。然后继续,好像没有什么不幸发生。

这是为什么?我该如何解决?

不提供源代码,因为没有简单的方法只提供相关部件。通常,我的代码严格遵循MSDN关于创建媒体会话以播放文件的文章。

根据MS的文档,IMFMediaSession正在管理源的启动/停止,所以当我改变源的视频格式(否则应用程序失败)时,我依赖该源。

回答

0

如果要构建真正的新拓扑,则需要释放所有MediaFoundation对象(源,汇,拓扑等)。

如果不是,它可能有点复杂。

+0

从媒体会话中获取拓扑并释放它是否足够?或者我需要保持拓扑指针,并在其上调用一个'Release()',希望它释放分配给媒体会话的指针? – YePhIcK

+0

或者我用'NULL'拓扑和'MFSESSION_SETTOPOLOGY_CLEAR_CURRENT'标志复位媒体会话? – YePhIcK

+0

是的,您可以使用MFSESSION_SETTOPOLOGY_CLEAR_CURRENT和NULL。您也可以释放媒体会话并重新创建它。这不是一项长期任务。 – mofo77