【问题标题】:Convert MP3 to WAV in Memorystream for Playback with System.Media.Soundplayer在 Memorystream 中将 MP3 转换为 WAV 以使用 System.Media.Soundplayer 进行播放
【发布时间】:2010-09-29 14:37:47
【问题描述】:

我正在尝试使用 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(字节 [] 数据) 在 System.Media.SoundPlayer.LoadAndPlay(Int32 标志) 在 System.Media.SoundPlayer.PlaySync() 在 C:\Development\Spikes\NAudioConvert\ConvertAudio.vb:line 78 中的 NAudioConvert.ConvertAudio.Playfile(Stream ms) 处

对此有什么建议吗?或者我可以使用另一个库将一些非常小的 MP3 文件转换为 WAV 进行播放会很棒。

【问题讨论】:

    标签: .net audio naudio


    【解决方案1】:

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

    【讨论】:

    • 谢谢马克,我会看看我该怎么做:-)
    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 2017-07-06
    • 2012-02-08
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多