Converta mp3 em wav in MemoryStream para reprodução com System.media.SoundPlayer
Pergunta
Estou tentando usar a biblioteca Naudio para fazer alguma conversão em linha de alguns efeitos sonoros para reprodução com meu aplicativo usando o mídia SoundPlayer para a reprodução real. (Acho que a reprodução de Naudio é um pouco nervosa para a reprodução direta, daí a conversão)
Eu realmente não quero extrair os arquivos para disco para reprodução, em vez disso, gostaria de convertê -los em WAV na memória usando um MemoryStream.
Olhando para a fonte de Naudio, parece que ele não escreve alguns dos dados para o fluxo até que sejam descartados, mas isso invalida o MemoryStream. Devo refazer isso ou estou fazendo tudo errado?
Usando o seguinte código, recebo um InvalidHeader.
Se eu substituir o código e escrever o arquivo no disco e descartar, então recarregue para um fluxo está tudo bem (mas meio que derrota o objetivo)
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.InvalidoPoperationException: O cabeçalho da onda está corrompido. em system.media.soundplayer.validatesoundData (byte [] dados) em system.media.soundplayer.loadandplay (sinalizadores int32) em system.media.soundplayer.playsync () em naudioconvert.convertaudio.playfile (stream ms) em c: Desenvolvimento Spikes Naudioconvert Convertaudio.vb: Linha 78
Alguma dica sobre isso? Ou talvez outra biblioteca que eu pudesse usar para converter alguns arquivos MP3 muito pequenos em WAV para reprodução seria ótima.
Solução
Somente quando você descarta o WaveFileWriter que ele remonta ao cabeçalho WAV e preenche o número correto de bytes de dados (salva fazê -lo em todas as chamadas para o Writedata). No entanto, para suas necessidades, você será melhor fabricar um WaveFileWriter personalizado que mantém os bytes de dados atualizados. Estou pensando em adicionar isso como uma opção para uma versão futura do Naudio