【问题标题】:AccessViolationException when trying to connect filters尝试连接过滤器时出现 AccessViolationException
【发布时间】:2014-05-08 10:37:12
【问题描述】:

我正在尝试在 C# 代码中实现过滤器图。 该过滤器在 graphstudionext 中完全正常并且可以正常工作,但是当尝试连接最后两个过滤器(mpeg-mux 过滤器和文件写入器过滤器)时,我得到了一个 AccessViolationException。

访问冲突错误的原因可能是什么?通常什么时候发生。你怎么知道如何解决它?会不会出错的原因不是我的代码而是过滤器?

Mpeg-4 Multiplexor 和 Filewriter 之间发生链接错误 这是我的代码:(错误发生在底部)

  private void init()
        {
            m_filterGraph = new FilterGraph() as IFilterGraph2;
            mediaControl = (IMediaControl)m_filterGraph;
            mediaEvent = (IMediaEvent)m_filterGraph;


            int hr;
            DsDevice[] audiDevices;

            audiDevices = DsDevice.GetDevicesOfCat(FilterCategory.AudioInputDevice);
            List<IPin> audioOutputs = new List<IPin>();

            DsDevice[] capDevices;

            // Get the collection of video devices
            capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);

            if (capDevices.Count() < 2)
            {
                throw new Exception("Not enough video input devices found");
            }
            ISampleGrabber sampGrabber = null;
            IBaseFilter baseGrabFlt = null;
            List<IBaseFilter> capFilter = new List<IBaseFilter>();
            IBaseFilter muxFilter = null;
            IFileSinkFilter fileWriterFilter = null;
            ICaptureGraphBuilder2 capGraph = null;

            try
            {
                capGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
                hr = capGraph.SetFiltergraph(m_filterGraph);
                DsError.ThrowExceptionForHR(hr);
                for (int i = 0; i < Math.Min(capDevices.Count(), 2); i++)
                {
                    IBaseFilter _capFIlter;
                    hr = m_filterGraph.AddSourceFilterForMoniker(capDevices[i].Mon, null, capDevices[i].Name, out _capFIlter);

                    DsError.ThrowExceptionForHR(hr);
                    capFilter.Add(_capFIlter);
                }


                DsError.ThrowExceptionForHR(hr);

                for (int i = 0; i < Math.Min(audiDevices.Length, 1); i++)
                {
                    IBaseFilter _audioFilter;
                    hr = m_filterGraph.AddSourceFilterForMoniker(audiDevices[i].Mon, null, audiDevices[i].Name,
                        out _audioFilter);
                    IPin audiooutpin = FindPinByDirection(_audioFilter, PinDirection.Output);
                    audioOutputs.Add(audiooutpin);
                }

                //MJPEG Decompressor
                IBaseFilter mjpeg_dec0 = null;
                IBaseFilter mjpeg_dec1 = null;
                Guid mjpegguid = Guid.Parse("301056D0-6DFF-11D2-9EEB-006008039E37");
                Type t1 = Type.GetTypeFromCLSID(mjpegguid);
                mjpeg_dec0 = (IBaseFilter) Activator.CreateInstance(t1);
                mjpeg_dec1 = (IBaseFilter) Activator.CreateInstance(t1);
                hr = m_filterGraph.AddFilter(mjpeg_dec0, "MJPEG0");
                hr = m_filterGraph.AddFilter(mjpeg_dec1, "MJPEG1");
                IPin cam1out;
                IPin cam2out;

                IPin pinmjpegIn = FindPinByDirection(mjpeg_dec0, PinDirection.Input);
                IPin pinjmpegIn1 = FindPinByDirection(mjpeg_dec1, PinDirection.Input);

                if (capFilter.Count < 1 || capFilter[0] == null)
                {
                    throw new Exception("No input devices found!");
                }
                IPin cam0Out = FindPinByDirection(capFilter[0], PinDirection.Output);
                m_filterGraph.Connect(cam0Out, pinmjpegIn);

                if (capFilter.Count >= 1 && capFilter[1] != null)
                {
                    cam1out = FindPinByDirection(capFilter[1], PinDirection.Output);
                    m_filterGraph.Connect(cam1out, pinjmpegIn1);
                }


                //MyFilter
                IPin mjpegOut = FindPinByDirection(mjpeg_dec0, PinDirection.Output);
                IPin mjpegout1 = FindPinByDirection(mjpeg_dec1, PinDirection.Output);





                IBaseFilter myfitlter = null;


                Guid myfilterGuid = Guid.Parse("067216DE-E6A1-49C9-A016-074624C20FE5");
                Type t = Type.GetTypeFromCLSID(myfilterGuid);
                myfitlter = (IBaseFilter)Activator.CreateInstance(t);

                var imyfilter = (IMyFilter)myfitlter;

                //int result = imyfilter.SetIntervalText("THis is intervall test");
                //int result2 = imyfilter.SetIntroText("This is intro text test");

                hr = m_filterGraph.AddFilter(myfitlter, "MyFilter");
                DsError.ThrowExceptionForHR(hr);
                IPin mypin0;
                hr = myfitlter.FindPin("PIN0", out mypin0);
                DsError.ThrowExceptionForHR(hr);
                IPin mypin1;
                hr = myfitlter.FindPin("PIN1", out mypin1);
                DsError.ThrowExceptionForHR(hr);
                IPin mypinin2;

                IPin mypinout;
                hr = myfitlter.FindPin("PINOUT0", out mypinout);

                hr = m_filterGraph.Connect(mjpegOut, mypin0);
                DsError.ThrowExceptionForHR(hr);
                hr = m_filterGraph.Connect(mjpegout1, mypin1);
                DsError.ThrowExceptionForHR(hr);



                //Color space convertor

                IBaseFilter colorSpance = null;
                Guid csGUID = Guid.Parse("1643E180-90F5-11CE-97D5-00AA0055595A");
                Type t2 = Type.GetTypeFromCLSID(csGUID);
                colorSpance = (IBaseFilter)Activator.CreateInstance(t2);
                hr = m_filterGraph.AddFilter(colorSpance, "ColorSpaceConvertor");
                IPin csIn = FindPinByDirection(colorSpance, PinDirection.Input);
                IPin csOut = FindPinByDirection(colorSpance, PinDirection.Output);

                hr = m_filterGraph.Connect(mypinout, csIn);
                DsError.ThrowExceptionForHR(hr);



                IBaseFilter ffdshowfilter = null;
                Guid ffdshowguid = Guid.Parse("4DB2B5D9-4556-4340-B189-AD20110D953F");
                Type ffdshowtype = Type.GetTypeFromCLSID(ffdshowguid);
                ffdshowfilter = (IBaseFilter)Activator.CreateInstance(ffdshowtype);
                m_filterGraph.AddFilter(ffdshowfilter, "FFD");
                IPin pinffdin = FindPinByDirection(ffdshowfilter, PinDirection.Input);
                IPin pinffdout = FindPinByDirection(ffdshowfilter, PinDirection.Output);
                hr = m_filterGraph.Connect(csOut, pinffdin);
                DsError.ThrowExceptionForHR(hr);


                IBaseFilter mpegmuxfilter = null;
                Guid mpegmux = Guid.Parse("5FD85181-E542-4E52-8D9D-5D613C30131B");
                Type mpegmuxType = Type.GetTypeFromCLSID(mpegmux);
                mpegmuxfilter = (IBaseFilter)Activator.CreateInstance(mpegmuxType);
                hr = m_filterGraph.AddFilter(mpegmuxfilter, "MpegMux");

                DsError.ThrowExceptionForHR(hr);
                IPin mpegIn = FindPinByDirection(mpegmuxfilter, PinDirection.Input);

                hr = m_filterGraph.Connect(pinffdout, mpegIn);
                IPin mpegOut = FindPinByDirection(mpegmuxfilter, PinDirection.Output);

                DsError.ThrowExceptionForHR(hr);


                m_filterGraph.Connect(pinffdout, mpegIn);

                IBaseFilter filewriter = null;
                filewriter = new FileWriter() as IBaseFilter;

               filesinkFilter= (IFileSinkFilter)filewriter;

                hr = m_filterGraph.AddFilter(filewriter, "FileWriter");
                DsError.ThrowExceptionForHR(hr);
                IPin fileIn = FindPinByDirection(filewriter, PinDirection.Input);
                m_filterGraph.Connect(mpegOut, fileIn); //Here an access violation exception is triggered
                foreach (IPin pin in audioOutputs)
                {
                    IPin muxInPin = FindPinByDirection(mpegmuxfilter, PinDirection.Input);
                    m_filterGraph.Connect(pin, muxInPin);
                }

             }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
        }

