2010-09-28 36 views
0

我正在嘗試使用NAudio庫對播放的某些soundeffects進行一些內聯​​轉換,以及使用媒體Soundplayer進行實際播放的應用程序。 (我發現NAudio播放有點直接播放,因此轉換有點緊張)將Memorystream中的MP3轉換爲WAV用於播放System.Media.Soundplayer

我真的不想將文件解壓縮到磁盤播放,而是我想將它們轉換爲內存中的WAV使用MemoryStream的。

看一下NAudio源代碼,它似乎並沒有將一些數據寫入流中,直到它被丟棄,但是這會使MemoryStream無效。我應該重做還是我做錯了?

使用下面的代碼我得到一個invalidheader。

如果我更換代碼和文件寫入到磁盤和處置然後重新加載到流一切都很好(但它有點失敗的目的)

Private Sub PlaySound(ByVal ms As Stream) 
    Dim ss As System.Media.SoundPlayer 
    ss = New System.Media.SoundPlayer 
    ss.Stream = ms 
    ss.Load() 
    Try 
     ss.PlaySync() 
    Catch ex As InvalidOperationException 
     Debug.Print(ex.ToString) 
    End Try 
End Sub 

Private Sub ConvertToStream() 
    Using reader As New Mp3FileReader("C:\KMSounds\sound12.mp3") 
     Using convertedStream As WaveStream = WaveFormatConversionStream.CreatePcmStream(reader) 
      'File.Delete("c:\test2.wav") 
      'Using ms As New FileStream("c:\test2.wav", FileMode.Create) 
      Using ms As New MemoryStream 
       Using w As New WaveFileWriter(ms, convertedStream.WaveFormat) 
        Dim buffer() As Byte = CType(Array.CreateInstance(GetType(Byte), convertedStream.GetReadSize(4000)), Byte()) 
        While True 
         Dim bytesRead As Integer = convertedStream.Read(buffer, 0, buffer.Length) 
         If (bytesRead = 0) Then 
          w.Flush() 
          Exit While 
         Else 
          w.WriteData(buffer, 0, bytesRead) 
         End If 
        End While 
        PlaySound(ms) 
       End Using 
      End Using 
     End Using 
    End Using 
End Sub 

System.InvalidOperationException:波浪頭已損壞。 在System.Media.SoundPlayer.ValidateSoundData(字節[]數據) 在System.Media.SoundPlayer.LoadAndPlay(的Int32標誌) 在System.Media.SoundPlayer.PlaySync() 在NAudioConvert.ConvertAudio.Playfile(流毫秒)在C:\ Development \ Spikes \ NAudioConvert \ ConvertAudio.vb:line 78

有關這方面的任何提示?或者也許另一個庫,我可以用來轉換一些非常小的MP3文件爲WAV播放將是偉大的。

回答

1

它只有在您將WaveFileWriter放回到WAV頭並填充正確數量的數據字節(在每次調用WriteData時保存它)時纔有效。但是,爲了您的需要,最好使用自定義的WaveFileWriter來保持數據字節值保持最新。我正在考慮將此添加爲NAudio未來版本的一個選項

+0

感謝Mark,我將介紹一下如何做到這一點:-) – 2010-09-29 10:51:31