2010-09-28 4 views
0

J'essaie d'utiliser la bibliothèque NAudio pour faire une conversion InLine de certains effets sonores pour la lecture avec mon application en utilisant le Media Soundplayer pour la lecture réelle. (Je trouve la lecture NAudio est un peu nerveux pour la lecture directe, d'où la conversion)Convertir MP3 en WAV dans Memorystream pour la lecture avec System.Media.Soundplayer

Je ne veux vraiment pas extraire les fichiers sur disque à la place je voudrais les convertir en WAV en mémoire en utilisant un memoryStream.

Si vous regardez la source NAudio, il apparaît qu'elle n'écrit pas certaines données dans le flux tant qu'elles ne sont pas éliminées, ce qui invalide le MemoryStream. Devrais-je retravailler cela ou est-ce que je fais tout faux?

en utilisant le code suivant je reçois un invalidheader.

Si je remplace le code et écrire le fichier sur le disque et disposer ensuite recharger un tout cours d'eau est bien (mais il va à l'encontre un peu le but)

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: L'en-tête de vague est corrompu. à System.Media.SoundPlayer.ValidateSoundData (byte []) données à System.Media.SoundPlayer.LoadAndPlay (drapeaux Int32) à System.Media.SoundPlayer.PlaySync() à NAudioConvert.ConvertAudio.Playfile (ms Stream) dans C: \ Développement \ Spikes \ NAudioConvert \ ConvertAudio.vb: ligne 78

Des conseils à ce propos? ou peut-être une autre bibliothèque que je pourrais utiliser pour convertir de très petits fichiers MP3 en WAV pour la lecture serait super.

Répondre

1

Ce n'est que lorsque WaveFileWriter dispose de son ancienneté que l'on retourne à l'en-tête WAV et que l'on remplit le bon nombre d'octets de données (il enregistre à chaque appel de WriteData). Toutefois, pour vos besoins, il est préférable de créer un WaveFileWriter personnalisé qui conserve la valeur des octets de données à jour. J'envisage d'ajouter ceci comme une option pour une future version de NAudio

+0

Merci Mark, je vais voir comment je peux y arriver :-) –

Questions connexes