2

编辑:在下面的自我回答中解决。

我已经查看了所有内容,但找不到任何对使用音量控制播放音频文件有用的东西。我试过XNA;SLIMDX 和“Microsoft.VisualBasic.Devices.Audio”,但没有任何帮助。我发现有音量控制的选项太复杂了,我不知道如何使用,而且我目前的方法除了播放(有或没有循环的背景,或暂停执行直到结束)之外,不能让你做任何事情玩)并停止。

这是我当前的代码:

Dim AD As New Microsoft.VisualBasic.Devices.Audio
   Sub Play()
        Dim af() As Byte = IO.File.ReadAllBytes("music.wav")
        AD.Play(af, AudioPlayMode.BackgroundLoop)
   End Sub

这会在后台循环播放“music.wav”,但我无法暂停/查找它或控制音量。有没有简单的方法(如上)从缓冲区播放音频文件并控制音量?我已经查看了所有内容,但没有找到适合我的项目的内容。

系统:Win7 64位

VS版本:2010

语言:VB.net

哦还有一件事,首先缓冲音频也是我的解决方案所需要的(正如您在我当前的代码中看到的那样)

有人对此有解决方案吗?:)

4

4 回答 4

4

经过一番搜索,我找到了答案,所以这是我为我的问题找到的解决方案:

下载Naaudio并将引用添加到您的项目中。

然后下面的代码是如何使用它从缓冲区加载音频:

Dim Wave1 As New NAudio.Wave.WaveOut 'Wave out device for playing the sound

Dim xa() As Byte = IO.File.ReadAllBytes("C:\YourPath\YourWave.wav") 'Your Buffer

Sub PlaySound()

        Dim data As New IO.MemoryStream(xa) 'Data stream for the buffer

        Wave1.Init(New NAudio.Wave.BlockAlignReductionStream(NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(New NAudio.Wave.WaveFileReader(data))))

        Wave1.Volume = 0.1 'Sets the Volume to 10%

        Wave1.Play()

End Sub

WaveFileReader可以更改为您需要的任何阅读器(即用于“.mp3”文件的 MP3 阅读器)以加载您的音频文件,但代码按原样用于加载“.wav”文件。

哦,还有,别忘了

WaveOut.Dispose()

当你完成以避免错误时。

我希望我的研究对某人有所帮助:)

于 2012-09-28T04:58:25.320 回答
1

您是否尝试过使用媒体播放器控件

于 2012-09-26T20:29:53.577 回答
0

嘿,我已经创建了一个类来处理 wave(pcm) 文件,希望这会对你有所帮助。它尚未完成,但可能会有所帮助。

Imports System.IO

导入 System.Runtime.InteropServices 导入 System.ComponentModel

公共结构 WaveHeader Public Chunk As Char() Public ChunkSize As Int32 Public Format As Char() Public SubChunk1 As Char() Public SubChunk1Size As Int32 Public AudioFormat As Int16 Public Channels As Int16 Public SampleRate As Int32 Public ByteRate As Int32 Public BlockAlign As Int16 Public BitsPerSample As Int16 Public SubChunk2 As Char() Public SubChunk2Size As Int32 结束结构

公共枚举状态 无 播放 暂停 停止 结束 枚举

公共课wav

Private watch As New Stopwatch
Private WithEvents timer As New Timer

Private mystate As State = State.None
Private myheader As WaveHeader

Private myurl As String = Nothing
Private mytotaltime As Double = 0

Private Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal process As IntPtr, ByVal minimumWorkingSetSize As Integer, ByVal maximumWorkingSetSize As Integer) As Integer


Event OnPlayStateChange(ByVal e As State)


Public Shared Sub FlushMemory()
    GC.Collect()
    GC.WaitForPendingFinalizers()
    If (Environment.OSVersion.Platform = PlatformID.Win32NT) Then
        SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1)
    End If
End Sub

Sub New()
    timer.Interval = 1
    timer.Start()
End Sub

