如何重置更改的网络摄像头分辨率(WMF)的拓扑

时间:2016-03-07 13:45:53

标签: windows video-capture ms-media-foundation

我已经设置了一个WMF会话(构建了一个IMFTopology对象,其源指向网络摄像头,标准EVR用于屏幕输出),将其分配给IMFMediaSession并开始预览。一切都很好。

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

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

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

“新”会话正确播放的唯一时间是我选择了原始源格式。然后继续好像没有发生任何不好的事情。

为什么?我该如何解决这个问题?

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

根据MS的文档,IMFMediaSession正在管理源的开始/停止,因此当我更改源的视频格式时,我依赖于它(否则应用程序将失败)。

1 个答案:

答案 0 :(得分:0)

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

如果没有,可能会有点复杂。