Konvertieren Sie MP3 in WAV in Memorystream für die Wiedergabe mit System.Media.Soundplayer
Frage
Ich versuche, die NAudio Bibliothek zu verwenden, um einige InLine Umwandlung einiger Soundeffekte für die Wiedergabe mit meiner Anwendung zu tun, um die Medien Soundplayer für die aktuelle Wiedergabe verwendet wird. (Ich finde NAudio Wiedergabe ist ein bisschen nervös für die direkte Wiedergabe, damit die Conversion)
Ich möchte wirklich nicht auf die Dateien auf der Festplatte zu extrahieren, anstatt um die Wiedergabe ich sie im Speicher zu WAV ist konvertieren möchte einen Memorystream verwenden.
Mit Blick auf die NAudio Quelle scheint es, dass es nicht einen Teil der Daten in den Stream schreiben, bis es angeordnet ist, aber dies entkräftet daher die Memorystream. Soll ich Nacharbeit, dass, oder bin ich das alles falsch?
mit dem folgenden Code, den ich einen invalidheader erhalten.
Wenn ich den Code ersetzen und die Datei auf die Festplatte schreiben und dann in einen Stream alles Deponieren Sie neu zu laden ist in Ordnung (aber es besiegt irgendwie den Zweck)
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: Der Wave-Header ist beschädigt. bei System.Media.SoundPlayer.ValidateSoundData (Byte [] data) bei System.Media.SoundPlayer.LoadAndPlay (Int32 flags) bei System.Media.SoundPlayer.PlaySync () bei NAudioConvert.ConvertAudio.Playfile (Stream ms) in C: \ Entwicklung \ Spikes \ NAudioConvert \ ConvertAudio.vb: Zeile 78
Alle Tipps in Bezug auf das? oder vielleicht eine andere Bibliothek, dass ich verwenden könnte einige sehr kleine MP3-Dateien in WAV für die Wiedergabe zu konvertieren wäre toll.
Lösung
ist es nur, wenn Sie die WaveFileWriter entsorgen, dass es zurück in den WAV-Header und Füllungen in der richtigen Anzahl von Datenbytes geht (spart tut es bei jedem Aufruf zu Writedata). Doch für Ihre Bedürfnisse, dann werden Sie am besten dran macht eine benutzerdefinierte WaveFileWriter werden, dass die Daten-Bytes Wert auf dem neuesten Stand ist zu halten. Ich betrachte das Hinzufügen dieser als Option für eine zukünftige Version von NAudio