织梦CMS - 轻松建站从此开始!

罗索

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

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

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

 
代码部分如下:
 
  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.     HANDLE          wait; 
  13.     waveform.wFormatTag = WAVE_FORMAT_PCM;//声音格式为PCM 
  14.     waveform.nSamplesPerSec = 8000;//采样率,16000次/秒 
  15.     waveform.wBitsPerSample = 16;//采样比特,16bits/次 
  16.     waveform.nChannels = 1;//采样声道数,2声道 
  17.     waveform.nAvgBytesPerSec = 16000;//每秒的数据率,就是每秒能采集多少字节的数据 
  18.     waveform.nBlockAlign = 2;//一个块的大小,采样bit的字节数乘以声道数 
  19.     waveform.cbSize = 0;//一般为0 
  20.   
  21.     wait = CreateEvent(NULL, 0, 0, NULL); 
  22.     //使用waveInOpen函数开启音频采集 
  23.     waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform,(DWORD_PTR)wait, 0L, CALLBACK_EVENT); 
  24.   
  25.     //建立两个数组(这里可以建立多个数组)用来缓冲音频数据 
  26.     DWORD bufsize = 1024*100;//每次开辟10k的缓存存储录音数据 
  27.     int i = 20; 
  28.     fopen_s(&pf, "录音测试.pcm""wb"); 
  29.     while (i--)
  30. //录制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. //准备一个波形数据块头用于录音 
  41.         waveInAddBuffer(hWaveIn, &wHdr1, sizeof (WAVEHDR));
  42. //指定波形数据块为录音输入缓存 
  43.         waveInStart(hWaveIn);//开始录音 
  44.         Sleep(1000);//等待声音录制1s 
  45.         waveInReset(hWaveIn);//停止录音 
  46.         fwrite(pBuffer1, 1, wHdr1.dwBytesRecorded, pf); 
  47.         delete pBuffer1;     
  48.         printf("%ds  ", i); 
  49.     } 
  50.     fclose(pf); 
  51.   
  52.     waveInClose(hWaveIn); 
  53.     return 0; 
 
(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201410/17106.html]
本文出处:网络 作者:秩名
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容