簡體   English   中英

讀寫WAVE文件會產生無法播放的輸出

[英]Reading and writing WAVE file produces unplayable output

我想將回聲添加到波形文件中,為此,我需要先將其打開然后保存。 我已經寫了一些方法,但是輸出文件不正確。

測試輸入文件大小:731 014

輸出文件sieze:730898

但是,兩個文件的“磁盤空間”相同,即733184

錯誤代碼或打開時顯示的內容:0xc00d36c4

這可能是什么問題? 這看起來很簡單,但是沒有用。 這是我的標頭,讀寫方法:

 class WaveFile
 {
      struct WaveHeader
      {
           public byte[] RiffID;
           public uint fileSize;
           public byte[] format;

           //Wave format chunk 1
           public byte[] fmtID;
           public uint fmtSize;
           public ushort audioFormat;
           public ushort channels;
           public uint sampleRate;
           public uint byteRate;
           public ushort blockAlign; 
           public int bitsPerSample;

           //Wave format chunk 2
           public byte[] dataID;
           public uint dataSize;                            
      }

      uint samples;

      public List<short> L;
      public List<short> R;

      WaveHeader header = new WaveHeader();

      //loading file, preparation for modyfying
      public bool loadWaveFile(string filePath)
      {
           using (FileStream fs = File.Open(filePath, FileMode.Open))
           using (BinaryReader reader = new BinaryReader(fs))
           {
                // chunk 0
                header.RiffID = reader.ReadBytes(4);
                header.fileSize = reader.ReadUInt32();
                header.format = reader.ReadBytes(4);
                // chunk 1
                header.fmtID = reader.ReadBytes(4);
                header.fmtSize = reader.ReadUInt32();
                header.audioFormat = reader.ReadUInt16();
                header.channels = reader.ReadUInt16();
                header.sampleRate = reader.ReadUInt32();
                header.byteRate = reader.ReadUInt32();
                header.blockAlign = reader.ReadUInt16();
                header.bitsPerSample = reader.ReadInt16();
                // chunk 2
                header.dataID = reader.ReadBytes(4);
                header.dataSize = reader.ReadUInt32();

                // DATA is stereo
                L = new List<short>();
                R = new List<short>();

                samples = header.dataSize / header.blockAlign;
                for (int i = 0; i < samples; i++)
                {
                     L.Add((short)reader.ReadUInt16());
                     R.Add((short)reader.ReadUInt16());
                }
                reader.Close();
                fs.Close();
           }
           return true;
      }

      public bool addEcho(int threadsNumber, int echoesNumber, int delay, int attenuation)
      {
           return true;
      }

      public bool saveWaveFile(string savingPath)
      {
           using (FileStream fs = new FileStream(@savingPath + "\\echo.wav", FileMode.Create))
           using (BinaryWriter writer = new BinaryWriter(fs))
           {
                //chunk 0
                writer.Write(header.RiffID);
                writer.Write(header.fileSize);
                writer.Write(header.format);
                //chunk 1
                writer.Write(header.fmtID);
                writer.Write(header.fmtSize);
                writer.Write(header.audioFormat);
                writer.Write(header.channels);
                writer.Write(header.sampleRate);
                writer.Write(header.byteRate);
                writer.Write(header.blockAlign);
                writer.Write(header.bitsPerSample);
                //chunk 2
                writer.Write(header.dataID);
                writer.Write(header.dataSize);

                for (int i = 0; i < samples; i++)
                {
                     writer.Write(L[i]);
                     writer.Write(R[i]);
                }
                writer.Close();
                fs.Close();
                return true;
           }
      }
 }

我沒有發現問題所在,但是出於回顯的目的,該類可以工作:

Class WaveFile
 {
      byte[] byteArray;

      public void loadWaveFile(string filePath)
      {
           byteArray = File.ReadAllBytes(filePath);
      }

      public bool addEcho(int threadsNumber, int echoesNumber, int delay, int attenuation)
      {
           return true;
      }

      public bool saveWaveFile(string savingPath)
      {
           using (FileStream fs = new FileStream(@savingPath + "\\echo.wav", FileMode.Create))
           using (BinaryWriter writer = new BinaryWriter(fs))
           {
                writer.Write(byteArray);                   
                writer.Close();
                fs.Close();
                return true;
           }
      }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM