【问题标题】:Directshow - Stop and close a file (but reuse graph and some filters)Directshow - 停止和关闭文件(但重用图形和一些过滤器)
【发布时间】:2013-10-15 07:04:55
【问题描述】:

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

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

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

所以流程是:

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

我遇到了以下错误:

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

编辑:错误是这样的:

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

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

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

【问题讨论】:

    标签: c# video com directshow directshow.net


    【解决方案1】:
    1. 我认为如果您停止图表甚至断开引脚,您不会有任何显着的速度提升
    2. 错误不是真正的COM+,代码重叠,这个错误有不同的含义(代码到底是什么?)

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

    UPD。错误为0x8004020CVFW_E_BUFFER_NOTSET“未设置缓冲区空间。”,使用ShowHresult解码代码,此工具在遇到重叠代码块时优先于DirectShow代码。

    【讨论】:

    • 感谢 Roman,添加了错误代码。你建议回到 GMFBridge 吗?我猜这是一个选项
    • 我们已经看到手动连接引脚的速度得到了合理的提高,如果我们使用智能连接,手动连接大约需要 180 毫秒到 500 毫秒
    • 是的,您可以通过智能连接赢得时间,尤其是。当安装了很多过滤器并且它首先尝试那些它永远不会进一步使用的过滤器时。您可以观看它尝试查看它加载和卸载的 DLL。您确实可以在这里改进一些东西,但是如果您想做得更好,则必须拆分图表。视频渲染器初始化和引脚连接单独增加了延迟。我在上面添加了错误代码描述,它可能来自过滤器正在经历一些过渡状态(停止等)。
    • 谢谢罗马,有帮助。您有使用 GMFBridge 的经验吗?特别是保持源图和渲染器图同步?如果我想要当前文件时间,我必须在文件上使用 IMediaSeeking 而不是渲染图,对吗?有没有办法可以运行渲染图,只需暂停/停止/查找文件图?
    • 我从来没有完全使用过 GMFBridge,所以我不能在这里准确地指导你。它可能实现了IMediaSeeking,以便您可以使用(第二个)图形的IMediaSeeking/IMediaPosition,而无需过多考虑它内部路由的位置。当然,您最终将不得不处理时间和时钟。您也可以使用第一张图的IMediaSeeking/IMediaPosition
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多