Как использовать NAudio / SoundTouch для потоковой передачи MP3 в ASP.NET MVC 5? - PullRequest
0 голосов
/ 13 октября 2018

Я совершенно новичок в работе со звуком.В конце концов я хочу транслировать 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");

Я даже не уверен, что это правильный способ сделать это,но я изменил некоторый код, который я нашел в сети, и это работает.Однако, глядя на демонстрационную версию NAudio Varispeed, которая интегрирует библиотеку SoundTouch, и пытаясь включить ее, она больше не работает.

Я изменил свой код следующим образом:

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 голосов
/ 17 октября 2018

Вы читаете во временный массив (созданный ToArray), поэтому прочитанное вами аудио теряется.

Вместо этого объявите float[], прочитайте его, а затем запишите содержимоечто в waveFileWriter.

Кроме того, очень важно использовать возвращаемое значение из Read, которое будет указывать количество выборок, фактически записанных в массив.

...