Converta mp3 em wav in MemoryStream para reprodução com System.media.SoundPlayer

StackOverflow https://stackoverflow.com/questions/3810305

  •  25-09-2019
  •  | 
  •  

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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top