Dot-Net
使用 C# 從流中播放音頻
C# 中有沒有辦法直接從System.IO.Stream播放音頻(例如 MP3),例如從 WebRequest 返回而不將數據臨時保存到磁碟?
NAudio解決方案
在NAudio 1.3的幫助下,可以:
- 將 MP3 文件從 URL 載入到 MemoryStream
- 完全載入後將 MP3 數據轉換為波形數據
- 使用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 中的
MP3Frame和AcmMp3FrameDecompressor類即時解壓縮流式 MP3。我在我的部落格上發表了一篇文章,解釋瞭如何使用 NAudio 播放 MP3 流。本質上,您有一個執行緒下載 MP3 幀,解壓縮它們並將它們儲存在
BufferedWaveProvider.BufferedWaveProvider然後另一個執行緒使用作為輸入進行回放。