2010-05-08 33 views
2

n音訊庫WAV文件:http://naudio.codeplex.com/麻煩的MP3文件轉換爲使用n音訊

我想要一個MP3文件轉換爲WAV文件,但我在一個小的錯誤運行。我知道發生了什麼問題,但我不知道如何去修復它。

這裏是我跑了一段代碼:

private void button1_Click(object sender, EventArgs e) { 
    using(Mp3FileReader reader = new Mp3FileReader(@"path\to\MP3")) { 
     using(WaveFileWriter writer = new WaveFileWriter(@"C:\test.wav", new WaveFormat())) { 
      int counter = 0; 
      while(reader.Read(test, counter, test.Length + counter) != 0) { 
       writer.WriteData(test, counter, test.Length + counter); 
       counter += 512; 
      } 
     } 
    } 
} 

reader.Read()進入Mp3FileReader類和方法是這樣的:

public override int Read(byte[] sampleBuffer, int offset, int numBytes) 
{ 
    if (numBytes % waveFormat.BlockAlign != 0) 
     //throw new ApplicationException("Must read complete blocks"); 
     numBytes -= (numBytes % waveFormat.BlockAlign); 
    return mp3Stream.Read(sampleBuffer, offset, numBytes); 
} 

mp3Stream是一個對象Stream類。

問題是:我得到一個ArgumentException。 MSDN說這是因爲offset和numBytes的總和大於sampleBuffer的長度。

文檔:http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

這是因爲我每次都增加計數器,但該字節數組test的大小保持不變。

我一直在想的是:我是否需要動態增加數組的大小,還是需要在開始時查找所需的大小並立即設置它?

而且,而不是512,Mp3FileReader中的方法第一次返回365。這是一個整塊的大小。但我正在寫滿512.我基本上只是用讀取來檢查我是否還沒有結束文件。我是否需要抓住回報價值並做一些事情,還是我在這裏很好?

回答

4

您需要使用Read()的返回值來確定實際獲得的字節數。它不一定是512,你已經發現了。請記住,您正在使用流,而不是數組。使它看起來類似於這樣:

using (var reader = new Mp3FileReader(@"path\to\MP3")) { 
     using (var writer = new WaveFileWriter(@"C:\test.wav", new WaveFormat())) { 
      var buf = new byte[4096]; 
      for (;;) { 
       var cnt = reader.Read(buf, 0, buf.Length); 
       if (cnt == 0) break; 
       writer.WriteData(buf, 0, cnt); 
      } 
     } 
    } 
+0

好吧,我現在這樣做,結果是很多靜態噪聲。不過,這是一個完全不同的問題。 – KdgDev 2010-05-08 18:59:57

+0

嘗試更改byte [] buf = new byte [4096];而不是字節buf =新字節[4096]; – fyasar 2011-06-15 07:14:06

+0

這不適用於我嘗試的Windows 8.1 Store應用程序。你可以發佈更新的方法或指導我正確的鏈接? – Wajahat 2014-02-14 16:50:23

1

你沒有真正執行從任何MP3轉換爲WAV在你的榜樣。你需要WaveFormatConversionStream。嘗試這樣的:

private void button1_Click(object sender, EventArgs e) { 
    using(Mp3FileReader reader = new Mp3FileReader(@"path\to\MP3")) { 
     using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) { 
      WaveFileWriter.CreateWaveFile(outputFileName, convertedStream); 
     } 
    } 
} 
+0

看起來不錯,但它不會運行。我不斷收到「AcmNotPossible調用acmStreamOpen」異常。 – KdgDev 2010-05-12 19:08:30

+0

這可能是因爲您的目標格式與MP3的自然轉換格式不匹配。我會更新代碼示例 – 2010-05-12 21:36:54