Конвертируйте MP3 в WAV в Memorystream для воспроизведения с System.Media.Soundplayer - PullRequest
0 голосов
/ 28 сентября 2010

Я пытаюсь использовать библиотеку NAudio для преобразования InLine некоторых звуковых эффектов для воспроизведения с моим приложением, использующим Media Soundplayer для реального воспроизведения. (Я считаю, что воспроизведение NAudio немного нервное для прямого воспроизведения, следовательно, преобразование)

Я действительно не хочу извлекать файлы на диск для воспроизведения, вместо этого я бы хотел преобразовать их в WAV в памяти, используя memoryStream.

Глядя на источник 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 () в NAudioConvert.ConvertAudio.Playfile (поток мс) в C: \ Development \ Spikes \ NAudioConvert \ ConvertAudio.vb: строка 78

Какие-нибудь советы по этому поводу? или, может быть, подойдет другая библиотека, которую я могу использовать для преобразования очень маленьких файлов MP3 в формат WAV для воспроизведения.

1 Ответ

1 голос
/ 29 сентября 2010

только когда вы утилизируете WaveFileWriter, он возвращается к заголовку WAV и заполняет правильное количество байтов данных (сохраняет это при каждом вызове WriteData). Тем не менее, для ваших нужд вам лучше всего создать пользовательский WaveFileWriter, который поддерживает актуальность данных в байтах. Я подумываю добавить это в качестве опции для будущей версии NAudio

...