借助naudio 进行编辑VB.NET

ops/2025/3/3 4:28:54/

好吧,有好多软件可以实现;

好久前了,忘得

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


http://www.ppmy.cn/ops/162681.html

相关文章

ffmpeg avformat_open_input的作用

1. avformat_open_input 的作用 avformat_open_input 是 FFmpeg 中用于打开输入文件或输入设备的函数。它的主要作用是初始化输入文件或设备的上下文&#xff08;AVFormatContext&#xff09;&#xff0c;并准备好从输入源读取数据。 2. avformat_open_input 的功能 打开输入文…

docker创建nginx

docker run -d -p 8080:80 --name my-nginx-container nginx docker&#xff1a;命令 run&#xff1a;命令 -d&#xff1a;在后台运行容器 -p&#xff1a;8080:80&#xff1a;将容器内部的80端口映射到宿主机的8080端口。 --name my-nginx-container&#xff1a;为容器指定一个…

高防IP能够给网站带来哪些好处?

随着网络攻击的复杂性和频繁攻击&#xff0c;企业需要保障自身网站和数据信息的安全性&#xff0c;确保业务可以持续稳定的运行&#xff0c;高防IP作为一种网络安全服务&#xff0c;可以帮助企业抵御一定的网络攻击&#xff0c;那么高防IP能够给网站带来哪些好处呢&#xff1f;…

ORM Bee V2.5.2.x 发布,支持 CQRS; sql 性能分析;更新 MongoDB ORM分片

Bee, 一个具有分片功能的 ORM 框架. Bee Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) 小巧玲珑&#xff01;仅 940K, 还不到 1M, 但却是功能强大&#xff01; V2.5.2 (2025・LTS 版) 开发中... **2.5.2.1 新年 ** 支持 Mong…

INT202 Complexity of Algroithms 算法的复杂度

文章目录 1. 前言1.1 算法&#xff08;Algorithms&#xff09;和数据结构&#xff08;Data Structure&#xff09;1.2 什么是好的算法&#xff1f;1.3 算法分析1.3.1 实验分析&#xff08;Experimental Analysis&#xff09;1.3.2 理论分析1.3.2.1 伪代码&#xff08;Pseudo-co…

算法(三)——最大公约数、最小公倍数、同余原理

文章目录 最大公约数、最小公倍数、同余原理最大公约数最小公倍数同余原理 最大公约数、最小公倍数、同余原理 最大公约数 最大公约数的计算可以采用 欧几里得算法&#xff08;辗转相除法&#xff09;&#xff0c;基本思想是&#xff1a;两个整数的最大公约数等于其中较小的数…

【蓝桥杯】每天一题,理解逻辑(1/90)【Leetcode 移动零】

文章目录 题目解析讲解算法原理【双指针算法思路】(数组下标充当指针)如何划分和执行过程大致 代码详情 题目解析 题目链接&#xff1a;https://leetcode.cn/problems/move-zeroes/description/ 题目意思解析 把所有的零移动到数组的末尾保持非零元素的相对顺序 理解了这两层…

Django模型管理器/QuerySet 常见的方法

模型管理器/QuerySet 常见的方法 get([**kwargs]) 方法 用途&#xff1a;获取满足条件的唯一对象。参数&#xff1a;关键字参数&#xff0c;指定查询条件。返回值&#xff1a;模型对象。异常&#xff1a;如果找到多个对象或未找到对象&#xff0c;将分别抛出 MultipleObjects…