C++ 采集音频流(PCM裸流)实现录音功能

简介: 与上一篇的“C++ 播放音频流(PCM裸流)” 点击打开链接 相对应,本篇是关于用C++实现录音功能的。同样是直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用,也可以下载本人上传的相关工程,这个工程是用VS2013写的,如果是较低的版本就呵呵了。

与上一篇的“C++ 播放音频流(PCM裸流)” 点击打开链接 相对应,本篇是关于用C++实现录音功能的。同样是直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用,也可以下载本人上传的相关工程,这个工程是用VS2013写的,如果是较低的版本就呵呵了。点击打开链接

代码部分如下:

 

[cpp]  view plain  copy
 
  1. #include "stdafx.h"  
  2. #include <stdio.h>    
  3. #include <Windows.h>    
  4. #pragma comment(lib, "winmm.lib")    
  5.   
  6. HWAVEIN hWaveIn;  //输入设备  
  7. WAVEFORMATEX waveform; //采集音频的格式,结构体  
  8. BYTE *pBuffer1;//采集音频时的数据缓存  
  9. WAVEHDR wHdr1; //采集音频时包含数据缓存的结构体  
  10. FILE *pf;  
  11. int _tmain(int argc, _TCHAR* argv[])  
  12. {  
  13.     HANDLE          wait;  
  14.     waveform.wFormatTag = WAVE_FORMAT_PCM;//声音格式为PCM  
  15.     waveform.nSamplesPerSec = 8000;//采样率,16000次/秒  
  16.     waveform.wBitsPerSample = 16;//采样比特,16bits/次  
  17.     waveform.nChannels = 1;//采样声道数,2声道  
  18.     waveform.nAvgBytesPerSec = 16000;//每秒的数据率,就是每秒能采集多少字节的数据  
  19.     waveform.nBlockAlign = 2;//一个块的大小,采样bit的字节数乘以声道数  
  20.     waveform.cbSize = 0;//一般为0  
  21.   
  22.     wait = CreateEvent(NULL, 0, 0, NULL);  
  23.     //使用waveInOpen函数开启音频采集  
  24.     waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform,(DWORD_PTR)wait, 0L, CALLBACK_EVENT);  
  25.   
  26.     //建立两个数组(这里可以建立多个数组)用来缓冲音频数据  
  27.     DWORD bufsize = 1024*100;//每次开辟10k的缓存存储录音数据  
  28.     int i = 20;  
  29.     fopen_s(&pf, "录音测试.pcm", "wb");  
  30.     while (i--)//录制20左右秒声音,结合音频解码和网络传输可以修改为实时录音播放的机制以实现对讲功能  
  31.     {  
  32.         pBuffer1 = new BYTE[bufsize];  
  33.         wHdr1.lpData = (LPSTR)pBuffer1;  
  34.         wHdr1.dwBufferLength = bufsize;  
  35.         wHdr1.dwBytesRecorded = 0;  
  36.         wHdr1.dwUser = 0;  
  37.         wHdr1.dwFlags = 0;  
  38.         wHdr1.dwLoops = 1;  
  39.         waveInPrepareHeader(hWaveIn, &wHdr1, sizeof(WAVEHDR));//准备一个波形数据块头用于录音  
  40.         waveInAddBuffer(hWaveIn, &wHdr1, sizeof (WAVEHDR));//指定波形数据块为录音输入缓存  
  41.         waveInStart(hWaveIn);//开始录音  
  42.         Sleep(1000);//等待声音录制1s  
  43.         waveInReset(hWaveIn);//停止录音  
  44.         fwrite(pBuffer1, 1, wHdr1.dwBytesRecorded, pf);  
  45.         delete pBuffer1;      
  46.         printf("%ds  ", i);  
  47.     }  
  48.     fclose(pf);  
  49.   
  50.     waveInClose(hWaveIn);  
  51.     return 0;  
  52. }  
 
from:http://blog.csdn.net/weixinhum/article/details/31155985
目录
相关文章
|
9月前
|
设计模式 uml C++
C++中的装饰器模式:灵活地扩展功能
C++中的装饰器模式:灵活地扩展功能
119 0
|
9月前
|
编译器 C++
【C++】—— c++11新的类功能
【C++】—— c++11新的类功能
|
9月前
|
编译器 程序员 Linux
C++系列九:预处理功能
C++系列九:预处理功能
|
9月前
|
算法 C语言 C++
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)(一)
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)
3009 1
|
9月前
|
缓存 算法 安全
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)(三)
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)
409 1
|
1月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
41 5
|
4月前
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
650 71
|
2月前
|
算法 网络协议 数据挖掘
C++是一种功能强大的编程语言,
C++是一种功能强大的编程语言,
69 14
|
9月前
|
安全 调度 C++
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)(二)
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)
953 0
|
5月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
530 0