【问题标题】:Sound clipping/clicking when lowering volume with NAudio使用 NAudio 降低音量时的声音剪辑/点击
【发布时间】:2020-12-09 17:52:06
【问题描述】:

在尝试实时降低 WAV 文件的音量时,音频正在剪辑(或单击)。

我已经在 SampleChannelVolumeSampleProviderWaveChannel32 实例上进行了尝试,源是 32 位 WAV 文件

如果我在 WaveOut 实例上尝试,则不会再发生削波,但我不希望这样,因为它会降低应用程序中所有声音的音量。

只有当我降低音量时才会发生这种情况,提高音量不会导致削波。

这是一个已知问题还是我应该以不同的方式解决这个问题?

注意: 这是在给定时间跨度内音量实时下降的方式:

0.9523049
0.9246111
0.9199954
0.89384
0.8676848
0.8415294
0.8169126
0.7907572
0.7646018
0.739985
0.7122912
0.6892129
0.6630576
0.6369023
0.6122856
0.5861301
0.5599748
0.535358
0.5092026
0.4830474
0.456892
0.4322752
0.4061199
0.3799645
0.3553477
0.3276539
0.3030371
0.2784202
0.2522649
0.2261095
0.2014928
0.176876
0.149182
0.1245652
0.09841
0.07225461
0.04763785
0.02148246
0

【问题讨论】:

  • 在开始应用这些因素之前,您确定音量是 1.0 吗?您确定在此操作期间没有设置其他值吗?
  • 是的,我确信音量总是从 1.0 开始,并且在操作期间没有设置其他值。我通过隔离案例来确保没有其他因素可以干扰。
  • 好的,显然这是WaveOut 实例上的DesiredLatencyNumberOfBuffers 问题。默认值会导致问题,更改值会解决问题。
  • 您可以回答自己的问题,以便其他人找到此解决方案。

标签: c# naudio


【解决方案1】:

显然这是WaveOut 实例上的DesiredLatencyNumberOfBuffers 问题。默认值会导致问题,更改值会解决问题。

这些是我用来解决问题的值。

 WaveOutDevice = new WaveOut(WaveCallbackInfo.NewWindow())
        {
            DesiredLatency = 700, //! adjust the value to prevent sound clipping/clicking
            NumberOfBuffers = 3, //! number of buffers must be carefully selected to prevent audio clipping/clicking
        };

【讨论】:

  • 如果您需要增加这些值,这意味着您的 PC 正在努力继续填充缓冲区?这是低规格的电脑吗?或者你正在做一些密集的 DSP/图形?
  • 你好,马克。我的系统是 Windows 7 Ultimate x64,具有 16GB 的 RAM 和核心 i5-2500K 3.3Ghz 四核。我认为这个问题与不同的输出设备有关,而不是系统本身。此外,在我的情况下,最佳值是 3 个缓冲区;如果我使用少于 3 个或多于 3 个,我仍然有问题。
  • 您是否尝试过 WaveOutEvent,或者是否尝试过 WasapiOut 或 DirectSoundOut,看看是否会有所不同。上次我需要使用这样的设置是在我的 400MHz Pentium II 上;)
  • 不,我没有,因为我不知道这些。您的库非常复杂,我还没有找到任何可靠的文档,主要是散布在 Internet 上的示例。无论哪种方式,它都是一个了不起的工具,并且几乎是程序员可以依赖的唯一工具,所以非常感谢您提供它并不断改进它。昨天我使用了你的声音循环示例并添加了我自己的改进来创建真正完美的音频循环;如果不是你的库,我发现很难想象在 C# 项目中完美循环音频的不同方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2013-05-30
  • 2020-12-05
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多