0

我正在构建一个多流视频播放器。我目前在尝试关闭文件时遇到问题。实际上,我可能随时播放 1 到 4 个视频文件。当我播放 4 个文件时,下一个序列只有一个,删除源文件过滤器后,我似乎无法正确重绘视频面板。

我必须说我正在手动构建和管理图形(以获得额外的速度),包括连接所有过滤器/渲染器等。我研究了 GMFBridge,但最终我遇到了保持渲染图和文件图同步的问题时间(诸如快速播放(由于时间编码而赶上)和必须同时在渲染图和文件图上运行/暂停/停止/步进媒体控件(有时播放失败)等问题)。需要从内存中正确配置渲染图,并且我的场景与提供的示例不完全吻合(需要无缝播放,但仍需要对每个文件进行单独的时间编码 - 未合并到一个大文件中)。

我在应用程序的整个生命周期中重复使用 IFilterGraph2/VMR/DirectSound 对象。唯一改变的是 SourceFilter 和必要的解码器/解复用器。

所以过程是:

  1. 构建图
  2. 添加渲染器
  3. 尝试播放文件 - 根据文件类型,添加源过滤器和解复用器/解码器等(删除任何过时的过滤器)
  4. 将过滤器连接在一起(手动连接引脚)
  5. 寻找/播放等
  6. 完成后,通过调用 Graph.RemoveFilter() 卸载当前源文件,但将渲染器留在图中并断开所有引脚。

我遇到了以下错误:

  • 关闭文件时的 COM+ 异常(并调用 VMR.RepaintVideo())

编辑:错误是这样的:

此操作需要 COM+,但未安装(HRESULT 异常:0x8004020C)

将渲染器添加到图形时,我确实调用了 VMR.SetVideoClippingWindow() 一次。

有没有办法卸载文件,而不处理过滤器图,并重新绘制/清除视频窗口?就此而言,当图中没有源文件过滤器时,有没有办法重新绘制视频?

4

1 回答 1

1
  1. 如果您停止图表甚至断开引脚,我认为您不会有任何显着的速度增益
  2. 该错误不是真正的 COM+,代码重叠并且此错误具有不同的含义(代码到底是什么?)

消除所有伪像并平滑交换文件并使其快速的唯一方法是将管道拆分为多个部分,并在过滤器图中使用视频渲染器,您永远不会停止和断开连接。这将带您回到桥接,或者转而使用上游文件图和下游表示图之间的类似同步流技术。

UPD。错误是0x8004020C VFW_E_BUFFER_NOTSET“未设置缓冲区空间。”,使用ShowHresult解码代码,此工具在遇到重叠代码块时具有 DirectShow 代码的特别优先级。

于 2013-10-15T07:16:24.707 回答