如何重用不同文件的DirectShow过滤器图形

时间:2011-04-25 03:01:30

标签: c# directshow

我有一个应用程序使用filterGraph.RenderEx()创建directshow图形; 因为1it可能需要很长时间才能启动并运行图形,我想在应用程序的开头创建一些图形,然后通过更改源文件来重用它们。即

  1. 播放file1.wmv
  2. 等待文件完成
  3. 将图表更改为指向file2.wmv
  4. 播放file2
  5. 如何更改源文件,以便不必为下一个文件重新创建整个图形?

    编辑:::

    我不是想连续播放文件,而是重叠。这些图实际上是作为d3d应用程序的一部分呈现给texture2d对象。

    这是我正在做的事情。 我正在使用:

    添加sourceFilter
    IBaseFilter sourceFilter;
    int hr = filterGraph.AddSourceFilter(file, file, out sourceFilter);
    /* We will want to enum all the pins on the source filter */
    
    IEnumPins pinEnum;
    hr = sourceFilter.EnumPins(out pinEnum);
    DsError.ThrowExceptionForHR(hr);
    
    IntPtr fetched = IntPtr.Zero;
    IPin[] pins = { null };
    
    /* Counter for how many pins successfully rendered */
    int pinsRendered = 0;
    
    /* Loop over each pin of the source filter */
    while (pinEnum.Next(pins.Length, pins, fetched) == 0)
    {
         if (filterGraph.RenderEx(pins[0], AMRenderExFlags.None, IntPtr.Zero) >= 0)
             pinsRendered++;
    
         Marshal.ReleaseComObject(pins[0]);
    }
    Marshal.ReleaseComObject(pinEnum);
    

    当文件完成播放时,在将来的某个时刻,我想将源过滤器设置为另一个文件(相同类型),所以我不必完全重建图形,这可能非常创造缓慢。 有什么我可以将sourceFilter对象强制转换为允许我将其设置为另一个文件吗?

1 个答案:

答案 0 :(得分:1)

GMFBridge可用于此目的。 .NET AFAIK有端口。看看http://directshownet.sourceforge.net/about.html中提到的GMFPlay应用程序。

使用intelligent connect会降低图表构建过程的速度。使用直接连接也可以加快这个过程。