Function readheader(ByVal url As String)
    Dim fh As WaveHeader
    Dim stream As New FileStream(url, FileMode.Open)
    Dim br As New BinaryReader(stream)
    fh.Chunk = br.ReadChars(4)
    fh.ChunkSize = br.ReadInt32
    fh.Format = br.ReadChars(4)
    fh.SubChunk1 = br.ReadChars(4)
    fh.SubChunk1Size = br.ReadInt32
    fh.AudioFormat = br.ReadInt16
    fh.Channels = br.ReadInt16
    fh.SampleRate = br.ReadInt32
    fh.ByteRate = br.ReadInt32
    fh.BlockAlign = br.ReadInt16
    fh.BitsPerSample = br.ReadInt16
    For i = 1 To fh.SubChunk1Size - 16
        br.ReadByte()
    Next
    fh.SubChunk2 = br.ReadChars(4)
    fh.SubChunk2Size = br.ReadInt32
    br.Close()
    stream.Close()

    Return Header2String(fh)
End Function

Function Header2String(ByVal fh As WaveHeader)
    Dim t As String = ""
    t &= "Chunk             " & fh.Chunk & Environment.NewLine
    t &= "Chunksize         " & fh.ChunkSize & Environment.NewLine
    t &= "Format            " & fh.Format & Environment.NewLine
    t &= "subChunk1         " & fh.SubChunk1 & Environment.NewLine
    t &= "subchunk1size     " & fh.SubChunk1Size & Environment.NewLine
    t &= "PCM               " & fh.AudioFormat & Environment.NewLine
    t &= "Channels          " & fh.Channels & Environment.NewLine
    t &= "Samplerate        " & fh.SampleRate & Environment.NewLine
    t &= "ByteRate          " & fh.ByteRate & Environment.NewLine
    t &= "Block Align       " & fh.BlockAlign & Environment.NewLine
    t &= "Bits/Sample       " & fh.BitsPerSample & Environment.NewLine
    t &= "subChunk2         " & fh.SubChunk2 & Environment.NewLine
    t &= "subChunk2size     " & fh.SubChunk2Size & Environment.NewLine
    Return t
End Function

Function StopAudio()
    My.Computer.Audio.Stop()
    watch.Stop()
    watch.Reset()
    If PlayState = State.Playing Or PlayState = State.Paused Then
        mystate = State.Stopped
    End If
    Return 0
End Function

Function playAudio(ByVal url As String)
    If My.Computer.FileSystem.FileExists(url) Then
        Try
            My.Computer.Audio.Play(SongStream(url, 0), AudioPlayMode.Background)
            'My.Computer.Audio.Play(fast(url, 0, CDbl(form1.TextBox4.Text)), AudioPlayMode.Background)

            watch.Restart()
            mystate = State.Playing
            RaiseEvent OnPlayStateChange(State.Playing)
            myurl = url
        Catch ex As Exception
            Throw New Exception("Error! Can't Play The File.")
            'MsgBox(ex.Message)
        End Try
    Else
        Throw New Exception("File Not Exist.")
    End If
    Return 0
End Function

Function PauseAudio()
    If PlayState = State.Playing Then
        My.Computer.Audio.Stop()
        watch.Stop()
        mystate = State.Paused
        RaiseEvent OnPlayStateChange(State.Paused)
    End If
    Return 0
End Function

Function ResumeAudio()
    If PlayState = State.Paused And IsNothing(URL) = False Then
        Try
            My.Computer.Audio.Play(SongStream(URL, time), AudioPlayMode.Background)
            watch.Start()
            mystate = State.Playing
            RaiseEvent OnPlayStateChange(State.Playing)
        Catch : End Try
    End If
    Return 0
End Function


