将 wav 文件转换为 8000Hz 16 位单声道 Wav
Convert a wav file to 8000Hz 16Bit Mono Wav
我需要将一个 wav 文件转换为 8000Hz 16 位单声道 Wav。我已经有一个代码,可以很好地与 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");
}
}
不确定这是否是最佳方式,但它有效...
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();
}
}
}
}
}
}
可能会添加,抱歉,由于积分不足,我还不能发表评论。 NAudio ALWAYS 写入 46 字节 headers 在某些情况下可能会导致崩溃。我想添加这个以防有人在搜索为什么 naudio wav 文件只开始崩溃某些程序的线索时遇到这个问题。
我在弄清楚如何使用 NAudio 转换 and/or 样本 wav 后遇到了这个问题,现在卡住了 2 天,只能用十六进制编辑器解决。
(额外的 2 个字节位于数据子块 [d,a,t,a,size<4bytes>] 之前的字节 37 和 38。
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 中的 NAudio src 来检查这一点,其中保留了 fmt chunck 18+extra 的 16 个字节(+extra 因为有些 wav 文件甚至包含更大的 headers 比 46 字节)但 NAudio 似乎总是写 46 字节 headers 而不是 44(MS 标准)。还可能注意到,实际上 NAudio 能够读取 44 字节 headers(WaveFormat.cs 中的第 210 行)
我需要将一个 wav 文件转换为 8000Hz 16 位单声道 Wav。我已经有一个代码,可以很好地与 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");
}
}
不确定这是否是最佳方式,但它有效...
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();
}
}
}
}
}
}
可能会添加,抱歉,由于积分不足,我还不能发表评论。 NAudio ALWAYS 写入 46 字节 headers 在某些情况下可能会导致崩溃。我想添加这个以防有人在搜索为什么 naudio wav 文件只开始崩溃某些程序的线索时遇到这个问题。
我在弄清楚如何使用 NAudio 转换 and/or 样本 wav 后遇到了这个问题,现在卡住了 2 天,只能用十六进制编辑器解决。
(额外的 2 个字节位于数据子块 [d,a,t,a,size<4bytes>] 之前的字节 37 和 38。 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 中的 NAudio src 来检查这一点,其中保留了 fmt chunck 18+extra 的 16 个字节(+extra 因为有些 wav 文件甚至包含更大的 headers 比 46 字节)但 NAudio 似乎总是写 46 字节 headers 而不是 44(MS 标准)。还可能注意到,实际上 NAudio 能够读取 44 字节 headers(WaveFormat.cs 中的第 210 行)