在C#中创建一个.wav文件

前端之家收集整理的这篇文章主要介绍了在C#中创建一个.wav文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
作为学习C#的借口,我一直在尝试编写一个简单的项目:创建音频文件.要开始,我想确保我可以编写符合WAVE格式的文件.我已经在线研究了格式(例如 here),但是每当我尝试播放文件时,它将无法正确打开.这是我的代码有东西丢失还是不正确?
  1. uint numsamples = 44100;
  2. ushort numchannels = 1;
  3. ushort samplelength = 1; // in bytes
  4. uint samplerate = 22050;
  5.  
  6. FileStream f = new FileStream("a.wav",FileMode.Create);
  7. BinaryWriter wr = new BinaryWriter(f);
  8.  
  9. wr.Write("RIFF");
  10. wr.Write(36 + numsamples * numchannels * samplelength);
  11. wr.Write("WAVEfmt ");
  12. wr.Write(16);
  13. wr.Write((ushort)1);
  14. wr.Write(numchannels);
  15. wr.Write(samplerate);
  16. wr.Write(samplerate * samplelength * numchannels);
  17. wr.Write(samplelength * numchannels);
  18. wr.Write((ushort)(8 * samplelength));
  19. wr.Write("data");
  20. wr.Write(numsamples * samplelength);
  21.  
  22. // for now,just a square wave
  23. Waveform a = new Waveform(440,50);
  24.  
  25. double t = 0.0;
  26. for (int i = 0; i < numsamples; i++,t += 1.0 / samplerate)
  27. {
  28. wr.Write((byte)((a.sample(t) + (samplelength == 1 ? 128 : 0)) & 0xff));
  29. }

解决方法

主要问题是:

BinaryWriter.Write(string)写一个前缀为BinaryReader的长度读取的字符串.它不是像你的情况一样使用.您需要直接写入字节而不是使用BinaryWriter.Write(string).

你应该做什么

将字符串转换为字节,然后直接写入字节.

  1. byte[] data = System.Text.Encoding.ASCII.GetBytes("RIFF");
  2. binaryWriter.Write(data);

或做一行:

  1. binaryWriter.Write(System.Text.Encoding.ASCII.GetBytes("RIFF"));

也可能有其他问题,像您正在撰写的整数可能不一样大小.你应该仔细检查.

至于endianess,你所提供的链接指出数据是小端,而BinaryWriter使用小端,所以这不应该是一个问题.

猜你在找的C#相关文章