C#.NET DirectShow Lib:将自定义图表保存到文件中 [英] C#.NET DirectShow Lib: Saving custom graph to a file

查看:77
本文介绍了C#.NET DirectShow Lib:将自定义图表保存到文件中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,


我试图在C#.NET中借助  Directshow.net
Lib
。 lib基于Microsoft的C ++ directshow接口。

I am trying to create a custom (Directshow) filtergraph in C#.NET with the help of the Directshow.net Lib. The lib is based on Microsoft's C++ directshow interfaces.


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

Creating the graph works and I can add one or more filters to it. However, when trying to save the graph to a file, it writes some bytes, but the Graph editor (graphedt.exe) cannot open it.

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);
            }
        }




MyStreamWriter实现ComTypes.IStream的类:

MyStreamWriter class that implements ComTypes.IStream:


IPersistStream.Save()只在编写器上调用Seek()和Write()。

IPersistStream.Save() only calls Seek() and Write() on the 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);
    }
}







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

If I compare the contents of the file that I generated with one that I created manually in the editor, they do look different.


来自c#net的图表

Graph from c# net


使用编辑器制作的图表


directshow lib在IPersistStream中没有做任何奇怪的事情,只是让C ++接口可用......所以问题必须在其他地方。

The directshow lib doesn't do anything weird in IPersistStream, it just makes the C++ interface available... So the problem must be somewhere else.


非常感谢任何帮助。

Any help is really appreciated.

推荐答案

下载DirectShow.Net样本,在那里,样本/ Misc / Toolkit / FilterGraphTools.cs你会找到正在运行的SaveGraphFile。
Download DirectShow.Net Samples and there, in Samples/Misc/Toolkit/FilterGraphTools.cs you'll find SaveGraphFile that is working.


这篇关于C#.NET DirectShow Lib:将自定义图表保存到文件中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