измените 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!");
}