Private Function fast(ByVal url As String, ByVal position As Double, ByVal speed As Single)
    Dim fh As New WaveHeader
    Dim stream As New FileStream(url, FileMode.Open)
    Dim br As New BinaryReader(stream)

    fh.Chunk = br.ReadChars(4)
    fh.ChunkSize = br.ReadInt32
    fh.Format = br.ReadChars(4)
    fh.SubChunk1 = br.ReadChars(4)
    fh.SubChunk1Size = br.ReadInt32
    fh.AudioFormat = br.ReadInt16
    fh.Channels = br.ReadInt16
    fh.SampleRate = br.ReadInt32
    fh.ByteRate = br.ReadInt32
    fh.BlockAlign = br.ReadInt16
    fh.BitsPerSample = br.ReadInt16
    fh.SampleRate *= speed
    fh.ByteRate *= speed

    For i = 1 To fh.SubChunk1Size - 16
        br.ReadChar()
    Next

    stream.Position = fh.SubChunk1Size + 20

    fh.SubChunk2 = br.ReadChars(4)
    fh.SubChunk2Size = br.ReadInt32

    If fh.Channels = 6 Then
        fh.Channels = 2
        fh.BlockAlign = fh.Channels * fh.BitsPerSample / 8
        fh.SampleRate = fh.SampleRate * (6 / fh.Channels)
    End If

    position = Math.Round(CInt(position / 1000) * fh.ByteRate)
    If position >= fh.SubChunk2Size Then
        Throw New Exception("Songs isn't that long")
    End If

    mytotaltime = Math.Round(fh.SubChunk2Size / fh.ByteRate)

    fh.SubChunk2Size -= position

    Dim header() As Byte = {Asc("R"), Asc("I"), Asc("F"), Asc("F"), 0, 0, 0, 0, Asc("W"), Asc("A"), Asc("V"), Asc("E"), Asc("f"), Asc("m"), Asc("t"), Asc(" "), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Asc("d"), Asc("a"), Asc("t"), Asc("a"), 0, 0, 0, 0}
    BitConverter.GetBytes(fh.SubChunk2Size).CopyTo(header, 40)
    BitConverter.GetBytes(fh.BitsPerSample).CopyTo(header, 34)
    BitConverter.GetBytes(fh.BlockAlign).CopyTo(header, 32)
    BitConverter.GetBytes(fh.ByteRate).CopyTo(header, 28)
    BitConverter.GetBytes(fh.SampleRate).CopyTo(header, 24)
    BitConverter.GetBytes(fh.Channels).CopyTo(header, 22)
    BitConverter.GetBytes(fh.AudioFormat).CopyTo(header, 20)
    BitConverter.GetBytes(16).CopyTo(header, 16)
    BitConverter.GetBytes(fh.SubChunk2Size + 36).CopyTo(header, 4)
    myheader = fh
    Dim audio(fh.SubChunk2Size + 44) As Byte
    header.CopyTo(audio, 0)
    stream.Position = position
    br.ReadBytes(fh.SubChunk2Size).CopyTo(audio, 44)

    br.Dispose()
    stream.Dispose()
    br = Nothing
    stream = Nothing

    Return audio
End Function




Private Function SongStream(ByVal url As String, ByVal position As Double)
    Dim fh As New WaveHeader
    Dim stream As New FileStream(url, FileMode.Open)
    Dim br As New BinaryReader(stream)

    fh.Chunk = br.ReadChars(4)
    fh.ChunkSize = br.ReadInt32
    fh.Format = br.ReadChars(4)
    fh.SubChunk1 = br.ReadChars(4)
    fh.SubChunk1Size = br.ReadInt32
    fh.AudioFormat = br.ReadInt16
    fh.Channels = br.ReadInt16
    fh.SampleRate = br.ReadInt32
    fh.ByteRate = br.ReadInt32
    fh.BlockAlign = br.ReadInt16
    fh.BitsPerSample = br.ReadInt16

    For i = 1 To fh.SubChunk1Size - 16
        br.ReadChar()
    Next

    stream.Position = fh.SubChunk1Size + 20

    fh.SubChunk2 = br.ReadChars(4)
    fh.SubChunk2Size = br.ReadInt32

    If fh.Channels = 6 Then
        fh.Channels = 2
        fh.BlockAlign = fh.Channels * fh.BitsPerSample / 8
        fh.SampleRate = fh.SampleRate * (6 / fh.Channels)
    End If

    position = Math.Round(CInt(position / 1000) * fh.ByteRate)
    If position >= fh.SubChunk2Size Then
        Throw New Exception("Songs isn't that long")
    End If

    mytotaltime = Math.Round(fh.SubChunk2Size / fh.ByteRate)

    fh.SubChunk2Size -= position

    Dim header() As Byte = {Asc("R"), Asc("I"), Asc("F"), Asc("F"), 0, 0, 0, 0, Asc("W"), Asc("A"), Asc("V"), Asc("E"), Asc("f"), Asc("m"), Asc("t"), Asc(" "), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Asc("d"), Asc("a"), Asc("t"), Asc("a"), 0, 0, 0, 0}
    BitConverter.GetBytes(fh.SubChunk2Size).CopyTo(header, 40)
    BitConverter.GetBytes(fh.BitsPerSample).CopyTo(header, 34)
    BitConverter.GetBytes(fh.BlockAlign).CopyTo(header, 32)
    BitConverter.GetBytes(fh.ByteRate).CopyTo(header, 28)
    BitConverter.GetBytes(fh.SampleRate).CopyTo(header, 24)
    BitConverter.GetBytes(fh.Channels).CopyTo(header, 22)
    BitConverter.GetBytes(fh.AudioFormat).CopyTo(header, 20)
    BitConverter.GetBytes(16).CopyTo(header, 16)
    BitConverter.GetBytes(fh.SubChunk2Size + 36).CopyTo(header, 4)
    myheader = fh
    Dim audio(fh.SubChunk2Size + 44) As Byte
    header.CopyTo(audio, 0)
    stream.Position = position
    br.ReadBytes(fh.SubChunk2Size).CopyTo(audio, 44)

    br.Dispose()
    stream.Dispose()
    br = Nothing
    stream = Nothing

    Return audio