这里又是触发异常的那一行:

 m_filterGraph.Connect(mpegOut, fileIn); //Here an access violation exception is triggered

如果有任何帮助、建议或信息,我将不胜感激,谢谢。

调用堆栈没有显示太多有用的信息。有一个本地转换,我无法在 Visual Studio 中看到调用了哪些函数,也无法使用调试器进入该方法。

[托管到原生转换]

YourControlService.dll!YourControlService.YourControlRecorder.init() 第 207 行 C#

YourControlService.dll!YourControlService.YourControlRecorder.startRecording(字符串 文件名 = "D:\TEMP\test_2014_5_31.avi") 第 229 行 C#

YourControlService.dll!YourControlService.Service.StartRecording(字符串 name = "test", string text = "text") 第 79 行 C# [轻量级 功能]

System.ServiceModel.dll!System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象 实例,object[] 输入,out object[] 输出)未知 System.ServiceModel.dll!System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(参考 System.ServiceModel.Dispatcher.MessageRpc rpc = {System.ServiceModel.Dispatcher.MessageRpc}) 未知

System.ServiceModel.dll!System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(参考 System.ServiceModel.Dispatcher.MessageRpc rpc = {System.ServiceModel.Dispatcher.MessageRpc}) 未知

System.ServiceModel.dll!System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(参考 System.ServiceModel.Dispatcher.MessageRpc rpc) 未知

