1

我正在尝试使用 DirectSound 从麦克风捕获声音。这是我的代码:

    using Microsoft.DirectX.DirectSound;
    public MicrophoneSensor()
    {
            CaptureBufferDescription micBufferDesc = new CaptureBufferDescription();
            WaveFormat format = new WaveFormat();
            format.SamplesPerSecond = 22000;
            format.Channels = 1;
            format.BitsPerSample = 8;
            format.AverageBytesPerSecond = 22000;
            format.BlockAlign = 1;

            micBufferDesc.Format = format;
            micBufferDesc.BufferBytes = 100000;
            micBufferDesc.ControlEffects = false;
            micBufferDesc.WaveMapped = true;

            micBuffer = new CaptureBuffer(micBufferDesc, microphone);
     }

micBufferDesc 和格式变量的实例化导致 Visual Studio 2008 抛出以下错误:

以下方法或属性之间的调用不明确:“Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription()”和“Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription()”

以下方法或属性之间的调用不明确:“Microsoft.DirectX.DirectSound.WaveFormat.WaveFormat()”和“Microsoft.DirectX.DirectSound.WaveFormet.WaveFormat()”

我已经尝试了很多不同的说明命名空间和 using 语句的组合,但没有运气。

我还检查了解决方案资源管理器中的引用,据我所知没有重复。

一个只有 Microsoft.DirectX.DirectSound 引用的全新测试项目仍然会引发相同的错误。

我还卸载并重新安装了 DirectX SDK(2009 年 3 月)以及 DirectX SDK(2008 年 11 月)。仍然没有运气。

最后,我在实验室的另一台计算机上尝试了一个新项目,但仍然无法正常工作。

以下是我的参考资料:

  • 图形
  • Microsoft.DirectX.DirectSound
  • Microsoft.DirectX.DirectInput
  • 演示核心
  • 演示框架
  • 服务
  • 系统
  • 系统核心
  • 系统数据
  • System.Data.DataSetExtensions
  • 系统部署
  • 系统绘图
  • System.Runtime.Serialization
  • 系统.服务模型
  • System.Windows.Forms
  • 系统文件
  • System.Xml.Linq
  • UIAutomationProvider
  • 视窗基地
  • Windows窗体集成
4

6 回答 6

2

我有同样的错误,这不是双重参考。单击运行,编译器会神奇地忘记它,或者您可以使用以下内容完全停止烦恼。

using System.Reflection;

// then instead of WaveFormat fmt = new WaveFormat()

ConstructorInfo constructor = typeof(WaveFormat).GetConstructor(Type.EmptyTypes);
WaveFormat fmt = (WaveFormat)constructor.Invoke(null);

// do the same for CaptureBufferDescription
于 2009-09-02T13:55:47.590 回答
1

听起来您可能正在引用多个版本的 directx 程序集。也许仔细检查您的参考资料。如果您需要多个版本,那么extern alias可能会有所帮助 - 但它并不漂亮。


在 Visual Studio 中,寻找“解决方案资源管理器”(通常在右侧)——这是项目中所有内容的树。此树中的一项是“参考”。这是您的代码配置为使用的外部 dll 的直观表示。

(有很多很多 .NET dll - 您需要告诉每个项目它可能需要哪些 dll)

展开此节点,并查找 2 个看起来像 directx 的条目。如果有两个,去掉其中一个(最好是版本较低的那个)。然后尝试重建。

于 2009-06-23T19:19:32.360 回答
0

这是 DirectSound 的常见问题。您还会发现许多其他问题 ;) 请记住,使用 DS 并没有它看起来的样子。当缓冲区返回 null 它可能只是因为“读取位置”只是内部缓冲区写入指针。因此,当您要求读取或写入指针始终计算至少一个块安全区时;)并且当您从 ds 方法获取缓冲区位置时,请使用 try cast,因为它会引发随机错误。

于 2010-02-17T17:45:26.907 回答
0

您已经包含了对包含该函数的不同版本的程序集的两个引用。删除其中一个引用。

于 2009-06-23T19:20:32.497 回答
0

您可能对 DirectX 程序集有多个引用。在 References 文件夹中检查您的项目。查找重复条目,特别是对多个版本的 microsoft.directx.directsound.dll 的引用。如果有重复删除一个,然后重试。

于 2009-06-23T19:25:33.877 回答
0

强制您的软件在 x86 或 x64 中编译而不是“任何 CPU”将解决问题。

于 2013-03-17T01:11:18.640 回答