C# 找不到中间过滤器的组合

C# 找不到中间过滤器的组合,c#,directshow,C#,Directshow,我正在使用VisualStudio制作一个windows窗体应用程序。该应用程序允许您输入照片的名称,然后将该图像保存到网络上的特定位置。当我在笔记本电脑上使用它时,效果非常好。但是,当我尝试在桌面上运行它时,它不起作用。相反,我得到的信息是: System.Runtime.InteropServices.COMException(0x80040217):否 可以找到中间过滤器的组合,使 连接 在DirectShowLib.DsError.throweexceptionforhr(Int32 h

我正在使用VisualStudio制作一个windows窗体应用程序。该应用程序允许您输入照片的名称,然后将该图像保存到网络上的特定位置。当我在笔记本电脑上使用它时,效果非常好。但是,当我尝试在桌面上运行它时,它不起作用。相反,我得到的信息是:

System.Runtime.InteropServices.COMException(0x80040217):否 可以找到中间过滤器的组合,使 连接

在DirectShowLib.DsError.throweexceptionforhr(Int32 hr)处

在OrderProductCapture.Capture.SetupGraph(DsDevice dev,Int32 iWidth, Int32 iHeight、Int16 iBPP、控制hControl)

在OrderProductCapture.Capture.ctor(Int32 iDeviceNum、Int32 iWidth、, Int32 iHeight、Int16 iBPP、控制hControl)

在OrderProductCapture.frmMain.ctor()处

调用堆栈显示:

OrderProductCapture.exe!OrderProductCapture.Capture(int iDeviceNum, int iWidth, int iHeight, short iBPP, System.Windows.Forms.Control hControl) Line 82
OrderProductCapture.exe!OrderProductCapture.frmMain.frmMain() Line 50
OrderProductCapture.exe!OrderProductCapture.Program.Main() Line 19
我已经在谷歌上搜索过很多次了,而且我也看过很多类似的问题。两台计算机都使用Windows 7 professional。任何帮助都会很棒

这是我的代码捕获异常的代码。我不认为代码是错误的,因为它在我的笔记本电脑上运行良好

public Capture(int iDeviceNum, int iWidth, int iHeight, short iBPP, Control hControl)
    {
        DsDevice [] capDevices;

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

        if (iDeviceNum + 1 > capDevices.Length)
        {
            throw new Exception("No video capture devices found at that index!");
        }

        try
        {
            // Set up the capture graph
            SetupGraph( capDevices[iDeviceNum], iWidth, iHeight, iBPP, hControl);

            // tell the callback to ignore new images
            m_PictureReady = new ManualResetEvent(false);
        }
        catch
        {
            Dispose();
            throw;
        }
    }

当必须在媒体格式之间转换时,您可以通过编程强制它使用某些特定的过滤器链,并根据您的需要对其进行严格配置,但DirectSHOW还可以“猜测”要使用的正确工具。它知道所有在操作系统中正式安装的微型媒体处理程序,并尝试匹配它们,以便构建最终所需的“转换”

然而,DirectShow仍然需要安装这些微型转换器。DS能够分析和连接它们,但不会为您提供任何外来媒体类型的支持。通常,如果操作系统是“清新干净”的,即使是非异国情调也会有问题

如果我没记错的话,这个错误基本上意味着(在这个有问题的机器上)缺少一些“编解码器”

这些东西通常伴随着任何:

  • 网络摄像头/麦克风/声卡的驱动程序
  • 音频处理软件(声音编辑器、媒体记录器、媒体播放器等)
  • “编解码器包”就像(真的,不要被他们的标志弄糊涂了)
  • 特定编解码器/过滤器包
  • (……)
我现在要做的第一件事是:

  • 回想一下我试图转换的内容
  • 尝试阅读所有错误消息和日志,并找出是否有一些提到的错误过滤器,可能需要重新安装
  • 比较程序运行的机器上安装的音频相关软件与有问题的机器上安装的音频相关软件
  • 基于以上内容,尝试推断编解码器缺少什么
  • 找到它,下载,安装
此外,您还可以阅读
SetupGraph()
函数的代码。我打赌有一个明确的参考正在使用的格式,这可能会指出什么编解码器缺失


编解码器有时也会损坏(实际上不是它们自己,但它们的配置和注册条目可能会损坏)。如果您确定计算机上有正确的编解码器,重新安装或“修复”(如果他们有这样的选项)它们会有所帮助。

异常的调用堆栈是什么?
这是我的代码捕获异常并再次抛出的代码。@Matt我添加了调用堆栈信息m\u pinStill=DsFindPin.ByCategory(capFilter,PinCategory.Still,0);我刚刚注释掉了这一部分,并使用了预览pin。虽然我相信你对编解码器的看法是正确的,但它还是起了作用。我只是在找到相关的过滤器时遇到了困难。哇,安装CCCP起了作用。世界工人们,团结起来!