System.ServiceModel.dll!System.ServiceModel.Dispatcher.MessageRpc.Process(bool isOperationContextSet = false) 未知

System.ServiceModel.dll!System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(System.ServiceModel.Channels.RequestContext 请求 = {System.ServiceModel.Channels.HttpRequestContext.ListenerHttpContext}, bool cleanThread, System.ServiceModel.OperationContext currentOperationContext) 未知

System.ServiceModel.dll!System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(System.ServiceModel.Channels.RequestContext 请求,System.ServiceModel.OperationContext currentOperationContext) 未知

System.ServiceModel.dll!System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(System.IAsyncResult 结果)未知

System.ServiceModel.Internals.dll!System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(System.IAsyncResult 结果)未知

System.ServiceModel.Internals.dll!System.Runtime.AsyncResult.Complete(bool 同步完成)未知

System.ServiceModel.Internals.dll!System.Runtime.InputQueue.AsyncQueueReader.Set(System.Runtime.InputQueue.Item 项目)未知

System.ServiceModel.Internals.dll!System.Runtime.InputQueue.EnqueueAndDispatch(System.Runtime.InputQueue.Item 项目 = {System.Runtime.InputQueue.Item}, bool canDispatchOnThisThread) 未知

System.ServiceModel.Internals.dll!System.Runtime.InputQueue.EnqueueAndDispatch(System.ServiceModel.Channels.RequestContext 项目,System.Action dequeuedCallback,布尔 canDispatchOnThisThread) 未知

System.ServiceModel.dll!System.ServiceModel.Channels.SingletonChannelAcceptor.Enqueue(System.ServiceModel.Channels.RequestContext 项目,System.Action dequeuedCallback,布尔 canDispatchOnThisThread) 未知

System.ServiceModel.dll!System.ServiceModel.Channels.HttpPipeline.EnqueueMessageAsyncResult.CompleteParseAndEnqueue(System.IAsyncResult 结果)未知

System.ServiceModel.dll!System.ServiceModel.Channels.HttpPipeline.EnqueueMessageAsyncResult.HandleParseIncomingMessage(System.IAsyncResult 结果)未知

System.ServiceModel.Internals.dll!System.Runtime.AsyncResult.SyncContinue(System.IAsyncResult 结果)未知

System.ServiceModel.dll!System.ServiceModel.Channels.HttpPipeline.EmptyHttpPipeline.BeginProcessInboundRequest(System.ServiceModel.Channels.ReplyChannelAcceptor replyChannelAcceptor, System.Action dequeuedCallback, System.AsyncCallback 回调,对象状态)未知

