我需要将Wav文件转换为8000 to 16位Mono。我已经有了一个代码,它可以很好地处理NAudio库,但是我想使用MemoryStream而不是临时文件。
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");
}
}发布于 2016-03-06 09:50:01
不知道这是不是最理想的方法,但它有效.
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();
}
}
}
}
}
}发布于 2016-09-26 23:20:32
它可能会增加,很抱歉,我还不能评论,因为缺乏点。NAudio 总是写46字节头,在某些情况下会导致崩溃。我想增加这一点,以防有人在寻找线索时,有人把这封信,为什么n音频wav文件只开始崩溃某些程序。
我在弄清楚如何用NAudio转换和/或示例wav之后就解决了这个问题,并且在使用了2天之后,我才用十六进制编辑器解决了这个问题。
(两个额外的字节位于数据子集d、a、t、a、size<4bytes>之前的字节37和38。下面是两个波文件头的比较,左边由NAudio保存,46个字节保存;右边由Audity44个字节保存
您可以通过查看WaveFormat.cs在第310行中的WaveFormat.cs在第310行 src来检查这一点,其中保留了fmt 18+extra而不是16个字节(+额外,因为有些wav文件包含比46个字节还要大的头),但是NAudio似乎总是编写46个字节头,而不是44个字节(MS标准)。还需要注意的是,实际上NAudio能够读取44个字节头(WaveFormat.cs中的第210行)。
https://stackoverflow.com/questions/35824819
复制相似问题