我已经设置了一个WMF会话(构建了一个指向网络摄像头的源和一个用于屏幕输出的标准EVR的IMFTopology
对象),并将其指定给IMFMediaSession
并开始预览。一切都很好。如何为已更改的摄像头分辨率(WMF)重置拓扑结构
现在,我停止了会议(等待实际停止),更改源的分辨率(通过其IMFMediaTypeHandler
设置适当IMFMediaType
),然后建立与新源新拓扑和新创建IMFActivate
对象EVR。还要更改输出窗口的大小以匹配新的帧大小。
当我开始新的会话时,没有图像(或图像是乱码,或在底部切断 - 取决于分辨率的变化)。这几乎就好像新的拓扑结构试图重新使用先前设置的EVR并且它不能正常工作。
我试着在EVR上设置新媒体类型,试图强制EVR上的新窗口大小(通过调用SetWindowPos()
),试图通过之前分配的streamID
获得该输出节点并设置它的首选输入格式...没有任何工作 - 当我开始播放时,我得到相同的黑色(或乱码)图像。
“新”会话正确播放的唯一时间是当我选择回原始源格式。然后继续,好像没有什么不幸发生。
这是为什么?我该如何解决?
不提供源代码,因为没有简单的方法只提供相关部件。通常,我的代码严格遵循MSDN关于创建媒体会话以播放文件的文章。
根据MS的文档,IMFMediaSession
正在管理源的启动/停止,所以当我改变源的视频格式(否则应用程序失败)时,我依赖该源。
从媒体会话中获取拓扑并释放它是否足够?或者我需要保持拓扑指针,并在其上调用一个'Release()',希望它释放分配给媒体会话的指针? – YePhIcK
或者我用'NULL'拓扑和'MFSESSION_SETTOPOLOGY_CLEAR_CURRENT'标志复位媒体会话? – YePhIcK
是的,您可以使用MFSESSION_SETTOPOLOGY_CLEAR_CURRENT和NULL。您也可以释放媒体会话并重新创建它。这不是一项长期任务。 – mofo77