簡體   English   中英

使用 NAudio 更改 wav 文件(到 16KHz 和 8bit)

[英]change wav file ( to 16KHz and 8bit ) with using NAudio

我想使用 NAudio 將 WAV 文件更改為 8KHz 和 8bit。

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

但是當我播放 output 文件時,聲音只有嘶嘶聲。 我的代碼是正確的還是有什么問題?

如果我將 WaveFormat 設置為 WaveFormat(44100, 16, 1),它可以正常工作。

謝謝。

幾點建議:

  • 您需要使用 WaveFormatConversionStream 將一個采樣率/位深度實際轉換為另一個 - 您只是將原始音頻放入具有錯誤波形格式的新文件中。
  • 您可能還需要分兩步進行轉換 - 首先更改采樣率,然后更改位深度/通道數。 這是因為底層 ACM 編解碼器不能總是一步完成您想要的轉換。
  • 您應該使用 WaveFileReader 來讀取您的輸入文件 - 您只希望文件的實際音頻數據部分得到轉換,但您當前正在將包括 RIFF 塊在內的所有內容復制到新文件中,就好像它們是音頻數據一樣。
  • 8 位 PCM 音頻通常聽起來很糟糕。 使用 16 位,或者如果您必須使用 8 位,請使用 G.711 u-law 或 a-law
  • 對音頻進行下采樣會導致混疊。 要做到這一點,您需要先實現一個低通濾波器。 不幸的是,這並不容易,但是有些網站可以幫助您為正在執行的特定下采樣生成切比雪夫低通濾波器的系數。

下面是一些示例代碼,展示了如何從一種格式轉換為另一種格式。 請記住,您可能需要根據輸入文件的格式分多個步驟進行轉換:

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

以下代碼解決了我處理 G.711 Mu-Law 的問題,其中 vox 文件擴展名為 wav 文件。 否則,我一直收到 WaveFileReader 的“No RIFF Header”錯誤。

 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();
            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!");
            }

暫無
暫無

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

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