NAudio使用C#播放正弦波x毫秒

我正在使用NAudio播放给定频率的正弦波,如在博客文章中播放的Nir的Sine Wave 。 我只想让声音播放()x毫秒然后停止。

我尝试了一个thread.sleep,但声音立即停止。 我尝试了一个计时器,但是当处理WaveOut时,会出现一个跨线程exception。

我尝试了这段代码,但是当我打电话给哔哔声时,程序冻结了。

public class Beep { public Beep(int freq, int ms) { SineWaveProvider32 sineWaveProvider = new SineWaveProvider32(); sineWaveProvider.Amplitude = 0.25f; sineWaveProvider.Frequency = freq; NAudio.Wave.WaveOut waveOut = new NAudio.Wave.WaveOut(WaveCallbackInfo.FunctionCallback()); waveOut.Init(sineWaveProvider); waveOut.Play(); Thread.Sleep(ms); waveOut.Stop(); waveOut.Dispose(); } } public class SineWaveProvider32 : NAudio.Wave.WaveProvider32 { int sample; public SineWaveProvider32() { Frequency = 1000; Amplitude = 0.25f; // Let's not hurt our ears } public float Frequency { get; set; } public float Amplitude { get; set; } public override int Read(float[] buffer, int offset, int sampleCount) { int sampleRate = WaveFormat.SampleRate; for (int n = 0; n = sampleRate) sample = 0; } } 

SineWaveProvider32类不需要无限期地提供音频。 如果您希望蜂鸣声的最大持续时间为一秒(比如说),那么对于单声道44.1 kHz,您需要提供44,100个样本。 当没有更多数据供应时,Read方法应该返回0。

为了使你的GUI线程不被阻塞,你需要摆脱Thread.Sleep,waveOut.Stop和Dispose,并简单地开始播放音频(你可能会发现窗口回调比函数更可靠)。

然后,当音频播放完毕后,您可以关闭并清理WaveOut对象。

查看博客文章将变量传递给C#中的新线程,了解如何将变量传递给另一个线程。

我想你想要做的就是创建一个播放你的声音的线程,创建一个计时器,然后启动线程。 当计时器到期时,终止线程,当线程关闭时,它会进行所有清理。