2013-05-14 67 views
1

我想重新實現一個現有的Matlab 8波段均衡器GUI,我在上週用C#爲一個項目創建了GUI。在Matlab中,歌曲會作爲一個動態數組加載到內存中,在那裏它們可以自由操作,播放和聲音(數組)一樣容易。使用NAudio操作Mp3作爲數組使用NAudio

我發現了NAudio庫,它方便地已經有Mp3提取器,播放器,並定義了卷積和FFT。我能夠打開MP3並將其所有數據讀取到一個數組中(儘管我不確定我是否正確地進行了處理)。但是,即使查看了幾個示例,我也很難弄清楚把這個數組寫回流中,以便正確播放它(我不需要寫入文件)。

之後我才發現,我讀我的MP3是這樣的例子:

private byte[] CreateInputStream(string fileName) 
    { 
     byte[] stream; 
     if (fileName.EndsWith(".mp3")) 
     { 
      WaveStream mp3Reader = new Mp3FileReader(fileName); 
      songFormat = mp3Reader.WaveFormat; // songFormat is a class field 
      long sizeOfStream = mp3Reader.Length; 
      stream = new byte[sizeOfStream]; 
      mp3Reader.Read(stream, 0, (int) sizeOfStream); 
     } 
     else 
     { 
      throw new InvalidOperationException("Unsupported Exception"); 
     } 
     return stream; 
    } 

現在我有大概包含原始音頻數據,我打算最終隱蔽到彩車,以貫穿字節數組DSP模塊。不過,現在我只是想看看我是否可以播放字節數組。

 Stream outstream = new MemoryStream(stream); 
     WaveFileWriter wfr = new WaveFileWriter(outstream, songFormat); 
     // outputStream is an array of bytes and a class variable 
     wfr.Write(outputStream, 0, (int)outputStream.Length); 
     WaveFileReader wr = new WaveFileReader(outstream); 
     volumeStream = new WaveChannel32(wr); 
     waveOutDevice.Init(volumeStream); 
     waveOutDevice.Play(); 

在WaveFileReader(outstream)拋出的現在,我收到錯誤這不能不說無法讀取超過了流的末尾。我懷疑這不是我唯一不正確的做法。任何見解?

回答

1

您的代碼無法正常工作,因爲您從不關閉WaveFileWriter,因此其標頭寫入不正確,而且您還需要倒帶MemoryStream

但是,如果要播放一組Bye,則無需編寫WAV文件。只需使用RawSourceWaveStream並傳入您的MemoryStream即可。

您也可能會發現AudioFileReader類更適合您的需求,因爲它將直接提供樣本作爲浮點,並允許您修改音量。