Dot-Net

使用 C# 從流中播放音頻

  • October 8, 2008

C# 中有沒有辦法直接從System.IO.Stream播放音頻(例如 MP3),例如從 WebRequest 返回而不將數據臨時保存到磁碟?


NAudio解決方案

在NAudio 1.3的幫助下,可以:

  1. 將 MP3 文件從 URL 載入到 MemoryStream
  2. 完全載入後將 MP3 數據轉換為波形數據
  3. 使用NAudio的 WaveOut 類播放波形數據

能夠播放半載入的 MP3 文件本來會很好,但由於NAudio庫的設計,這似乎是不可能的。

這是將完成工作的功能:

   public static void PlayMp3FromUrl(string url)
   {
       using (Stream ms = new MemoryStream())
       {
           using (Stream stream = WebRequest.Create(url)
               .GetResponse().GetResponseStream())
           {
               byte[] buffer = new byte[32768];
               int read;
               while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
               {
                   ms.Write(buffer, 0, read);
               }
           }

           ms.Position = 0;
           using (WaveStream blockAlignedStream =
               new BlockAlignReductionStream(
                   WaveFormatConversionStream.CreatePcmStream(
                       new Mp3FileReader(ms))))
           {
               using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
               {
                   waveOut.Init(blockAlignedStream);
                   waveOut.Play();                        
                   while (waveOut.PlaybackState == PlaybackState.Playing )                        
                   {
                       System.Threading.Thread.Sleep(100);
                   }
               }
           }
       }
   }

編輯:更新答案以反映 NAudio 最新版本的變化

可以使用我編寫的NAudio開源 .NET 音頻庫。它會在您的 PC 上查找 ACM 編解碼器來進行轉換。NAudio 提供的 Mp3FileReader 目前期望能夠在源流中重新定位(它預先建構 MP3 幀的索引),因此它不適合通過網路進行流式傳輸。但是,您仍然可以使用 NAudio 中的MP3FrameAcmMp3FrameDecompressor類即時解壓縮流式 MP3。

我在我的部落格上發表了一篇文章,解釋瞭如何使用 NAudio 播放 MP3 流。本質上,您有一個執行緒下載 MP3 幀,解壓縮它們並將它們儲存在BufferedWaveProvider. BufferedWaveProvider然後另一個執行緒使用作為輸入進行回放。

引用自:https://stackoverflow.com/questions/184683