windows 音频编程主要有三种方式:
1.MCI,这种方式很简单,但是不够灵活
2.waveXXXX等低阶的声音API
3.DirectSound
编写一个功能较强大的音频处理程序,那就必须使用低级音频函数和多媒体文件I/O来控制音频设备的输入和输出。因为低级音频函数可直接与音频驱动程序交互,通过窗口消息或回调(CALL BACK)函数来管理音频数据块的记录和播放,控制非常灵活。重要的一点是,低级音频函数为我们提供了一个设备无关的接口。
示波器
源码爱好者网站
http://www.codefans.net/
利用DirectSound实现声卡录音
http://www.hur.cn/Article/2013/120856.html
音频数据文件WAVE结构分析--Windows XP 启动.wav 文件头分析
http://blog.csdn.net/c_huabo/article/details/5984402
快速傅里叶变换 fft
http://www.codeproject.com/Articles/6855/FFT-of-waveIn-audio-signals
http://www.codeproject.com/Articles/29366/Play-Wave-file-with-DirectSound-and-display-its-sp
我遇到的死锁是由于当执行WaveInReset函数时,回调函数仍然在调用WaveInAddBuffer才产生的,所以只要设置标示符,使将要执行WaveInReset函数之时及以后回调函数不调用WaveInAddBuffer即可避免死循环,另外不要忘了在调用WaveInReset之前调用WaveInStop函数。
参考
http://www.docin.com/p-159437153.html
http://www.docin.com/p-327123929.html
http://blog.csdn.net/joyzml/article/details/5381143
http://ee.sjtu.edu.cn:8080/PDF/Paper/junheng.htm
请教关于实时录音/放音的问题
http://bbs.csdn.net/topics/99939
API 层实现语音录制
http://www.lihuasoft.net/article/show.php?id=124
基于WaveX低级音频函数的实时语音通信
http://www.wavecn.com/content.php?id=95
http://wmnmtm.blog.163.com/blog/static/3824571420111030125597/?suggestedreading&wumii
http://www.elautoctrl.info/wordpress/archives/1730
http://www.programfan.com/article/729.html
http://old.uplook.cn/blog/0/1939/
http://www.vckbase.com/index.php/wv/664
http://www.cnblogs.com/linbc/archive/2009/03/18/1415936.html
http://blog.sina.com.cn/s/blog_49cb42490100l4u1.html
http://blog.sina.com.cn/s/blog_49cb42490100l51f.html
http://blog.sina.com.cn/s/blog_49cb42490100l99d.html
声音以图形显示的计算机实现
http://wenku.baidu.com/view/9bdac51c59eef8c75fbfb3bf.html
一个简单的录音播放程序:即边录边播,用MFC开发
http://www.pudn.com/downloads165/sourcecode/windows/multimedia/detail756713.html
波形示意软件
http://www.m5home.com/bak_blog/article/282.html
android录音与示波器
http://jim443.iteye.com/blog/1666087
vc画波形图
http://tw.knowledge.yahoo.com/question/question?qid=1611033103794
http://www.pudn.com/downloads171/sourcecode/windows/bitmap/detail790648.html
http://help.apple.com/mainstage/mac/2.2/cn/mainstage/usermanual/index.html#chapter=A%26section=0
http://bbs.csdn.net/topics/100137205
Fundamentals of Sound: How to Make Music out of Nothing at All
http://www.codeproject.com/Articles/15786/Fundamentals-of-Sound-How-to-Make-Music-out-of-Not
WAV文件的格式:
WAV文件,由WAV文件头和音频采样数据组成。
由文件头可以得知该文件的音频采样数据的相关信息(声道数,采样率,采样数据的位数等) 声道数最多2个声道,2个声道也就是立体声。
得到文件头信息后,把采样数对应坐标画上去即可。
format.wFormatTag =WAVE_FORMAT_PCM; //格式为PCM
format.nChannels =1; //单声道,2是立体声
format.nSamplesPerSec =11025; //采样率
format.nAvgBytesPerSec =11025; //数据率
format.nBlockAlign =1; //每样点的字节数
format.wBitsPerSample =8; //采样精度
format.cbSize =0;
WAV档案格式
偏移量
位元组
资料
0000
4
「RIFF」
0004
4
波形块的大小(档案大小减8)
0008
4
「WAVE」
000C
4
「fmt 」
0010
4
格式块的大小(16位元组)
0014
2
wf.wFormatTag = WAVE_FORMAT_PCM = 1
0016
2
wf.nChannels
0018
4
wf.nSamplesPerSec
001C
4
wf.nAvgBytesPerSec
0020
2
wf.nBlockAlign
0022
2
wf.wBitsPerSample
0024
4
「data」
0028
4
波形资料的大小
002C
波形资料
这是一种扩充自RIFF(Resource Interchange File Format:资源交换档案格式)的格式。RIFF是用於多媒体资料档案的万用格式,它是一种标记档案格式。在这种格式下,档案由资料「块」组成,而这些 资料块则由前面4个字元的ASCII名称和4位元组(32位元)的资料块大小来确认。资料块大小值不包括名称和大小所需要的8位元组。
波形声音档案以文字字串「RIFF」开始,用来标识这是一个RIFF档案。字串後面是一个32位元的资料块大小,表示档案其余部分的大小,或者是小於8位元组的档案大小。
资料块以文字字串「WAVE」开始,用来标识这是一个波形声音块,後面是文字字串「fmt」-注意用空白使之成为4字元的字串-用来标识包含 波形声音资料格式的子资料块。「fmt」字串的後面是格式资讯大小,这里是16位元组。格式资讯是WAVEFORMATEX结构的前16个位元组,或者, 像最初定义时一样,是包含WAVEFORMAT结构的PCMWAVEFORMAT结构。
格式资讯的後面是文字字串「data」,然後是32位元的资料大小,最後是波形资料本身。这些资料是按相同格式进行简单连结的样本,这与低阶 波形声音设备上所使用的格式相同。如果样本大小是8位元,或者更少,那么每个样本有1位元组用於单声道,或者有2位元组用於立体声。如果样本大小在9到 16位元之间,则每个样本就有2位元组用於单声道,或者4位元组用於立体声。对於立体声波形资料,每个样本都由左值及其後面的右值组成。
用完设备之后,必须调用waveOutClose函数关闭波形输出设备,以便其他程序可以使用设备。
示波器中的波形图就是每个采样点对应的坐标点连起来的,这个坐标点可以是声音大小。就是每个采样的值,幅度。
在线音频格式转换
http://media.io/