измените 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 для чтения входного файла - вы только хотите, чтобы фактическая часть аудиоданных файла, чтобы получить преобразованы, но в настоящее время вы копируете все, включая рифф куски, как если бы они были аудиоданные в новый файл.
  • 8 бит PCM аудио обычно звучит ужасно. Используйте 16 бит, или если у вас должно быть 8 бит, используйте G. 711 u-law или a-law
  • Downsampling аудио может привести к сглаживанию. Чтобы сделать это хорошо, вам нужно реализовать low-pass сначала фильтр. Это, к сожалению, нелегко, но есть сайты, которые помогают вам генерировать коэффициенты для фильтра нижних частот Чебышева для конкретной downsampling, которую вы делаете.

вот пример кода, показывающий, как конвертировать из одного формата в другой. Помните, что вам может потребоваться выполнить преобразование в несколько шагов, в зависимости от формата вашего входного файла:

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. В противном случае я продолжал получать ошибку "No Riff Header" с 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!");
            }