我需要将 wav 文件转换为 8000Hz 16Bit Mono 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();
}
}
}
}
}
}
public void ConvertWav(String waveFilePath, String toWaveFilePath)
{
int outRate = 8000;
using (var reader = new WaveFileReader(waveFilePath))
{
var outFormat = new WaveFormat(outRate, 16, 1);
using (var resampler = new MediaFoundationResampler(reader, outFormat))
{
WaveFileWriter.CreateWaveFile(toWaveFilePath, resampler);
}
}
}
并像这样修改你的程序:
static void Main()
{
ConvertWav("C:/input.wav","C:/output.wav");
}