录音 waveApi与Naudio

本文探讨了使用NAudio库和WaveAPI进行录音的方法,提供了NAudio的包装类示例,并提到WaveAPI录音的不建议使用情况,建议参考NAudio的源码进行录音操作。
摘要由CSDN通过智能技术生成

Naudio 录音

Imports NAudio.Wave

Dim wav As New WaveIn

            wav.BufferMilliseconds = 200  '缓冲区大小=  ; 200 = 6400;100 = 3200
            wav.NumberOfBuffers = 12   '缓冲区数量
            wav.WaveFormat = New WaveFormat(16000, 16, 1) '格式 16000

            AddHandler wav.DataAvailable, AddressOf waveIn_DataAvailable

            wav.StartRecording()  '录音启动

            ‘wav.StopRecording() 


Private Sub waveIn_DataAvailable(sender As Object, e As WaveInEventArgs)
        Buffer.BlockCopy(e.Buffer, 0, WavData16, b, e.BytesRecorded)  '偏移量为字节
end sub

包装类:

Imports NAudio.Wave
Public Class WaveRecord

    Dim IsClose As Boolean = False

    Dim wav As New WaveIn

    Dim _dataArrivefun As DataArrive

    Public Sub Start(dataArriveFun As DataArrive)

        IsClose = False
        _dataArrivefun = dataArriveFun

        wav.BufferMilliseconds = 200  '200 = 6400;100 = 3200
        wav.NumberOfBuffers = 6   '缓冲区大小
        wav.WaveFormat = New WaveFormat(16000, 16, 1) '格式 16000
        AddHandler wav.DataAvailable, AddressOf waveIn_DataAvailable
        wav.StartRecording()  '录音启动

    End Sub

    ''' <summary>
    ''' 回调函数
    ''' </summary>
    ''' <param name="lpdata"></param>
    ''' <param name="datalen"></param>
    ''' <returns></returns>
    Public Delegate Function DataArrive(lpdata As Byte(), datalen As Integer)


    Private Sub waveIn_DataAvailable(sender As Object, e As WaveInEventArgs)
        If IsClose Then
            Return
        End If

        _dataArrivefun(e.Buffer, e.BytesRecorded)

    End Sub

    Public Sub Close()
        IsClose = True
        wav.StopRecording()
    End Sub

End Class







 

 

WAVAPI 录音实现(不建议使用),可参考Naudio源码

Imports System.Runtime.InteropServices
Imports System.IO
Imports System.Threading


'使用步骤:

'1.声明
'	Dim waverecord As New WaveRecordApi


'2.定义录音数据到达回调函数
'    Public Function DataArrive(lpdata As Byte(), datalen As Integer)
'    If WaveDataLength >= 6400 * 10 Then
'        Exit Function
'    End If
'    lpdata.CopyTo(WaveDataBuffer, WaveDataLength)
'    WaveDataLength = WaveDataLength + datalen
'End Function

'3.开始录音
'	waverecord.Start(AddressOf DataArrive)

'4.结束录音
'	waverecord.Close()

'1.读线地址错误(被回收了 0x000000005 读写地址错误 gchandle.alloc pinned
'2.线程错误waitfor (使用了本机调试
'3.发声与录音干扰 speech cancelall导致,debug下
'4.获取的数据中,有非DATA数据 即非定义的whdr,故WAVEINADDBUFFER错误

'注意 1.全局变量的定义 :产生的问题 程序退出,或是无数据
'注意2.非托管函数与托管函数之间的转换 INTPTR 为非托管  
'注意4.C的定义 与VB的定义 DECLARE 不同 VB6的LONG为32位 改为INTEGER ;delegate 即是回调地址 :产生问题pinvok 错误;正确的声明 www.pinvoke.net处有,但有些需改
'注意5.线程与安全线程不同,否则GETMESSAGE不能使用
'注意6.uintptr与intptr不同,需要修改
'注意7.waveInAddBuff 处的wavehdr结构 非intptr,产生问题:录音刚开始处缺失


'包含功能:WAVE API录音与播放



'''录音程序
''' 函数
''' Start() 开始录音
''' Close() 结束录音
'''播放声音
''' 函数
''' WaveOut

#Const _Debug = 0  '调试信息
#Const _WriteFile = 0 '写入文件否



Public Class WaveRecordApi


#Region "wave定义结构与声明"



    Private Const MM_WIM_OPEN As Integer = &H3BE
    Private Const MM_WIM_CLOSE As Integer = &H3BF
    Private Const MM_WIM_DATA As Integer = &H3C0

    Private Const WAVE_MAPPER As Integer = -1
    Private Const WAVE_FORMAT_PCM As I
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在WinForm中使用NAudio库来实现录音和播放音频非常方便。以下是一个示例代码,可以用来录制和播放WAV文件: ```csharp public partial class Form1 : Form { private WaveIn waveIn; private WaveOut waveOut; private WaveFileWriter waveWriter; public Form1() { InitializeComponent(); } private void btnRecord_Click(object sender, EventArgs e) { waveIn = new WaveIn(); waveIn.WaveFormat = new WaveFormat(44100, 16, 2); // 设置录音参数 waveIn.DataAvailable += WaveIn_DataAvailable; // 订阅录音数据可用事件 waveWriter = new WaveFileWriter("output.wav", waveIn.WaveFormat); // 创建WAV文件写入器 waveIn.StartRecording(); // 开始录音 } private void WaveIn_DataAvailable(object sender, WaveInEventArgs e) { // 将录音数据写入WAV文件 waveWriter.Write(e.Buffer, 0, e.BytesRecorded); } private void btnStop_Click(object sender, EventArgs e) { waveIn.StopRecording(); // 停止录音 waveIn.Dispose(); waveWriter.Dispose(); // 关闭WAV文件写入器 } private void btnPlay_Click(object sender, EventArgs e) { waveOut = new WaveOut(); var waveFileReader = new WaveFileReader("output.wav"); // 创建WAV文件读取器 waveOut.Init(waveFileReader); // 初始化播放对象 waveOut.Play(); // 开始播放 } private void btnStopPlayback_Click(object sender, EventArgs e) { waveOut.Stop(); // 停止播放 waveOut.Dispose(); } } ``` 以上代码使用了NAudio库中的WaveIn、WaveOut、WaveFileWriter和WaveFileReader类来处理音频数据和文件输出。在WinForm中,你可以将上述代码添加到你的窗体类中,然后在窗体上放置四个按钮,分别用于开始录音、停止录音、开始播放和停止播放。点击按钮时,它们会调用对应的函数来实现相应的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值