好吧,有好多软件可以实现;
好久前了,忘得
Naudio 使用 下载NAUDIO Imports NAudio.Wave录音
1.设置绘冲区大小
BufferMilliseconds 设置缓冲区大小
缓冲区太小,绘冲区太大,导致 声音断开或是重复过快wav.BufferMilliseconds = 200 '缓冲区大小= ; 200 = 6400;100 = 3200wav.NumberOfBuffers = 12 '缓冲区数量wav.WaveFormat = New WaveFormat(16000, 16, 1) '格式 160002设置录音回调函数AddHandler wav.DataAvailable, AddressOf waveIn_DataAvailablewav.StartRecording() '录音启动3添加回调函数
Private Sub waveIn_DataAvailable(sender As Object, e As WaveInEventArgs)
End Sub函数
开始录音
wav.StartRecording() '录音启动
关闭录音
wav.StopRecording()获取录音数据(回调函数中使用
(global)' 10分钟录音数据Dim WavMaxLen As Integer = 16000 * 60 * 10
Dim WavData16(WavMaxLen) As Int16回调函数中 e.BytesRecordedDim b = PosBuffer.BlockCopy(e.Buffer, 0, WavData16, b, e.BytesRecorded) '偏移量为字节' e.Buffer.CopyTo(WavBuffer, Pos)Dim b = PosBuffer.BlockCopy(e.Buffer, 0, WavData16, b, e.BytesRecorded) '偏移量为字节Pos = Pos + e.BytesRecorded' Debug.Print("*********pos:" & Pos)If Pos > 6400 Then'绘画Dim tmp = (Pos / 2) - 6400' Debug.Print("*********tmp:" & tmp)WavDraw.DrawRecordWav(Pens.Red, WavData16, tmp, 6400)'For i = 0 To 10' Debug.Print(WavData16(tmp + i))'NextEnd IfIf Pos > WavMaxLen Thenwav.StopRecording()MsgBox("10min is over")End If'e.Buffer, e.BytesRecorded
'不同比例尺绘图
'将数据绘制到窗口中
Imports System.IOPublic Class DrawApiConst Wav16Height As Integer = 255 * 255' Public IdataSize As Size '数据尺寸Public IPictureControl As PictureBoxPublic Ibmp As BitmapPrivate nWidth As DoublePrivate nHeight As DoublePrivate Igrap As GraphicsDim Yscale As Integer = 1 '缩放大小Dim xpos As Integer = 0 '位置Dim IFudu As Integer = 1 '幅值大小Dim IWindowLen As Integer = 0Dim IPenColor As PenDim Idata16 As Int16()Dim IsDrawData As Boolean = False''' <param name="PictureControl"></param> 绘制的图像框Public Sub New(PictureControl As PictureBox, Optional windowslen As Integer = 6400)IWindowLen = windowslenIPictureControl = PictureControlIbmp = New Bitmap(PictureControl.Width, PictureControl.Height, Imaging.PixelFormat.Format24bppRgb)Igrap = Graphics.FromImage(Ibmp)'Igrap.Clear(Color.White)End SubPublic Sub SetWindowLen(Wlen As Integer)IWindowLen = WlenEnd Sub'绘线Public Sub DrawLine(Pcolor As Pen, P1 As Point, P2 As Point)Dim NewP1 As PointDim NewP2 As PointDim NewWidth, NewHeigh As DoubleNewWidth = nWidth * YscaleNewHeigh = nHeight * Yscale * IFuduNewP1 = New Point(P1.X * NewWidth, P1.Y * NewHeigh + IPictureControl.Height / 2)NewP2 = New Point(P2.X * NewWidth, P2.Y * NewHeigh + IPictureControl.Height / 2)Igrap.DrawLine(Pcolor, NewP1, NewP2)If (Not IsDrawData) ThenIPictureControl.Image = IbmpEnd IfEnd Sub'绘制文件Public Function DrawWaveFile(filename As String) As Int16()Dim fs As FileStreamfs = New FileStream(filename, FileMode.Open)ReDim Idata16(fs.Length / 2)Dim buff(fs.Length) As Bytefs.Read(buff, 44, fs.Length - 44)Buffer.BlockCopy(buff, 0, Idata16, 0, fs.Length)DrawRecordWav(Pens.Blue, Idata16, 0, IWindowLen)fs.Close()Return Idata16End Function'绘制录音数据Public Function DrawRecordWav(PenColor As Pen, data16() As Int16, start As Integer, len As Integer)nWidth = IPictureControl.Width / IWindowLennHeight = IPictureControl.Height / (255 * 10)Igrap.Clear(IPictureControl.BackColor)Idata16 = data16IPenColor = PenColorIsDrawData = TrueDim SPoint, Epoint As PointFor i = 0 To IWindowLenEpoint.X = iEpoint.Y = data16(start + i)DrawLine(PenColor, SPoint, Epoint)SPoint.X = (i + 1)SPoint.Y = 0NextIPictureControl.Image = IbmpIsDrawData = FalseEnd Function'绘制WAV数据'Public Function DrawWavData16(PenColor As Pen, data16() As Int16)' nWidth = IPictureControl.Width / IWindowLen' nHeight = IPictureControl.Height / Wav16Height' Igrap.Clear(IPictureControl.BackColor)' Idata16 = data16' IPenColor = PenColor' IsDrawData = True' Dim SPoint, Epoint As Point' For i = 0 To (data16.Count - 1) / Yscale' If (i + xpos) > data16.Length - 2 Then' Exit For' End If' Epoint.X = i' Epoint.Y = data16(i + xpos)' DrawLine(PenColor, SPoint, Epoint)' SPoint.X = (i + 1)' SPoint.Y = 0' Next' IPictureControl.Image = Ibmp' IsDrawData = False'End Function'放大 缩小Public Sub Scale(num As Integer)Yscale = numDrawRecordWav(Pens.Blue, Idata16, xpos, 6400)End Sub'位置Public Sub Pos(num As Integer)xpos = numDrawRecordWav(Pens.Blue, Idata16, xpos, 6400)End Sub'幅值Public Sub Fudu(num As Integer)IFudu = numDrawRecordWav(Pens.Blue, Idata16, xpos, 6400)End Sub'绘制文本Public Sub DrawText(x As Integer, y As Integer, fontsize As Integer, Text As String)Dim drawFont As New Font("Arial", fontsize)Dim drawBrush As New SolidBrush(Color.Black)Dim drawPoint As New PointF(Xtox(x), y)Igrap.DrawString(Text, drawFont, drawBrush, drawPoint)End SubPrivate Function Xtox(x As Double) As DoubleReturn x * nWidth * YscaleEnd FunctionPrivate Function YtoY(y As Double) As DoubleReturn y * IPictureControl.Height / Wav16Height * YscaleEnd FunctionPublic Sub DrawRect(pen As Pen, x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer)Dim x1pos, y1pos, x2pos, y2pos, wpos, hpos As Integerx1pos = Xtox(x1)y1pos = YtoY(y1) * IFudu + IPictureControl.Height / 2x2pos = Xtox(x2)y2pos = YtoY(y2) * IFudu + IPictureControl.Height / 2wpos = x2pos - x1poshpos = y2pos - y1posIgrap.DrawRectangle(pen, x1pos, y1pos, wpos, hpos)'IPictureControl.Image = IbmpEnd SubPublic Sub DrawPixel(pen As Pen, x As Integer, y As Integer)Igrap.DrawEllipse(pen, Convert.ToInt32(Xtox(x)), Convert.ToInt32(YtoY(y)), 5, 5)End SubPublic Sub Show()IPictureControl.Image = IbmpEnd SubEnd Class
'------------------------------------naudio 录音--------------------------------------------------------Dim wav As New WaveInPrivate Sub RecordWavCBox_CheckedChanged(sender As Object, e As EventArgs) Handles RecordWavCBox.CheckedChangedIf RecordWavCBox.Checked ThenPos = 0wav.BufferMilliseconds = 200 '缓冲区大小= ; 200 = 6400;100 = 3200wav.NumberOfBuffers = 12 '缓冲区数量wav.WaveFormat = New WaveFormat(16000, 16, 1) '格式 16000AddHandler wav.DataAvailable, AddressOf waveIn_DataAvailablewav.StartRecording() '录音启动RecordWavCBox.Text = "停止"Else'录音数据备份ReDim WavDataCopy(WavMaxLen)WavData16.CopyTo(WavDataCopy, 0)WavLen = Pos'停止录音wav.StopRecording()RecordWavCBox.Text = "录音"End IfEnd Sub'--------------------------------录音回调函数--------------------------------------------------' 10分钟录音数据Dim WavMaxLen As Integer = 16000 * 60 * 10Dim WavData16(WavMaxLen) As Int16Dim WavLen As Integer = 0 '录音数据长度 byteDim Pos As Integer = 0Private Sub waveIn_DataAvailable(sender As Object, e As WaveInEventArgs)' e.Buffer.CopyTo(WavBuffer, Pos)Dim b = PosBuffer.BlockCopy(e.Buffer, 0, WavData16, b, e.BytesRecorded) '偏移量为字节Pos = Pos + e.BytesRecordedDebug.Print("*********pos:" & Pos)If Pos > 6400 Then'绘画Dim tmp = (Pos / 2) - 6400Debug.Print("*********tmp:" & tmp)WavDraw.DrawRecordWav(Pens.Red, WavData16, tmp, 6400)For i = 0 To 10Debug.Print(WavData16(tmp + i))NextEnd IfXPosScrol.Maximum = Pos / 2XPosScrol.Value = Pos / 2Debug.WriteLine("***************")If Pos > WavMaxLen Thenwav.StopRecording()MsgBox("10min is over")End If'e.Buffer, e.BytesRecordedEnd Sub'-------------------------全部数据保存-----------------------------------------------Private Sub AllWavSavBtn_Click(sender As Object, e As EventArgs) Handles AllWavSavBtn.ClickDim FileNameStr As String = T1head.Text & T2num.Text & T3Num.TextWaveSave.WaveSaveFile("E:\" & FileNameStr & ".wav")Dim tmp(WavLen) As ByteBuffer.BlockCopy(WavData16, 0, tmp, 0, WavLen)WaveSave.WaveWriteFile(tmp, WavLen)WaveSave.CloseWaveFile()ListBox1.Items.Add("f:\" & FileNameStr & ".wav")End Sub'----------------------------------------保--存-------------------------------------------------Private Sub WavSaveBtn_Click(sender As Object, e As EventArgs) Handles SaveRecordBtn.ClickDim FileNameStr As String = T1head.Text & T2num.Text & T3Num.TextWaveSave.WaveSaveFile("f:\" & FileNameStr & ".wav")Dim StartPos As Integer = 0Dim Length As Integer = 0StartPos = XPosScrol.Value'Length = WavData16.Length / YScaleScrol.ValueLength = windowLen.TextDim tmp(Length * 2) As ByteBuffer.BlockCopy(WavData16, StartPos * 2, tmp, 0, Length * 2)WaveSave.WaveWriteFile(tmp, Length * 2)WaveSave.CloseWaveFile()ListBox1.Items.Add("f:\" & FileNameStr & ".wav")End Sub'-----------------------------原始数据片断保存------------------------------Private Sub RawWavDataSavBtn_Click(sender As Object, e As EventArgs) Handles RawWavDataSavBtn.ClickDim FileNameStr As String = T1head.Text & T2num.Text & "-" & T3Num.TextWaveSave.WaveSaveFile("f:\" & FileNameStr & ".wav")Dim StartPos As Integer = 0Dim Length As Integer = 0StartPos = XPosScrol.ValueLength = windowLen.TextDim tmp(Length * 2) As ByteBuffer.BlockCopy(WavDataCopy, StartPos * 2, tmp, 0, Length * 2)WaveSave.WaveWriteFile(tmp, Length * 2)WaveSave.CloseWaveFile()ListBox1.Items.Add("f:\" & FileNameStr & ".wav")T2num.Text = T2num.Text + 1End Sub