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

问题描述 投票:0回答:1

我想知道如何写入.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);
            }

您可以看到,我已经尝试从Complex转换为double,再加上标头。采样率和样本数量均来自文本框。另外,我假设位深度是两倍。

c# file wav
1个回答
0
投票

我也尝试过使用此方法,但是音频文件的长度为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);
© www.soinside.com 2019 - 2024. All rights reserved.