Изменить файл WAV (до 16 кГц и 8 бит) с помощью NAudio

Я хочу изменить файл 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 ответа

Решение

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

  • Вам нужно использовать 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-файла. В противном случае я продолжал получать ошибку "Нет заголовка 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();
            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!");
            }
Другие вопросы по тегам