使用NAudio更改wav文件(到16KHz和8bit)
本文关键字:16KHz 8bit NAudio 更改 wav 文件 使用 | 更新日期: 2023-09-27 18:01:38
我想使用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);
}
但是当我播放输出文件时,声音只有嘶嘶声。我的代码是对的还是错的?
如果我将WaveFormat设置为WaveFormat(44100,16,1),它可以正常工作。
谢谢。
几个指针:
- 你需要使用waveformatconveronstream来实际地从一个采样率/位深度转换到另一个-你只是把原始音频用错误的波格式放入新文件。
- 您可能还需要在两个步骤中转换-首先改变采样率,然后改变位深度/通道计数。这是因为底层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);
}
}
下面的代码解决了我用vox文件扩展到wav文件处理G.711 Mu-Law的问题。我一直得到一个"没有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!");
}