Как преобразовать WAV-файл в mp3 в памяти? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть приложение, написанное с использованием c # в верхней части фреймворка Asp.Net MVC 5.

Моя цель - позвонить в стороннюю службу для загрузки волнового файла.Затем я хочу конвертировать этот файл в mp3.Наконец, я хочу вернуть mp3-файл как (byte []), чтобы позволить пользователю загружать его непосредственно из памяти.

Вот как мой код закончится, что позволит пользователю загружать преобразованный файл изпамять

public ActionResult Download(int? id)
{

    // Download and convert the file
    // the variable "someUri" is generated based on the provided id value
    byte[] filedata = ConvertToMp3(someUri);

    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = "filename.mp3",
        Inline = true,
    };

    Response.AppendHeader("Content-Disposition", cd.ToString());

    return File(filedata, "audio/mpeg"); 
}

Но у меня возникла проблема с методом ConvertToMp3.

Я использую библиотеку NAudio для преобразования файлов.Вот мой код до сих пор

public void ConvertToMp3(Uri uri)
{
    using (var client = new WebClient())
    {
        byte[] file = client.DownloadData(uri);
        string wavFileFullName = GetFullDirectory() + "filename.wav";
        string mp3FileFullName = GetFullDirectory() + "filename.mp3";
        WaveFormat target = new WaveFormat(8000, 16, 1);
        using (WaveStream stream = new WaveFileReader(new MemoryStream(file)))
        using (WaveFormatConversionStream str = new WaveFormatConversionStream(target, stream))
        {
            WaveFileWriter.CreateWaveFile(wavFileFullName, str);

            using (var reader = new WaveFileReader(wavFileFullName))
            using (var writer = new LameMP3FileWriter(mp3FileFullName, reader.WaveFormat, bitRate))
            {
                reader.CopyTo(writer);
            }
        }
        File.Delete(wavFileFullName);
    }
}

Приведенный выше метод преобразует файл.Но этот метод записывает волновой файл на рабочий стол, преобразует его в mp3 и затем удаляет волновой файл.Кроме того, этот метод записывает mp3-файл на рабочий стол, а не возвращает содержимое byte[].

Как преобразовать файл в память без необходимости записи на рабочий стол?Кроме того, как я могу конвертировать mp3 файл в byte[]?

1 Ответ

0 голосов
/ 31 мая 2018

Может быть что-то вроде этого.

Примечание : Полностью не проверено, я просто посмотрел на источник.

Синхронизация

public byte[] ConvertToMp3(Uri uri)
{
   using (var client = new WebClient())
   {
      var file = client.DownloadData(uri);
      var target = new WaveFormat(8000, 16, 1);
      using (var outPutStream = new MemoryStream())
      using (var waveStream = new WaveFileReader(new MemoryStream(file)))
      using (var conversionStream = new WaveFormatConversionStream(target, waveStream))
      using (var writer = new LameMP3FileWriter(outPutStream, conversionStream.WaveFormat, 32, null))
      {
         conversionStream.CopyTo(writer);

         return outPutStream.ToArray();
      }
   }
}

Async

public async Task<byte[]> ConvertToMp3Async(Uri uri)
{
   using (var client = new WebClient())
   {
      var file = await client.DownloadDataTaskAsync(uri);
      var target = new WaveFormat(8000, 16, 1);
      using (var outPutStream = new MemoryStream())
      using (var waveStream = new WaveFileReader(new MemoryStream(file)))
      using (var conversionStream = new WaveFormatConversionStream(target, waveStream))
      using (var writer = new LameMP3FileWriter(outPutStream, conversionStream.WaveFormat, 32, null))
      {
          await conversionStream.CopyToAsync(writer);

          return outPutStream.ToArray();
      }
   }
}
...