Как преобразовать WAV-файл в mp3 в памяти?

У меня есть приложение, написанное с использованием C# на вершине Asp.Net MVC 5 Framework.

Моя цель - позвонить в сторонний сервис, чтобы загрузить волновой файл. Затем я хочу конвертировать этот файл в 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 ответ

Решение

Может быть как то так

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

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

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();
      }
   }
}

асинхронный

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();
      }
   }
}
Другие вопросы по тегам