End Function

区域“财产”

<Browsable(False)> ReadOnly Property PlayState
    Get
        Return mystate
    End Get
End Property

<Browsable(False)> ReadOnly Property URL
    Get
        Return myurl
    End Get
End Property

ReadOnly Property TotalTime
    Get
        Return mytotaltime
    End Get
End Property

ReadOnly Property time
    Get
        Return watch.ElapsedMilliseconds
    End Get
End Property

ReadOnly Property timestamp
    Get
        Return watch.Elapsed.ToString
    End Get
End Property

结束区域

Private Sub timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles timer.Tick
    If Not TotalTime = 0 Then
        If TotalTime <= time / 1000 Then
            watch.Stop()
            watch.Reset()
            mystate = State.Finished
            RaiseEvent OnPlayStateChange(State.Finished)
        End If
    End If
    FlushMemory()
End Sub


ReadOnly Property SongHeader As WaveHeader
    Get
        Return myheader
    End Get
End Property

结束类

公共类频谱

Dim h As WaveHeader

Function readheader(ByVal url As String)
    Dim fh As WaveHeader
    Dim stream As New FileStream(url, FileMode.Open)
    Dim br As New BinaryReader(stream)
    fh.Chunk = br.ReadChars(4)
    fh.ChunkSize = br.ReadInt32
    fh.Format = br.ReadChars(4)
    fh.SubChunk1 = br.ReadChars(4)
    fh.SubChunk1Size = br.ReadInt32
    fh.AudioFormat = br.ReadInt16
    fh.Channels = br.ReadInt16
    fh.SampleRate = br.ReadInt32
    fh.ByteRate = br.ReadInt32
    fh.BlockAlign = br.ReadInt16
    fh.BitsPerSample = br.ReadInt16
    For i = 1 To fh.SubChunk1Size - 16
        br.ReadByte()
    Next
    fh.SubChunk2 = br.ReadChars(4)
    fh.SubChunk2Size = br.ReadInt32
    h = fh
    Return br.ReadBytes(fh.SubChunk2Size)
End Function


Function showit()
    Dim b As New Bitmap(500, 200)
    Dim g As Graphics = Graphics.FromImage(b)
    Dim d() As Byte = readheader("songs\s.wav")
    'Dim t As Integer = d.Count
    For i = 0 To d.Count - 1
        Dim x = CInt((i / d.Count) * 500)
        Dim y = CInt(d(i).ToString) - 200
        g.DrawLine(Pens.Black, x, 0, x, y)
    Next

    'g.FillEllipse(Brushes.Black, 0, 0, 500, 300)
    Return b.Clone
End Function

结束类

于 2013-12-10T23:04:34.950 回答
0

由于似乎很少有关于在 VB.NET 中使用 naudio 的文档,而不是随处可见的 C# 示例,并且根据@user1666788 的评论,这是一种让它播放 VB.NET 的 MP3 文件的简单方法,而不是WAV。

Public Shared Wave1 As New NAudio.Wave.WaveOut 'Wave out device for playing the sound

Public Sub btn_PlayPause_Click(sender As Object, e As EventArgs) Handles btn_PlayPause.Click

        Dim file As String = "C:\test.mp3"
        Dim data As New NAudio.Wave.Mp3FileReader(file)
        Wave1.Init(data)
        Wave1.Play()
End Sub
于 2018-03-01T13:37:52.333 回答