使用System.Media.Soundplayer将MP3转换为Memorystream中的WAV以进行播放

时间:2010-09-28 06:45:41

标签: .net audio naudio

我正在尝试使用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进行播放的其他库很棒。

1 个答案:

答案 0 :(得分:1)

只有当你处理WaveFileWriter时它才会返回到WAV头并填充正确数量的数据字节(在每次调用WriteData时保存它)。但是,根据您的需要,您最好自定义WaveFileWriter,以确保数据字节值保持最新。我正在考虑将此作为未来版本的NAudio的选项添加