2014-12-03 36 views
1

我想在C#.NET中创建一个自定义(Directshow)过滤器图形,并使用Directshow.net Lib的帮助。该库基于微软的C++ directshow接口。C#.NET DirectShow Lib:将自定义图形保存到文件

创建图表可以工作,我可以添加一个或多个过滤器。但是,试图将图保存到文件时,它会写入一些字节,但Graph编辑器(graphedt.exe)无法打开它。

 DsDevice[] videoInputDevices = 
      DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); 

     IGraphBuilder graphBuilder = (IGraphBuilder) new FilterGraph(); 

     ICaptureGraphBuilder2 captureGraphBuilder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2(); 
     captureGraphBuilder.SetFiltergraph(graphBuilder); 

     object source; 
     videoInputDevices[0].Mon.BindToObject(
      null, 
      null, 
      typeof(IBaseFilter).GUID, 
      out source); 

     IBaseFilter filter = (IBaseFilter)source; 
     graphBuilder.AddFilter(filter, "Video Capture"); 

     try 
     { 
      int renderStreamComResult = captureGraphBuilder.RenderStream(
       PinCategory.Preview, 
       MediaType.Video, 
       filter, 
       null, 
       null); 

      MyStreamWriter r = new MyStreamWriter(); 
      IPersistStream p = (IPersistStream)graphBuilder; 

      p.Save(r, true); 

      // ugly, only temporary... 
      r.bWriter.Flush(); 
      r.bWriter.Close(); 
      // 


      //DsError.ThrowExceptionForHR(renderStreamComResult); 
     } 
     finally 
     { 
      if (filter != null) 
      { 
       Marshal.ReleaseComObject(filter); 
      } 

      if (graphBuilder != null) 
      { 
       Marshal.ReleaseComObject(graphBuilder); 
      } 

      if (captureGraphBuilder != null) 
      { 
       Marshal.ReleaseComObject(captureGraphBuilder); 
      } 
     } 

如果我将生成的文件的内容与我在编辑器中手动创建的文件的内容进行比较,它们看起来会有所不同。实现ComTypes.IStream

Graph from c# net

Graph made using the editor

MyStreamWriter类:)

IPersistStream.Save(只调用SEEK()和Write()上的StreamWriter。

public class MyStreamWriter : IStream 
{ 
    public BinaryWriter bWriter; 

    public MyStreamWriter() 
    { 
     this.bWriter = new BinaryWriter(
      File.OpenWrite("graph.grf"), 
      Encoding.UTF8); 
    } 

    public void Clone(out iop.ComTypes.IStream ppstm) 
    { 
     throw new NotImplementedException(); 
    } 

    public void Commit(int grfCommitFlags) 
    { 
     bWriter.Flush(); 
     throw new NotImplementedException(); 
    } 

    public void CopyTo(iop.ComTypes.IStream pstm, long cb, IntPtr pcbRead, IntPtr pcbWritten) 
    { 
     throw new NotImplementedException(); 
    } 

    public void LockRegion(long libOffset, long cb, int dwLockType) 
    { 
     throw new NotImplementedException(); 
    } 

    public void Read(byte[] pv, int cb, IntPtr pcbRead) 
    { 
     throw new NotImplementedException(); 
    } 

    public void Revert() 
    { 
     throw new NotImplementedException(); 
    } 

    public void Seek(long dlibMove, int dwOrigin, IntPtr plibNewPosition) 
    { 
     bWriter.Seek((int)dlibMove, (SeekOrigin)dwOrigin); 
    } 

    public void SetSize(long libNewSize) 
    { 
     throw new NotImplementedException(); 
    } 

    public void Stat(out iop.ComTypes.STATSTG pstatstg, int grfStatFlag) 
    { 
     throw new NotImplementedException(); 
    } 

    public void UnlockRegion(long libOffset, long cb, int dwLockType) 
    { 
     throw new NotImplementedException(); 
    } 

    public void Write(byte[] pv, int cb, IntPtr pcbWritten) 
    { 
     bWriter.Write(pv); 
    } 
} 

DirectShow的LIB不会做任何事情IPersistStream接口怪异,它只是使C++接口提供...所以这个问题必须在别处。

任何帮助真的很感激。

+0

文件不必匹配,字节到字节 – 2014-12-03 17:42:05

回答

3

我认为解决方案更简单 CSharp DirectShow lib允许您将图形保存在文件中。

此代码适用于我:

使用DirectShowLib.Utils;

FilterGraphTools.SaveGraphFile(this.m_TheGraphBuilder,FilePath);

+0

好吧,我没有DirectShowLib.Utils,但?我需要添加一个不同的DLL吗?目前,我有DirectShowLib-2005。 – Gonzalioz 2014-12-04 12:29:51

+0

我也使用DirectShowLib-2004,记得使用DirectShowLib.Utils包含 ;“ – arturn 2014-12-04 14:39:37

+1

好的。原来,你可以在你可以从directshow lib(http://sourceforge.net/projects/directshownet/files/)下载的其中一个示例中找到FilterGraphTools。这工作。 – Gonzalioz 2014-12-04 15:56:33

相关问题