【发布时间】:2017-08-20 10:00:48
【问题描述】:
我在字节数组(来自数据库)中有 16000Hz、32 位、1 通道格式的 IEEE 浮点 WAV 数据。我想即时将其转换为 mp3 并通过 WCF 服务的响应对象将其流式传输。
使用 NAudio 包,到目前为止,我正在使用 MediaFoundationEncoder.EncodetoMp3() 写入文件。但是,一旦将该文件写出到响应中,它就没有用了。我想跳过文件写入步骤并输出到流或字节数组并将其写入响应对象。
有没有办法让 MediaFoundationEncoder 在某种内存对象(没有文件)中输出 mp3?
或者,尝试使用 LameMP3FileWriter,它确实写入流, 我可以将 IEEE 浮点 wav 输入直接发送到 LameMP3FileWriter 但无论我使用什么输出格式 (44100,16,1), (22050,16,1), (11025,16, 1),...
当我尝试将 IEEE 浮点源转换为 PCM 或使用 WaveFormatConversion 对其进行上采样时,它会出错
AcmNotPossible 调用 acmStreamOpen
如果我在 IEEE 浮点源上使用 Wave32to16Stream,它不会出错但没有音频。这条链不适合我:
byte[] bytes = (Byte[])dt.Rows[0]["AudioContent"];//this is the dataTable from the database query containing the WAV audio
var ms = new MemoryStream(bytes);
var OLDfmt = WaveFormat.CreateIeeeFloatWaveFormat(16000,1);
var NEWfmt = new WaveFormat(16000, 16, 1);//tried many
var readr = new RawSourceWaveStream(ms,OLDfmt);
//the following line errors on 'AcmNotPossible calling acmStreamOpen'
//var wav16 = new WaveFormatConversionStream(NEWfmt, readr);
//the following does not error but no mp3 streams out at the end
var wav16 = new Wave32To16Stream(readr);
var outptMP3 = new MemoryStream();
var writr = new LameMP3FileWriter(outptMP3, NEWfmt, LAMEPreset.STANDARD);
wav16.CopyTo(writr);
HttpContext.Current.Response.BufferOutput = true;
HttpContext.Current.Response.AddHeader("Content-Type", "audio/mpeg");
HttpContext.Current.Response.BinaryWrite(outptMP3.ToArray());
如果我只是执行 ms MemoryStream 的 BinaryWrite,原始音频在 Chrome 中播放良好(作为 WAV 流),所以我认为 IEEE 浮点源数据是有效的。
如果有错误请纠正我,但该错误 (AcmNotPossible) 似乎意味着我的机器上没有适用于 IEEE 浮点格式的 ACM 编解码器?我查询我的机器,似乎没有 32 位 ACM 编解码器,这就是我尝试 Wave32To16Stream 转换的原因。
Lame MP3 管道是否有从 IEEE 浮点 32 位到 mp3 的中间步骤?
【问题讨论】: