C# 如何使用生成的wave复杂数组写入.wav文件?

C# 如何使用生成的wave复杂数组写入.wav文件?,c#,file,wav,C#,File,Wav,我想知道如何写入.wav文件,我已经编写了下面的代码,可以将数据写入该文件。但是,当我尝试播放声音文件时,它会说该文件已损坏/为空 try { SaveFileDialog save = new SaveFileDialog(); save.Filter = "Wave File (*.wav)|*.wav;"; if (save.ShowDialog() != System

我想知道如何写入.wav文件,我已经编写了下面的代码,可以将数据写入该文件。但是,当我尝试播放声音文件时,它会说该文件已损坏/为空

 try
            {
                SaveFileDialog save = new SaveFileDialog();
                save.Filter = "Wave File (*.wav)|*.wav;";
                if (save.ShowDialog() != System.Windows.Forms.DialogResult.OK)
                    return;

                using (FileStream FS = new FileStream(save.FileName, FileMode.Open, FileAccess.Write))
                {
                    BinaryWriter wr = new BinaryWriter(FS);

                    int subchunk1Size = 16;
                    short audioFormat = 1;
                    short bitsPerSample = 64;
                    short numChannels = 2;
                    int sampleRate = Convert.ToInt32(samplingRateBox.Text);
                    int byteRate = sampleRate * numChannels * (bitsPerSample / 8);
                    short blockAlign = (short)(numChannels * (bitsPerSample / 8));
                    int numSamples = Convert.ToInt32(numberOfsamplesBox.Text);

                    int subChunk2Size = numSamples * numChannels * (bitsPerSample / 8);

                    int chunkSize = 4 + (8 + subchunk1Size) + (8 + subChunk2Size);

                    wr.Write(getBytes("RIFF"));
                    wr.Write(chunkSize);
                    wr.Write(getBytes("WAVE"));
                    wr.Write(getBytes("fmt"));
                    wr.Write((byte)32);
                    wr.Write(subchunk1Size);
                    wr.Write(audioFormat);
                    wr.Write(numChannels);
                    wr.Write(sampleRate);
                    wr.Write(byteRate);
                    wr.Write(blockAlign);
                    wr.Write(bitsPerSample);
                    wr.Write(getBytes("data"));
                    wr.Write(subChunk2Size);

                    double[] primArray = new double[samples.Length];
                    byte[] byteArray = new byte[samples.Length * 8];

                    for (int i = 0; i < samples.Length; i++)
                    {
                        primArray[i] = Convert.ToDouble(samples[i].Real);
                    }

                    byteArray = doubleToBytes(primArray);

                    for (int i = 0; i < samples.Length; i++)
                    {
                        wr.Write(byteArray[i]);
                    }


                    for (int i = 0; i < samples.Length; i++)
                    {
                        primArray[i] = Convert.ToDouble(samples[i].Imaginary);
                    }

                    byteArray = doubleToBytes(primArray);

                    for (int i = 0; i < samples.Length; i++)
                    {
                        wr.Write(byteArray[i]);
                    }

                    wr.Close();
                    wr.Dispose();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
试试看
{
SaveFileDialog save=新建SaveFileDialog();
save.Filter=“波形文件(*.wav)|*.wav;”;
if(save.ShowDialog()!=System.Windows.Forms.DialogResult.OK)
返回;
使用(FileStream FS=newfilestream(save.FileName,FileMode.Open,FileAccess.Write))
{
BinaryWriter wr=新的BinaryWriter(FS);
int subchunk1Size=16;
短音频格式=1;
短位spersample=64;
短数字通道=2;
int sampleRate=Convert.ToInt32(samplingRateBox.Text);
int byteRate=取样器*numChannels*(位采样/8);
短块对齐=(短)(numChannels*(bitsPerSample/8));
int numSamples=Convert.ToInt32(numberOfsamplesBox.Text);
int subChunk2Size=numSamples*numChannels*(位采样/8);
int chunkSize=4+(8+次chunk1size)+(8+次chunk2size);
wr.Write(getBytes(“RIFF”);
wr.Write(chunkSize);
wr.Write(getBytes(“WAVE”);
wr.Write(getBytes(“fmt”));
wr.Write((字节)32);
wr.Write(子缓存大小);
wr.Write(音频格式);
wr.Write(numChannels);
wr.Write(采样器);
wr.Write(byteRate);
wr.Write(块对齐);
wr.Write(位采样);
wr.Write(getBytes(“数据”));
wr.Write(子缓存大小);
double[]primArray=新的double[samples.Length];
byte[]byteArray=新字节[samples.Length*8];
for(int i=0;i
正如您所看到的,我已经尝试了从复数转换为双精度,再加上标题。
采样率和采样数都来自文本框。另外,我假设位深度是双精度的。

我也尝试过使用这种方法,但是音频文件的长度是0

这使用了NAudio图书馆

NAudio.Wave.WaveFileWriter waveWriter = null;
            WaveIn wi = new WaveIn();

            double[] primArray = new double[samples.Length];

            for (int i = 0; i < samples.Length; i++)
            {
                primArray[i] = Convert.ToDouble(samples[i].Real);
            }

            SaveFileDialog save = new SaveFileDialog();
            save.Filter = "Wave File (*.wav)|*.wav;";
            if (save.ShowDialog() != System.Windows.Forms.DialogResult.OK)
                return;

            wi = new NAudio.Wave.WaveIn();
            wi.WaveFormat = new WaveFormat(samplingRate,1);

            waveWriter = new WaveFileWriter(save.FileName, wi.WaveFormat);

            byte[] byteArray = new byte[samples.Length*8];

            byteArray = doubleToBytes(primArray);

            waveWriter.Write(byteArray, 0, byteArray.Length);
NAudio.Wave.waveilewriter waveWriter=null;
WaveIn wi=新的WaveIn();
double[]primArray=新的double[samples.Length];
for(int i=0;i
什么是
示例
?它是如何创建和填充的?对不起,samples是我创建的复杂数组
samples=newcomplex[numberOfSamples]并由
正弦波[i]=振幅*Math.Sin(((2*Math.PI*i*频率)+相位)+采样率填充