using System; using System.IO; namespace WriteWavFile { class Program { static void Main(string[] args) { // 设置音频参数 int channelCount = 1; // 声道数 int sampleRate = 44100; // 采样率 int bitDepth = 16; // 比特深度 // 设置文件名和路径 string fileName = "test.wav"; string filePath = Directory.GetCurrentDirectory() + "\\" + fileName; // 创建一个空的 WAV 文件 using (var stream = new FileStream(filePath, FileMode.Create)) { using (var writer = new BinaryWriter(stream)) { // 写入 RIFF 标识符 writer.Write(new char[] { 'R', 'I', 'F', 'F' }); // 写入文件长度。这里暂时写为0,后面会重新计算 writer.Write(0); // 写入 WAVE 标识符 writer.Write(new char[] { 'W', 'A', 'V', 'E' }); // 写入 fmt 子块 writer.Write(new char[] { 'f', 'm', 't', ' ' }); writer.Write(16); // 子块大小 writer.Write((short)1); // 音频格式(PCM) writer.Write((short)channelCount); writer.Write(sampleRate); writer.Write(sampleRate * channelCount * bitDepth / 8); // 每秒字节数 writer.Write((short)(channelCount * bitDepth / 8)); // 数据块对齐 writer.Write((short)bitDepth); // 写入 data 子块标识符和大小。这里暂时写为0,后面会重新计算 writer.Write(new char[] { 'd', 'a', 't', 'a' }); writer.Write(0); // 关闭写入器和流 writer.Close(); stream.Close(); } } // 计算音频数据的字节数 int audioDataSize = channelCount * sampleRate * bitDepth / 8; // 将数据块大小写回文件头 using (var stream = new FileStream(filePath, FileMode.Open)) { using (var writer = new BinaryWriter(stream)) { // 定位到文件长度字段 writer.Seek(4, SeekOrigin.Begin); // 写入新的文件长度 writer.Write(36 + audioDataSize); // 定位到 data 子块大小字段 writer.Seek(40, SeekOrigin.Begin); // 写入新的子块大小 writer.Write(audioDataSize); // 关闭写入器和流 writer.Close(); stream.Close(); } } } } }