如何使用内存流、NAudio 和 LameMP3 将音频 aiff 转换为 MP3

Posted

技术标签:

【中文标题】如何使用内存流、NAudio 和 LameMP3 将音频 aiff 转换为 MP3【英文标题】:How convert audio aiff to MP3 using Memory stream, NAudio and LameMP3 【发布时间】:2021-03-06 16:46:34 【问题描述】:

我尝试将 aiff 音频文件从 IFormFile 转换为 MP3 并将其上传到 Azure 存储。我不明白 NAudio 的内存流是如何工作的......我不想将文件复制到临时文件中,而只想使用流。有可能吗?

using (var retMs = new MemoryStream())

   file.CopyTo(retMs);
   var fileBytes = retMs.ToArray();
   string s = Convert.ToBase64String(fileBytes);

    using (var ms = new MemoryStream(fileBytes))
    using (var reader = new AiffFileReader(ms))
    using (var writer = new LameMP3FileWriter(retMs, reader.WaveFormat, 128))
    
       reader.CopyTo(writer);

       var result = await _blobService.UploadFileBlobAsync(
                              reader,
                              "audio/mpeg3",
                              "fr2.mp3");

       toReturn = result.AbsoluteUri; 
      
                                
   

【问题讨论】:

【参考方案1】:

我认为下面的演示代码可能对您有所帮助。

using Azure.Storage.Blobs;
using NAudio.Lame;
using NAudio.Wave;
using System;
using System.IO;

namespace blobUpload

    class Program
    
        static void Main(string[] args)
        
            string containerName = "<container name>";
            string blobName = "test.mp3";
            string storageConnStr = "<storage account conn str>";

            var blobServiceClient = new BlobServiceClient(storageConnStr);
            var blobClient = blobServiceClient.GetBlobContainerClient(containerName).GetBlobClient(blobName);

            using (var retMs = new MemoryStream())
            
                FileStream inputfileStream = new FileStream(@"<aiff file path>", FileMode.Open, FileAccess.Read);
                inputfileStream.CopyTo(retMs);
                var fileBytes = retMs.ToArray();
                
                var bytes = ConvertWavToMp3(fileBytes);

                blobClient.UploadAsync(new MemoryStream(bytes)).GetAwaiter().GetResult();

            

        

        public static byte[] ConvertWavToMp3(byte[] wavFile)
        

            using (var retMs = new MemoryStream())
            using (var ms = new MemoryStream(wavFile))
            using (var rdr = new AiffFileReader(ms))
            using (var wtr = new LameMP3FileWriter(retMs, rdr.WaveFormat, 128))
            
                rdr.CopyTo(wtr);
                return retMs.ToArray();
            

       
    

结果:

我这边测试过,这个.MP3文件可以完美播放。

【讨论】:

非常感谢!拯救我的一天!在我的情况下,我不需要 inputfileStream 行,所以我使用 file.CopyTo(retMs) 和“文件”是我来自 IFormFile 的文件 @Pigale,很高兴知道它很有帮助。祝你有美好的一天。

以上是关于如何使用内存流、NAudio 和 LameMP3 将音频 aiff 转换为 MP3的主要内容,如果未能解决你的问题,请参考以下文章

使用 NAudio 从内存流中播放 .wma

如何拆分和管道多个 NAudio 流

使用 NAudio 创建静音 WAVE 流

如何使用 NAudio 更改 WASAPI 记录比特率?

NAudio 流读取方法延迟

从 NAudio 访问 WPF MediaElement 声音流