来自网络 URL 的 DirectShow RenderFile 存在严重缺陷。如何避免?

Posted

技术标签:

【中文标题】来自网络 URL 的 DirectShow RenderFile 存在严重缺陷。如何避免?【英文标题】:DirectShow RenderFile from Network URL has serious flaw. How to avoid it? 【发布时间】:2019-10-03 17:15:12 【问题描述】:

我使用 DirectShow IGraphBuilder::RenderFile 函数从网络 URL 播放音频流。是实时音频流。

应该是这样的,问题是断网时间过长,如果断网时间短,没问题,恢复网后会继续播放,但是断网时时间太长,比如几分钟或更长时间。恢复后不继续播放,图状态为正在播放。

如何避免这种情况?或者我怎样才能检测到音频已经停止? IMediaControl::GetState 返回状态,就像它正在播放一样。

【问题讨论】:

您可以在下游过滤器上设置一个计时器,它会定期检查上游过滤器是否仍然处于活动状态。参考this。 【参考方案1】:

要了解管道的哪一部分让您失望,您需要更好地了解您的过滤器图拓扑。具体来说,我猜你的源过滤器是第三方组件,它是上述问题的根源,但你还不知道它到底是什么。声称 IGraphBuilder::RenderFile 在处理网络断开连接方面做错了事,不太可能让您更接近解决方案。

您应该采取的下一个故障排除步骤是识别参与的过滤器并找出其流式传输和错误处理的详细信息。 Understanding Your DirectShow Filter Graph 继续解释如何获得图的拓扑结构以及它为何如此重要。

【讨论】:

不错的答案,但没有帮助。没有第三方组件。只是原始纯净的 Windows 10、Visual Studio 2019 和简单的代码(创建图形,在任何无线电流 URL 上调用 IGraphBuilder::RenderFile)。你可以自己测试一下,你会发现这个缺陷就在 directshow 本身。渲染网络文件,断开互联网连接几分钟,然后重新连接。 那么你怎么知道你没有第三方组件呢?我的帖子解释说,为了理解您的图表,您需要能够检查它。 RenderFile 特别是一种通常会避免的方法,因为它会在您期望的内容和实际运行的内容之间造成混淆。当您设法检查您的图表时,您还可以通过在此问题上附加一张图片(例如我的帖子中带有粉红色背景的图片)来共享拓扑。 另外,如果您有一个广播 URL,那么为什么不在问题中包含它呢?在互联网上提供音频有多种选择,更不用说编解码器了,相应的播放拓扑也各不相同。

以上是关于来自网络 URL 的 DirectShow RenderFile 存在严重缺陷。如何避免?的主要内容,如果未能解决你的问题,请参考以下文章

写入 Directshow 源过滤器

为啥 DirectShow 加载视频字幕文件?

以高分辨率从网络摄像头捕获图片,同时使用 DirectShow.Net 以较低的分辨率进行预览

Directshow 直播源过滤器设计

DirectShow Filter的开发实践

Vs2010搭建directshow 环境