Как изменить громкость wav-ресурса с помощью NAudio?

В моем приложении я воспроизводю два звуковых файла, это файлы Wave, два ресурса, один для действия «Успех», а другой для «Ошибки».

Поэтому для воспроизведения я делаю это:

My.Computer.Audio.Play(My.Resources.Success, AudioPlayMode.Background)

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

Я погуглил его для Naudio и других вопросов StackOverFlow, таких как мой, и я заметил, что библиотека NAudio может выполнять эту работу, проблема в том, что все образцы написаны на C #, а также имеют ультрапрофессиональный код, поэтому я действительно не понял, как я могу изменить объем моих файлов wav.

Я работаю в VB.NET.

Если вам нужна дополнительная информация, вот библиотека NAudio: http://naudio.codeplex.com/releases/view/96875

А вот интересная часть DemoApp от NAudio, я думаю, вот как громкость увеличивается или уменьшается ... но я не уверен:

        namespace NAudioDemo.AudioPlaybackDemo

        this.fileWaveStream = plugin.CreateWaveStream(fileName);
        var waveChannel =  new SampleChannel(this.fileWaveStream, true);
        this.setVolumeDelegate = (vol) => waveChannel.Volume = vol;
        waveChannel.PreVolumeMeter += OnPreVolumeMeter;

        var postVolumeMeter = new MeteringSampleProvider(waveChannel);
        postVolumeMeter.StreamVolume += OnPostVolumeMeter;

person ElektroStudios    schedule 10.07.2013    source источник


Ответы (2)


Если вы можете получить свой ресурс как поток, вы можете использовать WaveFileReader для его загрузки, а затем передать его в SampleChannel, чтобы вы могли настроить громкость. MeteringSampleProvider не нужен.

person Mark Heath    schedule 12.07.2013
comment
Спасибо, но я смог выполнить только первый шаг: Общедоступный волновой файл Как новый NAudio.Wave.WaveFileReader(C:\Success.wav), я не знаю, как сделать следующий шаг. - person ElektroStudios; 12.07.2013
comment
следующий шаг такой же, как показано в вашем вопросе - передайте его в конструктор SampleChannel. Затем убедитесь, что вы передаете этот сэмпл-канал в свой WaveOut для воспроизведения, иначе настройка его громкости не будет иметь никакого эффекта. - person Mark Heath; 15.07.2013

Расширенное решение:

#Region " NAudio "

Public Class NAudio_Helper

' [ NAudio ]
'
' // By Elektro H@cker
'
' Instructions:
' 1. Add a reference for the "NAudio.dll" file into the project.
'
' Examples:
'
' Dim Stream As NAudio.Wave.WaveFileReader = New NAudio.Wave.WaveFileReader(File)
'
' Set_Volume(Stream, 0.5)
' Play_Sound(Stream, 1)
' Play_Sound(My.Resources.AudioFile)
' Play_Sound("C:\File.wav")


' Play Sound (File)
Private Sub Play_Sound(ByVal File As String, _
                       Optional ByVal Volume As Single = Nothing)

    Dim Wave As New NAudio.Wave.WaveOut

    Select Case File.Split(".").Last.ToLower
        Case "aiff"
            Wave.Init(New NAudio.Wave.AiffFileReader(File))
        Case "mp3"
            Wave.Init(New NAudio.Wave.Mp3FileReader(File))
        Case "wav"
            Wave.Init(New NAudio.Wave.WaveFileReader(File))
        Case Else
            Wave.Init(New NAudio.Wave.BlockAlignReductionStream(NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(New NAudio.Wave.AudioFileReader(File))))
    End Select

    If Not Volume = Nothing Then Wave.Volume = Volume
    Wave.Play()

End Sub

' Play Sound (MemoryStream)
Private Sub Play_Sound(ByVal Stream As IO.MemoryStream, _
                       Optional ByVal Volume As Single = Nothing)

    Dim Wave As New NAudio.Wave.WaveOut
    Wave.Init(New NAudio.Wave.BlockAlignReductionStream(NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(New NAudio.Wave.WaveFileReader(Stream))))
    If Not Volume = Nothing Then Wave.Volume = Volume
    Wave.Play()

End Sub

' Play Sound (Unmanaged MemoryStream)
Private Sub Play_Sound(ByVal Stream As IO.UnmanagedMemoryStream, _
                       Optional ByVal Volume As Single = Nothing)

    Dim Wave As New NAudio.Wave.WaveOut
    Wave.Init(New NAudio.Wave.BlockAlignReductionStream(NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(New NAudio.Wave.WaveFileReader(Stream))))
    If Not Volume = Nothing Then Wave.Volume = Volume
    Wave.Play()

End Sub

' Play Sound (NAudio Stream)
Private Sub Play_Sound(ByVal NAudio_Stream As Object, _
                       Optional ByVal Volume As Single = Nothing)

    Dim Wave As New NAudio.Wave.WaveOut
    Wave.Init(NAudio_Stream)
    If Not Volume = Nothing Then Wave.Volume = Volume
    Wave.Play()

End Sub

' Set Volume (NAudio Stream)
Private Function Set_Volume(ByVal NAudio_Stream As Object, ByVal Volume As Single) _
As NAudio.Wave.WaveOut

    Dim Wave As New NAudio.Wave.WaveOut
    Wave.Init(NAudio_Stream)
    Wave.Volume = Volume
    Return Wave

End Function

End Class

#End Region
person ElektroStudios    schedule 13.07.2013
comment
WaveOut.Volume больше не рекомендуется. Этот ответ устарел. - person stricq; 20.03.2016