0

我正在尝试使用 NAudio 库在我的应用程序中使用 Media Soundplayer 进行实际播放的某些音效的内联转换。(我发现 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:波头已损坏。在 System.Media.SoundPlayer.ValidateSoundData(Byte[] data) 在 System.Media.SoundPlayer.LoadAndPlay(Int32 flags) 在 System.Media.SoundPlayer.PlaySync() 在 NAudioConvert.ConvertAudio.Playfile(Stream ms) 在 C:\ Development\Spikes\NAudioConvert\ConvertAudio.vb:line 78

关于这个有什么提示吗?或者我可以用来将一些非常小的 MP3 文件转换为 WAV 进行播放的另一个库会很棒。

4

1 回答 1

1

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

于 2010-09-29T06:37:47.067 回答