изменить файл WAV (до 16 кГц и 8 бит) с помощью NAudio - PullRequest
7 голосов
/ 11 июля 2011

Я хочу изменить файл WAV на 8 кГц и 8 бит с помощью 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);
            }

но при воспроизведении выходного файла звук только шипящий. Мой код правильный или что-то не так?

Если я установите WaveFormat в WaveFormat (44100, 16, 1), он будет работать нормально.

Спасибо.

Ответы [ 3 ]

17 голосов
/ 11 июля 2011

Несколько указателей:

  • Вам необходимо использовать WaveFormatConversionStream, чтобы фактически преобразовать одну частоту дискретизации / битовую глубину в другую - вы просто помещаете исходное аудио в новый файл с неправильной волной.format.
  • Возможно, вам также потребуется выполнить преобразование в два этапа - сначала измените частоту дискретизации, а затем измените битовую глубину / количество каналов.Это связано с тем, что базовые кодеки 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);
    } 
}
3 голосов
/ 23 мая 2013

Следующий код решил мою проблему, связанную с G.711 Mu-Law с расширением vox-файла до wav-файла. В противном случае я получал сообщение об ошибке «Нет заголовка RIFF» с WaveFileReader.

 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 голос
/ 04 сентября 2013
            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!");
            }
...