原创

bass.net实现录音功能

2020-04-28 Tuesday 12:30

首先需要先初始化录音,使用方法

Bass.BASS_RecordInit

此方法接受一个整数参数,表明要用哪个输入设备进行录音,如提供-1,则为默认设备,返回值为是否初始化成功。

开始录音可以调用如下方法

this.recordHandle = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_RECORD_PAUSE, this.recordProc,IntPtr.Zero);

BASS_RecordStart方法的返回值是录音的句柄,方法的前几个参数我们可以先不管,主要关注this.recordProc这个参数。

this.recordProc它是RECORDPROC委托,此委托在录音过程中会被多次调用,会告诉你录音的长度等信息,并且可以控制是否停止录音。

这里需要特意注意一点,因为我们调用bass录音,走的并非是托管代码,因此委托必须要创建成类的成员,不能写成局部变量,否则此变量会被垃圾回收,导致出错。

此委托的定义如下

public delegate bool RECORDPROC(int handle, IntPtr buffer, int length, IntPtr user);

参数含义分别是:录音缓冲区的指针、缓冲区长度、用户自定义数据,返回值如为true,则继续录音,否则停止录音。

本次我们录音最终实现不借助这个委托,我们直接简单的写成这样即可

private bool recoring(int handle, IntPtr buffer, int length, IntPtr user)

{

return true;

}

然后

this.recordProc = new RECORDPROC(this.recoring);

即可。

现在我们进行最关键的一步。

我们要实现吧录音保存成某格式的音频文件,就要使用道编码器,而bass.net默认情况下是只支持wav编码器的,此处我们也已将录音保存成wav文件做演示。

首先我们要实例化编码器,wav编码器的创建方法为

var wav = new EncoderWAV(recordHandle);

构造参数为BASS_RecordStart的返回值,也就是录音句柄。

实例化编码器后我们需要设置一些参数,此处最重要的为

wav.OutputFile = path;

此参数表明录音文件的保存路径。

现在准备工作都已经做好了,我们可以开始真正的录音了!

调用

// 开启编码器

wav.Start(null, IntPtr.Zero, false);

// 开启录音通道

Bass.BASS_ChannelPlay(this.recordHandle, false);

如果要暂停录音的话可以调用

wav.Pause(true);

Bass.BASS_ChannelPause(this.recordHandle);

继续录音调用

wav.Pause(false);

Bass.BASS_ChannelPlay(this.recordHandle, false);

停止录音调用

wav.Stop();

Bass.BASS_ChannelStop(this.recordHandle);

// 释放录音

Bass.BASS_RecordFree();


随手打赏
关闭

感谢您的支持!

扫码打赏,你说多少就多少
打赏二维码

打开

支付宝

扫一扫,即可进行扫码打赏哦