gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:47:08 28 4
gpt4 key购买 nike

我正在使用 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;
}
}

最佳答案

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

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

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

关于c# - NAudio 使用 C# 播放 x 毫秒的正弦波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5485577/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com