我正在构建一个多流视频播放器。我目前在尝试关闭文件时遇到问题。实际上,我可能随时播放 1 到 4 个视频文件。当我播放 4 个文件时,下一个序列只有一个,删除源文件过滤器后,我似乎无法正确重绘视频面板。
我必须说我正在手动构建和管理图形(以获得额外的速度),包括连接所有过滤器/渲染器等。我研究了 GMFBridge,但最终我遇到了保持渲染图和文件图同步的问题时间(诸如快速播放(由于时间编码而赶上)和必须同时在渲染图和文件图上运行/暂停/停止/步进媒体控件(有时播放失败)等问题)。需要从内存中正确配置渲染图,并且我的场景与提供的示例不完全吻合(需要无缝播放,但仍需要对每个文件进行单独的时间编码 - 未合并到一个大文件中)。
我在应用程序的整个生命周期中重复使用 IFilterGraph2/VMR/DirectSound 对象。唯一改变的是 SourceFilter 和必要的解码器/解复用器。
所以过程是:
- 构建图
- 添加渲染器
- 尝试播放文件 - 根据文件类型,添加源过滤器和解复用器/解码器等(删除任何过时的过滤器)
- 将过滤器连接在一起(手动连接引脚)
- 寻找/播放等
- 完成后,通过调用 Graph.RemoveFilter() 卸载当前源文件,但将渲染器留在图中并断开所有引脚。
我遇到了以下错误:
- 关闭文件时的 COM+ 异常(并调用 VMR.RepaintVideo())
编辑:错误是这样的:
此操作需要 COM+,但未安装(HRESULT 异常:0x8004020C)
将渲染器添加到图形时,我确实调用了 VMR.SetVideoClippingWindow() 一次。
有没有办法卸载文件,而不处理过滤器图,并重新绘制/清除视频窗口?就此而言,当图中没有源文件过滤器时,有没有办法重新绘制视频?