代码之家  ›  专栏  ›  技术社区  ›  flashk

DirectShow停止/恢复实时流

  •  1
  • flashk  · 技术社区  · 17 年前

    我正在使用DirectShow在应用程序中播放音频/视频文件。我用 IGraphBuilder::RenderFile() 构建过滤图和 IMediaControl 播放/暂停/停止媒体的界面。这对本地媒体文件很好,但会导致实时彩信流出现问题。

    如果我打电话 IMediaControl::Stop() 在实况流上,该流将按预期停止播放。但是,如果我打电话 IMediaControl::Run() 要恢复流,什么都不会发生。图形生成一个EC U完整事件,但视频不再播放。

    打电话 IMediaControl::Pause() 然后 IMediaControl::运行() 将恢复它停止的流,但最终将停止。它似乎只是回放缓冲区中的数据,当 IMediaControl::暂停() 而不是与实时流重新同步。

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   Roman Ryltsov    14 年前

    该行为表示图中的一个筛选器显示错误行为。如果要重新运行源,必须更换过滤器。另外,没有好的源过滤器来呈现mms://streams,而这些已经过时了。Windows 7中的Windows Media Player正在使用其专用DirectShow筛选器,但应用程序无法使用该筛选器。您最终可能会使用基于Windows Media Format SDK的自定义源筛选器,或者使用第三方替换。

    更新:在Windows XP中,mms://urls由 Windows Media Splitter 过滤器(wmpasf.dll)。显然,这是造成问题的原因。因此,如果仍要使用它,则可能需要删除、重新添加过滤器的新实例并重新呈现其管脚,以便重新启动流式处理。正如我所提到的,这个过滤器在更新版本的Windows(至少是Windows7)中不再可用。

        2
  •  2
  •   Shay Erlichmen    17 年前
    1. 为什么要调用stop()?您应该调用pause()。
    2. 据了解,用于彩信的DirectShow过滤器存在彩信问题,对于初学者来说,它们不支持最新的MMS9(Win2003附带)协议。如果需要对彩信的适当支持,则应使用Media Player控件或Format SDK。