我从前出于需要,上网寻找了关于录音部分的源代码,收获不大,现在把自己摸索的部分源代码公开出来吧,希望对部分人有用。
其实要实现声音的录制,可以用多种的方式(例如 mci ),我这里介绍的是在 API 的层面来实现,你可以对其中进行更多的控制。比方说,要音频裸数据存到你指定的内存中去。
先说一下要用到的 API , 录音通常都是使用 waveInXXX 一类 API 的,最主要的是 waveInStart (顾名思义就是开始录音),然后是 waveInStop(它能够在你指定的缓冲满的时候返回) ; 如果不用 waveInStop 可以使用 waveInReset(不同于Stop的是该函数不等缓冲满就马上返回那样你才可以终止录音),不过最好跟 waveInGetPosition 配合使用。
说完这些函数,不得不提的是为以上几个函数做准备工作的函数(注意配对使用), waveInOpen 和 waveInClose 配对( waveInOpen 里面指定音频的格式,比方说立体声 和16位音质等); waveInPrepareHeader 和 waveInUnprepareHeader 配对( waveInPrepareHeader 里面指定用来录音缓冲的大小和首地址),紧跟着 waveInPrepareHeader要例行公事调用 waveInAddBuffer( 作用未详,不多说了)。
详细调用过程可以看下面
(之前最好调用 waveInGetNumDevs 看看有没有可用的设备)
waveInOpen (该处用 WAVEFORMATEX 结构指定音频格式)
waveInPrepareHeader (该处用 WAVEHDR 结构的 lpData 成员指定缓冲首地址)
waveInAddBuffer
waveInStart
(录制中.)
waveInStop (warning:一定要缓冲满了才返回)
waveInUnprepareHeader
waveInClose
需要指出的是,上面的代码你不能随心所欲的停止录音过程(如果你指定的缓冲非常大,比方说足够录音一个小时,那么你就要乖乖的等上一个小时),如果希望马上停止,请使用下面的方法。
waveInStart
(录制中.)
(n 时间后,用户提出停止请求)
waveInGetPosition (保留该值,用来设置 WAVEHDR 结构的 dwBytesRecorded 成员)
waveInReset
(重新设置 WAVEHDR 结构的 dwBytesRecorded 成员)
整个过程就是如此的几句,下面将给出源
程序以验证。
需要说明一下,正常情况下录音以后,总共耗费的内存(以字节算) 会保存在WAVEHDR 结构的 dwBytesRecorded 成员中,可用的音频裸数据当然就放进你指定的内存缓冲中去了,你大可不必等 waveInUnprepareHeader 就可以马上拿来用了。
( 补充一个内容,粗略讲解一下 .wav 文件的文件头格式 )
看下面的结构,一开始的八个字节是一个结构, 第一个 四字节 是标志,刚好等于 ascii 的 "RIFF" ,第二个四字节是总的文件长度减去8。你可以验证一下。(参照16进制阅读数字的方法)
跟着是第二个数据结构,占12个字节。如果你是标准的 wave 格式的文件,那么就是紧接着两个标