System.ServiceModel.dll!System.ServiceModel.Channels.HttpChannelListener.HttpContextReceivedAsyncResult.ProcessHttpContextAsync() 未知

System.ServiceModel.dll!System.ServiceModel.Channels.HttpChannelListener.BeginHttpContextReceived(System.ServiceModel.Channels.HttpRequestContext 上下文,System.Action acceptorCallback,System.AsyncCallback 回调,对象状态)未知

System.ServiceModel.dll!System.ServiceModel.Channels.SharedHttpTransportManager.EnqueueContext(System.IAsyncResult listenerContextResult) 未知

System.ServiceModel.dll!System.ServiceModel.Channels.SharedHttpTransportManager.OnGetContextCore(System.IAsyncResult listenerContextResult = {System.Net.ListenerAsyncResult}) 未知

System.ServiceModel.Internals.dll!System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(System.IAsyncResult 结果)未知

System.dll!System.Net.LazyAsyncResult.Complete(System.IntPtr userToken) 未知

System.dll!System.Net.ListenerAsyncResult.IOCompleted(System.Net.ListenerAsyncResult asyncResult, uint errorCode, uint numBytes) 未知

mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode = 0x00000000,uint numBytes = 0x000004ed, System.Threading.NativeOverlapped* pOVERLAP = 0x000000000330faf8) 未知

【问题讨论】:

  • 对于任何有问题的异常,您都应该在异常位置找到调用堆栈。
  • 您的堆栈跟踪将您带到特定行。而且你没有告诉我们具体是哪一行。
  • 我指出了触发异常的那一行
  • 您需要检查此连接 => m_filterGraph.Connect(pinffdout, mpegIn);。如果这失败了,也许多路复用器在没有输入的情况下无法连接!

标签: c# directshow directshow.net


【解决方案1】:

一些调试的建议。其中大部分适用于调试从托管代码调用的本机代码的任何问题,其中一些特定于 DirectShow。如果不了解更多关于崩溃本身的信息,具体的建议是困难的。任何过滤器甚至 DirectShow 本身都可能崩溃。

  • 尽可能使用 ConnectDirect 而不是 Connect(智能连接)。智能连接可能会创建在您的系统上注册的任何其他 DirectShow 过滤器。有问题的过滤器可能会导致崩溃。在GraphStudioNext 中,图表构建报告将展示智能连接在幕后所做的一些事情。 GraphStudioNext 还允许您在 DirectConnect、带有媒体类型的 DirectConnect 以及 Intelligent Connect 模式和黑名单过滤器之间进行选择,以防止 Intelligent Connect 使用它们。
  • 在连接或流式传输时,不要在图表中悬挂任何额外的未连接过滤器,除非您希望智能连接使用它们。编写良好的过滤器无济于事,但其他过滤器可能会导致图形失败。
  • 在混合模式下调试以调试本机代码和托管代码(假设您没有使用不支持此功能的免费版 Visual Studio)。在 Visual Studio 2010 中,转到解决方案资源管理器,右键单击项目名称、属性、调试,启用“启用非托管代码调试”。
  • 如果在 Visual Studio 之外使用即时调试,请调试崩溃,要求手动选择调试引擎并启用本机和托管代码调试。
  • 下载系统 DLL 的符号以获得更好的调用堆栈。模块窗口,全选,右键单击,从微软符号服务器加载符号。这可能需要一段时间,并且不能中断。 Visual Studio 可以缓存这些符号,因此您不必每次都下载它们(工具、选项、调试、符号、缓存符号在此目录中)。为 Quartz、Kernel32、User32、Gdi 提供最新的符号尤为重要。
  • 保存故障转储以供以后分析、调试、将转储另存为、Minidump(您不需要带堆的 minidump,这些文件很大)。
  • 保存一个 GRF 文件以便在 GraphEdit 或GraphStudioNext 中进行分析,看看当您加载 GRF 文件并在图形编辑工具中尝试连接时它是否仍然崩溃。 C++原生GRF文件保存代码在这里Saving a Filter Graph to a GraphEdit File
  • Create a log file for the graph
  • Export your graph to the running object table 并通过图形编辑工具进行连接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2021-02-18
    • 2018-10-07
    相关资源
    最近更新 更多