【问题标题】:Getting an error when exiting program after loading .wav using NAudio使用 NAudio 加载 .wav 后退出程序时出错
【发布时间】:2011-06-15 16:42:06
【问题描述】:

前几天我刚刚找到了 NAudio,我一直在玩它。我编写了一个简单的 Windows 窗体程序,它有一个加载按钮(加载特定的 .wav 歌曲),以及播放、暂停、停止、淡入声音的按钮(我自己使用计时器和逐渐增加的音量添加的功能),以及淡出声音。我还有一个轨迹栏控件来处理音量。我创建了一个包装类来放入所有 NAudio 内容,以及添加额外的功能,例如在声音开始或暂停时淡入/淡出和事件通知。

好吧,总而言之,这很好用。程序正确加载、播放、暂停、停止和淡入淡出。音量轨迹栏正确反映了正在播放的歌曲的音量。这很有效,但我确实有两个问题。

首先,在我单击“加载”按钮加载声音然后进行所有我想要(或不)的播放后,当我退出程序时,我收到以下弹出错误消息(“断言失败”) :“在 AcmStreamHeader.Finalize() 处未调用 AcmStreamHeader dispose”。这是“中止、重试、忽略”弹出窗口之一,但几秒钟后它消失并且项目终止。 (注意:加载功能创建 DirectSoundOut 并调用 CreateInputStream... 直接取自站点上的 NAudio 示例。它还为定义的事件设置事件处理程序,但这可能无关紧要。)

在类析构函数中,我进行了以下调用:

mainOutputStream.Close();
mainOutputStream.Dispose();
waveOutDevice.Dispose();

但我仍然收到错误消息。这是一个大问题,我将在另一个线程中问另一个问题。知道为什么会发生这种情况以及如何阻止它吗?

我在 Windows 7 32 位上运行 VS 10。

【问题讨论】:

    标签: naudio


    【解决方案1】:

    错误的最可能原因(它实际上只是一个 Debug.Assert - 它不会在 NAudio 的发布版本中发生)是 mainOutputStream 被分配给多个 WaveStream 并且当您更改它时,您没有处理旧的。当您退出应用程序时,垃圾收集器运行并触发此 Debug.Assert。

    其他几点:

    • 无需调用 mainOutputStream.Close 和 Dispose。只需致电其中一位即可。
    • 您的清理代码不应位于类析构函数(终结器?)中,而应位于 Dispose 方法、Form、Closing 或 Closed 事件处理程序中。
    • 编辑:另一个可能的原因是您从 WaveStream 派生并且在您的重写 Dispose 方法中没有对属于类成员的任何 WaveStreams 调用 Dispose。

    【讨论】:

    • 好的,我添加了一个dispose方法,并确保在程序退出时调用了它,问题就消失了。谢谢你的提示。顺便说一句,是否有显示 NAudio 类并解释其成员的 API 文档?那将是...有帮助的。谢谢,马克。
    • 还有一个问题,马克。我使用以下代码播放声音:waveOutDevice = new WaveOut(); mainOutputStream = CreateInputStream(fileName); waveOutDevice.Play();我的问题是...... waveOutDevice 是否需要独占使用音频设备,或者我可以让我的班级的多个对象播放它们的声音......甚至可能同时?我所做的只是播放声音文件,而不是任何花哨的东西。
    • 所有 NAudio 类都有面向公众的 API 的 XML 文档。其他文档和教程可以在 CodePlex 网站的文档选项卡上找到。
    • 是的,WaveOut API 可以毫无问题地处理多个同时使用的用户。不过,Windows 可能会在内部重新采样您的音频。
    • 谢谢,马克。我一直在寻找 Microsoft.DirectX.AudioVideoPlayback 的替代品,到目前为止,NAudio 看起来不错。我正在重新编写一个较旧的应用程序,重新设计界面,并希望升级到一种可以让我选择音频输出并让我查找和播放声音文件的一部分的方法。 NAudio 似乎是门票......只要我正确创建我的包装类。再次感谢,马克。
    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多