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 毫秒的正弦波的主要内容,如果未能解决你的问题,请参考以下文章

如何同时使用 NAudio 生成信号和录音?

[C#] NAudio 各种常见使用方式 播放 录制 转码 音频可视化

NAudio 播放 IEEEFloat 格式

C# NAudio:录制的文件无法播放

字节到 sbytes 并返回 - C# NAudio

如何使用 C# NAudio 操作字节?