Creating a .wav File in C#

穿精又带淫゛_ 提交于 2019-12-03 02:09:51

The major problem is:

BinaryWriter.Write(string) writes a string that is prefixed with it's length for BinaryReader to read it back. It is not intended to be used like your case. You need to write the bytes directly instead of using BinaryWriter.Write(string).

What you should do:

Convert the string into bytes and then write the bytes directly.

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

or make it one line:

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

There may also be other problems, like the integers you are writing may not be of the same size as required. You should check them carefully.

As for endianess, the link you put states that data are in little-endian and BinaryWriter uses little-endian, so this should not be a problem.

The simplest way possible, you can simply change:

wr.Write("RIFF");

to:

wr.Write("RIFF".ToArray());

Writing a string in a binary file, it will include the length of the string so that it can be deserialized back into a string later. In this case you just want the four bytes to be written as four bytes, and converting it to a char array will do just that.

I lack the proper WAV data, but try replacing the part of your code where you generate the header with this code (replace appropriately):

wr.Write(Encoding.ASCII.GetBytes("RIFF"));
wr.Write(0);
wr.Write(Encoding.ASCII.GetBytes("WAVE"));
wr.Write(Encoding.ASCII.GetBytes("fmt "));
wr.Write(18 + (int)(numsamples * samplelength));
wr.Write((short)1); // Encoding
wr.Write((short)numchannels); // Channels
wr.Write((int)(samplerate)); // Sample rate
wr.Write((int)(samplerate * samplelength * numchannels)); // Average bytes per second
wr.Write((short)(samplelength * numchannels)); // block align
wr.Write((short)(8 * samplelength)); // bits per sample
wr.Write((short)(numsamples * samplelength)); // Extra size
wr.Write("data");

@Alvin-wong answer works perfect. Just wanted to add another suggestion although a few more lines is:

binaryWriter.Write('R');
binaryWriter.Write('I');
binaryWriter.Write('F');
binaryWriter.Write('F'); 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!