如何使用NAudio / SoundTouch在ASP.NET MVC 5中流式传输MP3?

时间:2018-10-13 17:23:32

标签: c# asp.net-mvc naudio soundtouch

我对使用音频完全陌生。我最终希望将MP3流式传输到网页上,并允许用户更改速度。我设置了HTML5音频元素,它可以很好地播放MP3。我可以将MP3导入NAudio.AudioFileReader并将其流式传输到页面,并且使用以下代码也可以正常工作:

string fn = Server.MapPath("~/Uploads/Music/" + filename);
AudioFileReader reader = new AudioFileReader(fn);
MemoryStream outputStream = new MemoryStream();

using (NAudio.Wave.WaveFileWriter waveFileWriter = new WaveFileWriter(outputStream, reader.WaveFormat))
{
    byte[] bytes = new byte[reader.Length];
    reader.Position = 0;
    reader.Read(bytes, 0, (int)reader.Length);
    waveFileWriter.Write(bytes, 0, bytes.Length);
    waveFileWriter.Flush();
}

return File(outputStream.ToArray(), "audio/mp3");

我什至不确定这是否是执行此操作的正确方法,但我修改了一些在网上找到的代码,此方法确实有效。但是,当查看集成了SoundTouch库的NAudio Varispeed演示并尝试将其合并时,该演示将不再起作用。

我这样修改我的代码:

string fn = Server.MapPath("~/Uploads/Music/" + filename);
AudioFileReader reader = new AudioFileReader(fn);
bool useTempo = true;
VarispeedSampleProvider speedControl = new VarispeedSampleProvider(reader, 100, new SoundTouchProfile(useTempo, false));
MemoryStream outputStream = new MemoryStream();

using (NAudio.Wave.WaveFileWriter waveFileWriter = new WaveFileWriter(outputStream, reader.WaveFormat))
{
    byte[] bytes = new byte[reader.Length];
    speedControl.Read(bytes.Select(b => (float)Convert.ToDouble(b)).ToArray(), 0, (int)reader.Length);
    waveFileWriter.Write(bytes, 0, bytes.Length);
    waveFileWriter.Flush();
}

return File(outputStream.ToArray(), "audio/mp3");

它会构建并看起来像在工作,但是当我点击播放时,我听不到声音。 我在这里做错了什么?这不是实现我想要的好方法吗?

1 个答案:

答案 0 :(得分:0)

您正在读取一个临时数组(由ToArray创建),因此您读取的音频会丢失。

相反,声明一个float[],对其进行读取,然后将其内容写入waveFileWriter

此外,使用Read的返回值非常重要,该返回值将指示实际写入数组的样本数。