如何使用 NAudio/SoundTouch 在 ASP.NET MVC 5 中流式传输 MP3?
How to use NAudio/SoundTouch to stream MP3 in ASP.NET MVC 5?
我对使用音频完全陌生。我最终想将 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");
它构建并看起来像在工作,但是当我点击播放时,我没有听到任何声音。
我在这里做错了什么?这甚至不是完成我想要的事情的好方法吗?
您正在读取一个临时数组(由 ToArray
创建),因此您读取的音频丢失了。
相反,声明一个 float[]
,读入它,然后将它的内容写入 waveFileWriter
。
此外,使用 Read
中的 return 值非常重要,它将指示实际写入数组的样本数。
我对使用音频完全陌生。我最终想将 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");
它构建并看起来像在工作,但是当我点击播放时,我没有听到任何声音。 我在这里做错了什么?这甚至不是完成我想要的事情的好方法吗?
您正在读取一个临时数组(由 ToArray
创建),因此您读取的音频丢失了。
相反,声明一个 float[]
,读入它,然后将它的内容写入 waveFileWriter
。
此外,使用 Read
中的 return 值非常重要,它将指示实际写入数组的样本数。