2011-07-11 20 views
6

Tôi muốn thay đổi tệp WAV thành 8KHz và 8 bit bằng cách sử dụng NAudio.thay đổi tệp wav (thành 16KHz và 8bit) bằng cách sử dụng NAudio

  WaveFormat format1 = new WaveFormat(8000, 8, 1); 
      byte[] waveByte = HelperClass.ReadFully(File.OpenRead(wavFile)); 
      Wave 
      using (WaveFileWriter writer = new WaveFileWriter(outputFile, format1)) 
      { 
       writer.WriteData(waveByte, 0, waveByte.Length); 
      } 

nhưng khi tôi phát tệp đầu ra, âm thanh chỉ là sizzle. Mã của tôi có đúng hay không?

Nếu tôi đặt WaveFormat thành WaveFormat (44100, 16, 1), nó hoạt động tốt.

Cảm ơn.

Trả lời

13

Một vài gợi ý:

  • Bạn cần phải sử dụng một WaveFormatConversionStream để thực sự chuyển đổi từ một tỷ lệ mẫu/bit độ sâu khác - bạn chỉ việc đưa âm thanh ban đầu vào tập tin mới với các định dạng sóng sai.
  • Bạn cũng có thể cần chuyển đổi theo hai bước - trước tiên thay đổi tốc độ mẫu, sau đó thay đổi độ sâu bit/số kênh. Điều này là do các codec ACM cơ bản không phải lúc nào cũng thực hiện chuyển đổi mà bạn muốn trong một bước.
  • Bạn nên sử dụng WaveFileReader để đọc tệp đầu vào - bạn chỉ muốn phần dữ liệu âm thanh thực của tệp được chuyển đổi, nhưng hiện tại bạn đang sao chép mọi thứ bao gồm các đoạn RIFF như thể chúng là dữ liệu âm thanh vào tệp mới.
  • Âm thanh PCM 8 bit thường có vẻ khủng khiếp. Sử dụng 16 bit hoặc nếu bạn phải có 8 bit, hãy sử dụng luật u G.711 hoặc pháp luật
  • Âm thanh lấy mẫu có thể dẫn đến việc tạo bí danh. Để thực hiện tốt, trước tiên bạn cần triển khai bộ lọc low-pass. Thật không may là không dễ dàng, nhưng có những trang web giúp bạn tạo ra các hệ số cho một bộ lọc thông thấp Chebyshev cho downsampling cụ thể mà bạn đang làm.

Dưới đây là một số mã ví dụ cho thấy cách chuyển đổi từ định dạng này sang định dạng khác. Hãy nhớ rằng bạn có thể cần phải thực hiện chuyển đổi trong nhiều bước tùy thuộc vào định dạng của tập tin đầu vào của bạn:

using (var reader = new WaveFileReader("input.wav")) 
{ 
    var newFormat = new WaveFormat(8000, 16, 1); 
    using (var conversionStream = new WaveFormatConversionStream(newFormat, reader)) 
    { 
     WaveFileWriter.CreateWaveFile("output.wav", conversionStream); 
    } 
} 
3

Các mã sau đây giải quyết vấn đề của tôi đối phó với G.711 Mu-Luật có phần mở rộng tập tin vox thành wav tập tin . Tôi tiếp tục nhận được lỗi "Không có tiêu đề RIFF" với WaveFileReader nếu không.

FileStream fileStream = new FileStream(fileName, FileMode.Open); 
      var waveFormat = WaveFormat.CreateMuLawFormat(8000, 1); 
      var reader = new RawSourceWaveStream(fileStream, waveFormat); 
      using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) 
      { 
       WaveFileWriter.CreateWaveFile(fileName.Replace("vox", "wav"), convertedStream); 
      } 
      fileStream.Close(); 
1
  openFileDialog openFileDialog = new openFileDialog(); 
      openFileDialog.Filter = "Wave Files (*.wav)|*.wav|All Files (*.*)|*.*"; 
      openFileDialog.FilterIndex = 1; 


      WaveFileReader reader = new NAudio.Wave.WaveFileReader(dpmFileDestPath); 

      WaveFormat newFormat = new WaveFormat(8000, 16, 1); 

      WaveFormatConversionStream str = new WaveFormatConversionStream(newFormat, reader); 

      try 
      { 
       WaveFileWriter.CreateWaveFile("C:\\Konvertierten_Dateien.wav", str); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(String.Format("{0}", ex.Message)); 
      } 
      finally 
      {    
       str.Close(); 
      } 

       MessageBox.Show("Konvertieren ist Fertig!"); 
      } 
Các vấn đề liên quan