windows 基于bass.dll封装录音接口,只需要简单调用4个接口就可以实现录音功能。(源码可下载)

介绍

bass.dll是一个有由三方开发的,可用来快速实现音频操作的库,见其官网的描述:http://www.un4seen.com/
在windows平台下,我们下载bass24.ZIP解压后可以得到它的官方API使用教程和一些例子。在~bass24\c\下面有一个rectest,就是很好的实现录音的例子。

rectest里面使用了bass.dll的一些接口,其中主要的有:BASS_ErrorGetCode()、BASS_StreamFree()、BASS_Free()、BASS_RecordStart()、BASS_ChannelStop()、BASS_StreamCreateFile()、BASS_RecordFree()、BASS_RecordInit()、BASS_RecordGetInputName()。下面我讲依次讲解这些API的用法。

BASS_ErrorGetCode()主要是用于获取使用bass.dll过程中遇到的错误。正确,返回BASS_OK,错误主要有:驱动错误,未初始化错误,文件打开错误,流打开错误等,具体错误信息请参考BASS dicumentation。BASS_StreamFree()用于释放缓冲区,程序录音过程中,需要将输入设备的数据保存到缓冲区,只需要初始化该缓冲区,便可以写入数据到缓冲区了。BASS_Free()用于释放BASS驱动,实际上就是释放“虚拟”硬件——声卡。BASS_RecordStart()用于开始录音,注意要初始化录音设备。BASS_ChannelStop用于停止录音,关闭信道。BASS_StreamCreateFile()用于从文件流创建文件,能够将缓冲区里面的流放到文件中。BASS_RecordFree()用于释放录音设备(如麦克风)。BASS_RecordInit()用于初始化录音设备。BASS_RecordGetInputName()可以根据序号得到输入设备的名称。

二次封装bass.dll为BassRecord.dll

每次开始录音时都要调用这两个函数:
void _stdcall initRecord(void)
int _stdcall startRecord(void)
每次结束录音时都要调用这两个函数:
void _stdcall stopRecord(void)
void _stdcall clearRecord(void)

调用BassRecord.dll举例

HINSTANCE hInst;
 hInst = ::LoadLibraryA("BassRecord.dll");
if(!hInst)
{
	//加载失败
}else{
typedef void   (_stdcall*InitRecord)(void);
InitRecord initRecord = (InitRecord)::GetProcAddress(hInst, "initRecord");
typedef int   (_stdcall*StartRecord)(void);
StartRecord startRecord = (StartRecord)::GetProcAddress(hInst, "startRecord");
typedef void   (_stdcall*StopRecord)(void);
StopRecord stopRecord = (StopRecord)::GetProcAddress(hInst, "stopRecord");
typedef void   (_stdcall*ClearRecord)(void);
ClearRecord clearRecord = (ClearRecord)::GetProcAddress(hInst, "initRecord");
}

//录音的时候:
initRecord();
int ret=startRecord();
if(ret!=0){//开启录音失败}

//结束录音的时候调:
stopRecord();	 
clearRecord();

二次封装后的BassRecord.dll的VS工程下载

BassRecord.dll是用 Visual Studio开发的,读者下载工程后,如果有个性话需求,可以自己修改。
点击下载

音频和视频合成

如果要把生成的音频和视频合成可以使用ffmpeg命令的方式,简单使用。
配置可参考:https://www.jianshu.com/p/2b609afb9800
具体命令:
ffmpeg十分强大,基本上可以满足音视频编辑的各种需求,比如说连接多个音频为一个,视频编辑,
FFmpeg命令行大致可以分为两类:
1.视频、音频、图片的转换。
例如视频截取、视频转码、视频连接、视频音频合成等。
2.增加处理效果。
例如增加水印、增加gif、音频延迟等。一般是通过滤镜功能实现。
FFmpeg命令行举例:
视频截取
ffmpeg -ss 00:46:28 -i “Morning_News.asf” -acodec copy -vcodec copy -t 00:03:25 output.asf
这行命令解释为:从文件 Morning_News.asf 第 46:28 分秒开始,截取 03: 25 的时间,其中视频和音频解码不变,输出文件名为 output.asf 。
-ss :从指定时间开始(如果该时间点无效,则跳到该时间点前,最接近的有效seek point)
-i:输入源
-acodec copy -vcodec copy:视频和音频编码不变
-t:在该时间点停止输出

视频转码
ffmpeg -i INPUT -f FORMAT OUTPUT
例如:
ffmpeg -i “D:/result.mpge” -f mp4 “D:/result.mp4”

视频连接
ffmpeg -i “concat:input1.mpg|input2.mpg|input3.mpg” -c copy output.mpg
http://trac.ffmpeg.org/wiki/How%20to%20concatenate%20(join%2C%20merge)%20media%20files

去除视频声音
ffmpeg -i 1.avi -vcodec copy -an 2.avi

合并音频和视频
ffmpeg -i a.wav -i a.avi out.avi
若音频比视频长,画面停留在最后一帧,继续播放声音。
显示多幅图片(不同位置)
ffmpeg -y -i boss.mp4 -i left.png -i left.png -filter_complex “overlay=5:5,overlay=0:0” -f mp4 output.mp4
-filter_complex:使用复合滤镜
“overlay=5:5,overlay=0:0”:第一个图片的x、y坐标为(5,5),第二个为(0,0)

在特定时间显示图片
ffmpeg -y -i 1.avi -i 1.png -filter_complex “overlay=x=‘if(between(t,1,3),60,-500)’:y=50” -f mp4 left1.mp4
命令行中可以使用表达式,参考:http://ffmpeg.org/ffmpeg-all.html#Expression-Evaluation
具体意思是时间t在1到3秒内,图片的x坐标为60,否则为-500(移出屏幕),y坐标一直为50不变

音频提前或延迟N秒
ffmpeg -i ogg.ogg -i 1.avi -filter_complex “adelay=3000|3000” output.avi
-filter_complex “adelay=3000|3000”:对前面的ogg音频的两个声道都延迟3000毫秒
http://ffmpeg.org/ffmpeg-all.html#adelay

音频合成
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
inputs=3:三个输入
duration=first:输出长度为第一个输入的长度
dropout_transition=3:声音淡出时间为3秒

可能遇到的问题:

1,利用ffmpeg命令行合成一个音频与一个视频,音频会覆盖视频中的原声道,音频PCM被替换,好像只有单声轨。
2,h264编码与aac编码合成无效
3,连接多个音频,采用命令行无效
4,延迟音频的声道时,只能合成一个音频到视频中,合成多个音频,只保留一个声轨

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值