NAudio 使用 C# 播放 x 毫秒的正弦波
Posted
技术标签:
【中文标题】NAudio 使用 C# 播放 x 毫秒的正弦波【英文标题】:NAudio playing a sine wave for x milliseconds using C# 【发布时间】:2011-03-30 11:17:00 【问题描述】:我正在使用NAudio 播放给定频率的正弦波,如博文中所述Playback of Sine Wave in NAudio。我只想让声音播放() x 毫秒,然后停止。
我尝试了 thread.sleep,但声音立即停止。我尝试了一个计时器,但是当 WaveOut 被处理时,出现了一个跨线程异常。
我尝试了这段代码,但是当我调用 beep 时,程序冻结了。
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 < sampleCount; n++)
buffer[n + offset] = (float)(Amplitude * Math.Sin((2 * Math.PI * sample * Frequency) / sampleRate));
sample++;
if (sample >= sampleRate)
sample = 0;
【问题讨论】:
@Hans - 这就是 Read 方法的作用 - 只要声卡需要更多数据,就会调用它 【参考方案1】:SineWaveProvider32 类不需要无限期地提供音频。如果您希望哔声的最大持续时间为一秒(例如),那么对于单声道 44.1 kHz,您需要提供 44,100 个样本。当没有更多数据要提供时,Read 方法应该返回 0。
为了让你的 GUI 线程不阻塞,你需要去掉 Thread.Sleep、waveOut.Stop 和 Dispose,然后简单地开始播放音频(你可能会发现窗口回调比函数更可靠)。
然后,当音频播放完毕后,您可以关闭并清理 WaveOut 对象。
【讨论】:
【参考方案2】:查看博文Pass Variables to a New Thread in C#,了解如何将变量传递给另一个线程。
我认为您想要做的是创建一个播放声音的线程,创建一个计时器,然后启动线程。当计时器到期时,杀死线程,当线程关闭时,让它做所有的清理工作。
【讨论】:
以上是关于NAudio 使用 C# 播放 x 毫秒的正弦波的主要内容,如果未能解决你的问题,请参考以下文章