代码之家  ›  专栏  ›  技术社区  ›  Junior

如何在内存中将wav文件转换成mp3?

  •  3
  • Junior  · 技术社区  · 7 年前

    我有一个应用程序是在ASP.NETMVC5框架之上用C编写的。

    我的目标是打电话给第三方服务下载一个wave文件。然后我想把这个文件转换成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);
        }
    }
    

    上面的方法转换文件。但是这种方法将wave文件写入桌面,将其转换为mp3,然后删除wave文件。此外,此方法将MP3文件写入桌面,而不是返回 byte[] 内容。

    如何在不必向桌面写入的情况下转换内存中的文件?另外,我如何将MP3文件转换为 字节[] ?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Junior    7 年前

    也许是这样的。

    注释 :完全未经测试,我只是查看了源代码。

    同步

    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();
          }
       }
    }
    
    推荐文章