VS2010工程源码下载链接: https://pan.baidu.com/s/1Vf6FOISDXDjORyLcQqCErw
PCM是windows系统录音后得到的纯音频数据,需要添加头部说明信息才能被播放器使用。 尝试实现控制台小程序: 1.录制音频并保存为wav格式文件 2.播放wav音频文件
Feature
- 程序使用效果
- 音频数据结构:PCM、WAV
- Windows音频采集/播放 API
- 简单工厂方法封装
- 调试过程中遇到的问题
程序使用效果
控制台界面
当前只实现了1、2两个功能,即录音、播放。
录音时间限定为3秒。
3分离出双声道音频文件的左声道、右声道部分待后续开发。
录制得到的wav文件
录制时间目前固定成3秒。
生成的wav文件存放在同级目录下。
播放wav文件
目前只支持播放工具自身录制的wav文件,因为不同wav文件的头部信息可能有差异,带额外描述信息的复杂wav文件暂不支持。
音频数据结构:PCM、WAV
PCM数据结构
小工具使用“8位单声道”PCM文件,降低实现难度。
wav数据结构
wav头标准位44字节,还可以在末尾添加额外的描述信息,用来描述复杂的wav文件。
小工具只支持44字节头部的标准wav文件,降低实现难度。
Windows音频采集/播放 API
音频采集API
API名称 |
功能 |
waveInOpen |
打开录音设备 |
waveInPrepareHeader |
为录音设备准备一个缓冲区 |
waveInAddBuffer |
为录音设备准备一个缓冲区 |
waveInPrepareHeader |
向录音设备发送一个输入缓冲区 |
waveInStart |
启动录音 |
waveInStop |
停止录音 |
waveInReset |
重置录音设备 |
音频播放API
API名称 |
功能 |
waveOutOpen |
打开音频播放设备 |
waveOutPrepareHeader |
为音频播放设备准备一个缓冲区 |
waveOutWrite |
音频播放 |
简单工厂方法封装
UML类视图
关键代码
- //操作工厂类:用于解耦PCM数据处理的各操作,便于后期扩展及维护修改
- class OperationFactory
- {
- public:
- static Operation* createOperate(int operate)
- {
- Operation *oper = NULL;
- switch (operate)
- {
- case 1:
- oper = new OperationRec(); //录音
- break;
- case 2:
- oper = new OperationPlay(); //播放
- break;
- default:
- break;
- }
- return oper;
- }
- };
简单工厂模式下,好处如下:
1.节省空间:录音、播放操作只在运行时分配空间。
2.可扩展:如果想增加对PCM音频数据的操作,如音量增强、噪音消除,只需改动工厂类,并且新增对应操作的类即可,不许改变原有操作类。
调试过程中遇到的问题
1.使用CFile类读写文件,需要在项目->属性中添加MFC相关库 2.API入参类型匹配错误,需仔细查看API入参类型描述
参考资料
1.波形音频(WAVE)底层接口的学习与使用
https://blog.csdn.net/gongluck93/article/details/53096013
2.简单录、放音并保存为wav文件程序
https://blog.csdn.net/benny5609/article/details/1915135?utm_source=blogxgwz3
3.多媒体基础知识之PCM数据
https://www.cnblogs.com/CoderTian/p/6657844.html
4.WAV文件格式详解
https://blog.csdn.net/imxiangzi/article/details/80265978