繁体   English   中英

如何将wav文件转换为内存中的mp3?

[英]How to convert wav file to mp3 in memory?

我有一个在 Asp.Net MVC 5 框架上使用 c# 编写的应用程序。

我的目标是调用 3rd 方服务下载波形文件。 然后我想把这个文件转换成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[]

也许是这样的。

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

同步

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM