2010-09-28 136 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