2017-11-01 5 views
0

웨이브 파일에 에코를 추가하려면 먼저 파일을 열고 먼저 저장해야합니다. 몇 가지 방법을 썼지 만 출력 파일이 올바르지 않습니다.WAVE 파일을 읽고 쓰면 재생할 수없는 결과가 출력됩니다.

테스트 입력 파일 크기 : 731 014

출력 파일 sieze : (730) 898

그러나 "디스크 공간"733 184

오류 코드 모두 파일에 대해 동일 또는 열 때 표시되는 내용은 무엇입니까? 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; 
      } 
     } 
} 
+0

가를 비교하는 이진은 diff 도구를 사용하여 여기 내 헤더, 읽기 및 쓰기 방법입니다 두 파일을보고 왜 다른지 확인하십시오 –

+0

"디스크 공간"은 문제와 관련이 없습니다. 그것에 신경 쓰지 마라. 이것은 파일 시스템의 블록 크기와 파일이 사용하는 파일 시스템 블록의 수를 곱한 것입니다. – Xaver

+0

blockalign은 NumChannels * BitsPerSample/8입니다. 따라서 실제로 스테레오라면 samples = dataSize/blockAlign의 수를 결정할 때 정확해야합니다. 입력 파일 크기보다 짧은 116 바이트에 불과합니다. 인코딩이 여기서 문제가 될 수 있습니다> AudioFormat의 가치는 무엇입니까? 또한 [이것을 참조하십시오] (http://soundfile.sapp.org/doc/WaveFormat/) – dlatikay

답변

0

나는 문제가 무엇인지 발견하지 못했지만, 에코 목적으로이 클래스가 작동합니다 :

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