我正在尝试使用NAudio库对我的应用程序使用Media Soundplayer进行播放的某些声音效果的InLine转换进行实际播放。 (我发现NAudio播放对于直接播放来说有点紧张,因此转换)
我真的不想将文件解压缩到磁盘而不是我希望使用memoryStream将它们转换为内存中的WAV。
看看NAudio源,它似乎没有将一些数据写入Stream,直到它被丢弃,但这会使MemoryStream无效。我应该重做那件事还是我做错了?
使用以下代码我得到一个无效的标题。
如果我替换代码并将文件写入磁盘并处理然后重新加载到流中,一切都很好(但它有点挫败了目的)
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:wave标头已损坏。 在System.Media.SoundPlayer.ValidateSoundData(Byte []数据) 在System.Media.SoundPlayer.LoadAndPlay(Int32标志) 在System.Media.SoundPlayer.PlaySync() 在C:\ Development \ Spikes \ NAudioConvert \ ConvertAudio.vb中的NAudioConvert.ConvertAudio.Playfile(Stream ms):第78行
有关此的任何提示?或者我可以用来将一些非常小的MP3文件转换成WAV进行播放的其他库很棒。
答案 0 :(得分:1)
只有当你处理WaveFileWriter时它才会返回到WAV头并填充正确数量的数据字节(在每次调用WriteData时保存它)。但是,根据您的需要,您最好自定义WaveFileWriter,以确保数据字节值保持最新。我正在考虑将此作为未来版本的NAudio的选项添加