转换WAV文件到8000Hz的16位单声道的Wav
问题描述:
我需要将WAV文件转换为8000Hz的16位单声道的Wav。我已经有了一个代码,可以和NAudio库一起使用,但我想用MemoryStream代替临时文件。转换WAV文件到8000Hz的16位单声道的Wav
using System.IO;
using NAudio.Wave;
static void Main()
{
var input = File.ReadAllBytes("C:/input.wav");
var output = ConvertWavTo8000Hz16BitMonoWav(input);
File.WriteAllBytes("C:/output.wav", output);
}
public static byte[] ConvertWavTo8000Hz16BitMonoWav(byte[] inArray)
{
using (var mem = new MemoryStream(inArray))
using (var reader = new WaveFileReader(mem))
using (var converter = WaveFormatConversionStream.CreatePcmStream(reader))
using (var upsampler = new WaveFormatConversionStream(new WaveFormat(8000, 16, 1), converter))
{
// todo: without saving to file using MemoryStream or similar
WaveFileWriter.CreateWaveFile("C:/tmp_pcm_8000_16_mono.wav", upsampler);
return File.ReadAllBytes("C:/tmp_pcm_8000_16_mono.wav");
}
}
答
不知道这是否是最佳的方式,但它的作品...
public static byte[] ConvertWavTo8000Hz16BitMonoWav(byte[] inArray)
{
using (var mem = new MemoryStream(inArray))
{
using (var reader = new WaveFileReader(mem))
{
using (var converter = WaveFormatConversionStream.CreatePcmStream(reader))
{
using (var upsampler = new WaveFormatConversionStream(new WaveFormat(8000, 16, 1), converter))
{
byte[] data;
using (var m = new MemoryStream())
{
upsampler.CopyTo(m);
data = m.ToArray();
}
using (var m = new MemoryStream())
{
// to create a propper WAV header (44 bytes), which begins with RIFF
var w = new WaveFileWriter(m, upsampler.WaveFormat);
// append WAV data body
w.Write(data,0,data.Length);
return m.ToArray();
}
}
}
}
}
}
答
它可能被添加和抱歉,我不能因缺少点尚未置评。这n音讯ALWAYS写入46字节标头其在某些情况下可能会导致死机。我想补充一点,以防有人在搜索线索时遇到这种情况,为什么naudio wav文件只会开始崩溃某些程序。
我在弄清楚如何转换和/或采样NAAV的wav后遇到了这个问题,并且在2天后卡住了,只能用十六进制编辑器计算出来。
(该2个额外的字节位于在字节37和38中的数据subchunck前右[d,A,T,A,尺寸< 4字节>]。 Here is a comparison of two wave file headers left is saved by NAudio 46 bytes; right by Audacity 44 bytes
可以通过查看在检查此回在WaveFormat.cs at line 310的n音讯SRC其中对于FMT chunck,而不是16个字节18 +额外保留(+额外的,因为有一些wav文件甚至包含大标题超过46个字节),但n音讯似乎总是写46个字节的头部,从来没有44( MS标准),也可以注意到实际上NAudio能够读取44个字节的标题(WaveFormat.cs中的第210行)
你可以使用'WaveFi的构造函数之一leWriter',它需要一个参数流。采取[NAudio源代码](https://github.com/naudio/NAudio/blob/master/NAudio/Wave/WaveOutputs/WaveFileWriter.cs#LC63) – bob1024
@ bob1024我已经尝试过,但没有参数转换器......或者我可能丢失了一些东西 –
你可以在WaveFormat变量中指定速率,位和通道,并将它传递给WaveFileWriter的构造函数 – bob1024