DirectShow停止/恢复直播

时间:2009-06-26 20:09:59

标签: c++ directshow

我正在使用DirectShow在我的应用程序中播放音频/视频文件。我使用IGraphBuilder::RenderFile()来构建过滤器图表,使用IMediaControl接口来播放/暂停/停止媒体。这适用于本地媒体文件,但会导致实时mms流出现问题。

如果我在直播中调用IMediaControl::Stop(),则流将按预期停止播放。但是,如果我调用IMediaControl::Run()来恢复流,则没有任何反应。该图表生成EC_COMPLETE事件,但视频不再播放。

调用IMediaControl::Pause()后跟IMediaControl::Run()将恢复其停止的流,但最终会停止。它似乎只是在调用IMediaControl::Pause()时回放缓冲区中的数据,而不是与实时流重新同步。

有人知道如何在不破坏和重建过滤器图形的情况下继续播放实时流吗?

2 个答案:

答案 0 :(得分:2)

  1. 你为什么叫Stop()?你应该拨打Pause()
  2. MMS的DirectShow过滤器已知有MMS问题,对于初学者而言,他们不支持最新的MMS 9(Win 2003附带)协议。如果您需要适当的MMS支持,则应使用Media Player Control或Format SDK。

答案 1 :(得分:2)

该行为表明图表中的某个过滤器出现了错误行为。如果您希望能够重新运行Feed,则必须更换过滤器。此外,没有好的源过滤器来呈现mms://流,这些流本身已作为协议过时。 Windows 7中的Windows Media Player正在使用其专用的DirectShow过滤器,该过滤器不适用于应用程序。您最终可能会使用基于Windows Media Format SDK或第三方替代品的自定义源过滤器。

更新:在Windows XP中,mms:// URL由Windows Media Splitter过滤器(wmpasf.dll)进行后备。它显然是对有问题的bug负责。因此,如果您仍然要使用它,您可能必须删除,重新添加过滤器的新实例并重新渲染其引脚以重新启动流式传输。正如我所提到的,这个过滤器在最近的Windows版本中已不再可用(至少是Windows 7)。