【问题标题】:C# Unity 3D NAudio throws NullReferenceException while checking for default audio endpointC# Unity 3D NAudio 在检查默认音频端点时抛出 NullReferenceException
【发布时间】:2018-06-21 09:52:34
【问题描述】:

我刚刚安装了 Unity 3D,因为我想制作一个简单的游戏。不过,NAudio 库存在一个问题。

这是我的代码:

var enumerator = new MMDeviceEnumerator();

if (enumerator.HasDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia)) //<--- crashes here
{
   //...
}

这就是 Unity 在尝试启动游戏时所说的所有内容:

NullReferenceException: 对象引用未设置为 对象 NAudio.CoreAudioApi.MMDeviceEnumerator.HasDefaultAudioEndpoint (DataFlow 数据流,角色角色)

我不明白为什么它会在这里抛出这种错误。 会不会是这个库不兼容这个版本的net framework(3.5版)?

编辑:变量枚举器不能为空,因此请停止将此帖子标记为“什么是 NullReferenceException,我该如何解决?”的重复项?

我也尝试过使用这个库:https://code.google.com/archive/p/naudio-with-unity3d/downloads 该库仅不包含 HasDefaultAudioEndpoint() 函数,因此我只是尝试通过调用 GetDefaultAudioEndpoint() 直接获取音频端点,但它仍然在该行上抛出了同样的错误。

【问题讨论】:

  • 从技术上讲,这不是崩溃的代码行。这是对包含崩溃代码行的函数的调用
  • 您应该调试您的enumerator 变量。您尝试使用的变量可能为 null,这就是您收到 NullReferenceException 的原因。因为这是您提供给我们的唯一文本。我猜是你的var enumerator
  • 我再说一遍:NullPointerException => JAVA,NullReferenceException => .NET。不知道为什么你的标题说指针。
  • @CamiloTerevinto 抱歉,在写标题时搞混了

标签: c# unity3d .net-3.5 naudio


【解决方案1】:

问题不在于您的代码。如果你查看HasDefaultAudioEndpoint 的源代码,它看起来是这样的:

public bool HasDefaultAudioEndpoint(DataFlow dataFlow, Role role)
{
    IMMDevice device = null;
    int hresult = ((IMMDeviceEnumerator)realEnumerator).GetDefaultAudioEndpoint(dataFlow, role, out device);
    ...
}

realEnumerator 在哪里:

[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")]
class MMDeviceEnumeratorComObject
{
}

不检查是否realEnumerator != null,很可能是因为没有考虑Unity并且它不支持某些COM+互操作。

如果您查看 2012 年的 this question,4 年后 OP 回答它从未工作过,并且必须为此创建一个 c++ DLL。

【讨论】:

  • 哎呀,搞砸了。
  • @TomLenc 所以...我的回答对您有帮助还是...?
  • 我找到了一个名为 CSCore 的库,它具有 NAudio 的所有功能,它终于可以工作了。现在我只需要以某种方式处理数据。
猜你喜欢
  • 2021-07-27
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 2021-04-11
  • 2013-10-21
  • 1970-01-01
相关资源
最近更新 更多