C# 保存WAV格式文件
时间: 2024-09-06 07:02:08 浏览: 96
C#保存WAV格式文件通常涉及音频数据的处理和文件格式的标准写入。WAV是一种标准的音频文件格式,通常用于存储未压缩的音频数据。在C#中保存WAV格式的文件,你可以按照以下步骤进行:
1. 准备音频数据:首先,你需要准备音频数据,这可能是PCM数据(脉冲编码调制,即原始的音频样本数据)。
2. 创建WAV文件头:WAV文件包含一个文件头,其中定义了音频格式的元数据,如采样率、位深度、声道数等。
3. 写入文件:将音频数据和头部信息写入文件系统中,创建一个WAV文件。
以下是一个简单的示例代码,展示了如何在C#中创建一个简单的WAV文件:
```csharp
using System;
using System.IO;
using System.Text;
public class WAVFile
{
private static byte[] RIFFHeaderTemplate = new byte[44];
static WAVFile()
{
RIFFHeaderTemplate[0] = 82; // 'R'
RIFFHeaderTemplate[1] = 73; // 'I'
RIFFHeaderTemplate[2] = 70; // 'F'
RIFFHeaderTemplate[3] = 70; // 'F'
RIFFHeaderTemplate[8] = 87; // 'W'
RIFFHeaderTemplate[9] = 65; // 'A'
RIFFHeaderTemplate[10] = 86; // 'V'
RIFFHeaderTemplate[11] = 69; // 'E'
}
public static void WriteWAVFile(string fileName, byte[] data, int sampleRate, short bitsPerSample, short numChannels)
{
using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
// 设置文件头
BinaryWriter bw = new BinaryWriter(fs);
// ChunkID "RIFF"
Array.Copy(new byte[] { 82, 73, 70, 70 }, 0, RIFFHeaderTemplate, 0, 4);
// ChunkSize
Array.Copy(BitConverter.GetBytes(36 + data.Length), 0, RIFFHeaderTemplate, 4, 4);
// Format "WAVE"
Array.Copy(new byte[] { 87, 65, 86, 69 }, 0, RIFFHeaderTemplate, 8, 4);
// Subchunk1ID "fmt "
Array.Copy(new byte[] { 102, 109, 116, 32 }, 0, RIFFHeaderTemplate, 12, 4);
// Subchunk1Size
Array.Copy(BitConverter.GetBytes(16), 0, RIFFHeaderTemplate, 16, 4);
// AudioFormat
Array.Copy(BitConverter.GetBytes((short)1), 0, RIFFHeaderTemplate, 20, 2);
// NumChannels
Array.Copy(BitConverter.GetBytes((short)numChannels), 0, RIFFHeaderTemplate, 22, 2);
// SampleRate
Array.Copy(BitConverter.GetBytes(sampleRate), 0, RIFFHeaderTemplate, 24, 4);
// ByteRate
Array.Copy(BitConverter.GetBytes(sampleRate * numChannels * (bitsPerSample / 8)), 0, RIFFHeaderTemplate, 28, 4);
// BlockAlign
Array.Copy(BitConverter.GetBytes((short)(numChannels * (bitsPerSample / 8))), 0, RIFFHeaderTemplate, 32, 2);
// BitsPerSample
Array.Copy(BitConverter.GetBytes((short)bitsPerSample), 0, RIFFHeaderTemplate, 34, 2);
// Subchunk2ID "data"
Array.Copy(new byte[] { 100, 97, 116, 97 }, 0, RIFFHeaderTemplate, 36, 4);
// Subchunk2Size
Array.Copy(BitConverter.GetBytes(data.Length), 0, RIFFHeaderTemplate, 40, 4);
// 写入文件头
bw.Write(RIFFHeaderTemplate);
// 写入音频数据
bw.Write(data);
bw.Close();
}
}
}
// 使用示例
// byte[] audioData = ... // 音频数据
// WAVFile.WriteWAVFile("output.wav", audioData, 44100, 16, 2);
```
在这个示例中,`WriteWAVFile`方法接收音频数据、采样率、位深度和声道数作为参数,并创建一个WAV文件。
阅读全文