编辑:在下面的自我解答中解决。
我看了一遍,但是我找不到任何有用的音量控制播放音频文件。 我试过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
哦,还有一件事,首先缓冲音频是我的解决方案所需要的(正如你在我当前的代码中看到的那样)
有没有人有解决方案? :)
答案 0 :(得分:4)
经过一番搜索后我找到了答案,所以这里是我为我的问题找到的解决方案:
下载Naudio并添加对项目的引用。
然后以下代码是如何使用它从缓冲区加载音频:
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()
当你完成以避免错误时。
我希望我的研究可以帮助某人:)
答案 1 :(得分:1)
您是否尝试过使用Media Player control?
答案 2 :(得分:0)
嘿,我有一个类来处理wave(pcm)文件,希望这会对你有所帮助..它尚未完成但可能会有所帮助。
Imports System.IO
导入System.Runtime.InteropServices Imports System.ComponentModel
公共结构WaveHeader 公共块作为Char() Public ChunkSize As Int32 公共格式为Char() Public SubChunk1 As Char() Public SubChunk1Size As Int32 公共AudioFormat为Int16 公共频道作为Int16 Public SampleRate As Int32 Public ByteRate As Int32 公共BlockAlign为Int16 Public BitsPerSample As Int16 Public SubChunk2作为Char() Public SubChunk2Size As Int32 结束结构
Public Enum State 没有 播放 已暂停 停止 成品 结束枚举
Public Class 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
结束班
Public Class spactrum
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
结束班
答案 3 :(得分:0)
由于似乎没有关于在VB.NET中使用naudio的文档,而不是在任何地方都可以找到的C#示例,而且还有@ user1666788的注释,这是一种简单的方法,可以让它播放MP3文件VB.NET,而不是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