Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Directshow-停止并关闭文件(但重用图形和一些过滤器)_C#_Video_Com_Directshow_Directshow.net - Fatal编程技术网

C# Directshow-停止并关闭文件(但重用图形和一些过滤器)

C# Directshow-停止并关闭文件(但重用图形和一些过滤器),c#,video,com,directshow,directshow.net,C#,Video,Com,Directshow,Directshow.net,我正在构建一个多流视频播放器。我当前在尝试关闭文件时遇到问题。实际上,我可以在任何时候播放1到4个视频文件。当我播放4个文件时,下一个序列只有一个,在删除源文件过滤器后,我似乎无法正确地重新绘制视频面板 我必须说,我正在手动构建和管理图形(以获得一些额外的速度),包括连接所有过滤器/渲染器等。我已经查看了GMFBridge,但最终我遇到了保持渲染图形和文件图形始终同步的问题(如快速播放问题(由于时间编码而赶上)并且必须同时在渲染图和文件图上运行/暂停/停止/步进mediacontrol(有时播放

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

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

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

因此,过程是:

  • 构建图
  • 添加渲染器
  • 尝试播放文件-根据文件类型,添加源过滤器和解复用器/解码器等(删除任何过时的过滤器)
  • 将过滤器连接在一起(手动连接管脚)
  • 寻找/玩等
  • 完成后,通过调用Graph.RemoveFilter()卸载当前源文件,但将渲染器留在图形中并断开所有管脚
  • 我遇到了以下错误:

    • 关闭文件(并调用VMR.repainvideo()时COM+异常
    编辑:错误如下:

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

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

    有没有办法在不处理filtergraph的情况下卸载文件,并重新绘制/清除视频窗口?就这点而言,当图形中没有源文件过滤器时,有没有办法重新绘制视频

  • 我认为如果你停止图形,甚至断开引脚连接,你不会有任何显著的速度提升
  • 错误并非真正的COM+,代码重叠,此错误具有不同的含义(代码到底是什么?)
  • 消除所有瑕疵、顺利交换文件并使之快速的唯一方法是将管道分割为多个部分,并在过滤器图形中使用视频渲染器,而您永远不会停止和断开连接。这将使您回到桥接,或者相反,回到上游文件图和下游表示图之间的同步流的类似技术


    UPD。错误为
    0x8004020C
    VFW\u E\u BUFFER\u NOTSET“未设置缓冲区空间”。用于解码代码,此工具在命中重叠代码块时对DirectShow代码具有特别的优先级。

    感谢Roman,添加了错误代码。你是建议回到GMFBridge吗?这是一个选项,我想我们已经看到手动连接引脚的速度有了合理的提高,如果我们使用intelligent connectYes,手动速度大约为180毫秒到500毫秒。特别是当安装了大量过滤器并且它首先尝试时,它将永远不会使用这些过滤器。您可以查看它加载和卸载的DLL的尝试。您确实可以在这里进行改进,但如果您想做得更好,就必须拆分图。视频渲染器初始化和pin连接本身会增加延迟。我在上面添加了错误代码描述,它可能来自过滤器经过某种转换状态(停止等)。感谢Roman,非常有用。你有过使用GMFBridge的经验吗?特别是保持源图形和渲染器图形同步?如果我想要当前文件时间,我必须在文件上使用IMediseek,而不是在渲染图上,对吗?有没有一种方法可以运行渲染图,并简单地暂停/停止/查找文件图?我从来没有准确地使用过GMFBridge,因此我无法准确地指导您。它可能实现了
    imediseek
    ,这样您就可以使用(第二个)graph的
    imediseek
    /
    imediposition
    ,而不用考虑太多内部路由到哪里。当然,你最终将不得不注意计时和时钟。您也可以使用第一个图形的
    imediseek
    /
    imediposition