c# 播放wav数据的音频 直接播放data区的double[]中的数据
时间: 2024-09-20 22:09:57 浏览: 56
C#播放wav文件
要在C#中播放WAV音频数据,通常我们会使用第三方库如NAudio或Windows Media Foundation(WPF中的MediaElement除外)。直接从`double[]`数组播放音频涉及到将数字音频转换为WaveFormat和PCM数据流,然后读取并播放。这里我将演示如何使用NAudio库完成这个过程:
```csharp
using NAudio.Wave;
public class WavePlayer {
private readonly WaveOutEvent _waveOut;
private readonly byte[] _pcmData;
public WavePlayer(double[] audioSamples, int sampleRate) {
var waveFormat = new WaveFormat(sampleRate, 16, 1); // 16-bit mono
_waveOut = new WaveOutEvent();
_waveOut.Init(new WaveProvider(audioSamplesToPcm(waveFormat, audioSamples)));
_waveOut.Play();
}
private static unsafe byte[] audioSamplesToPcm(WaveFormat format, double[] samples) {
int numSamples = samples.Length / format.Channels;
byte* ptr = stackalloc byte[numSamples * format.BlockAlign];
for (int i = 0; i < numSamples; ++i) {
float sample = samples[i * format.Channels]; // Assuming single-channel data
short signedSample = unchecked((short)(sample * format.Max amplitude)); // Convert to 16-bit signed
fixed (byte* b = &ptr[i * format.BlockAlign]) {
b[0] = (byte)(signedSample >> 8);
b[1] = (byte)signedSample;
}
}
return new ArraySegment<byte>(ptr, 0, numSamples * format.BlockAlign).ToArray();
}
// 添加停止播放的方法
public void Stop() {
_waveOut.Stop();
}
}
// 使用示例:
double[] audioSamples = ...; // 假设你已经有了double数组
var player = new WavePlayer(audioSamples, 44100); // 44100 Hz 是常见的采样率
// 当需要时调用Stop()来停止播放
```
请注意,这个例子假设你已经有一个双精度浮点数数组表示的音频数据,你需要将其转换为16位单声道 PCM 数据才能被音频设备识别。另外,NAudio的`WaveOutEvent`可能需要正确配置音频输出设备。
阅读全文