简体   繁体   English

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

[英]How to write to a .wav file using a generated wave, complex[] array?

I would like to know how to write to a .wav file, I have written the following code which supposedly writes data to the file.我想知道如何写入 .wav 文件,我编写了以下代码,据称将数据写入文件。 But when I try to play the sound file it says the file is corrupt / empty.但是当我尝试播放声音文件时,它说文件已损坏/为空。

 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);
            }

As you can see I have tried converting from Complex to double, plus the header.如您所见,我已尝试将 Complex 转换为 double 和 header。 The sampling rate and number of samples all come from textboxes.采样率和样本数均来自文本框。 Plus I am assuming the bit depth is that of a double.另外,我假设位深度是双倍的。

I have also tried using this method, however the length of the audio file is 0.我也尝试过使用这种方法,但是音频文件的长度为 0。

This used the NAudio library.这使用了 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM