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

与上一篇的“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

时间: 2024-11-04 16:51:24

C++ 采集音频流(PCM裸流)实现录音功能的相关文章

C++ 播放音频流(PCM裸流)

直接上代码,如果有需要可以直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用了(注意将声道和频率与你自己的文件对应哦).当然我自己也用VS2008(VS2013好用太多,强烈推荐还是用VS2013,只是它的工程太大,上传起来相当费劲,所以还是用VS2008重写了..)写了个例子上传了,如果有需要下载地址如下(自己没什么下载分了,所以弄了3分,见谅哈哈):点击打开链接 这份代码是打开文件截取一段数据然后播放的,可以轻松的经过加一条线程的方式改成网络传输的形式.  #include "

C++ 播放音频流(PCM裸流)--改善

直接上代码,如果有需要可以直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用了(注意将声道和频率与你自己的文件对应).当然我自己也用VS2008写了个例子上传了,如果有需要下载地址如下:点击打开链接.     这份代码是打开文件截取一段数据然后播放的,可以轻松的经过加一条线程的方式改成网络传输的形式,但经过本人测试,因为没有缓存机制会有"哒哒"的噪声,也就是说这份代码在网络实时音频上的表现并不太好.为了解决这个问题,可以加上缓存机制,本人因为一开始用的是事件响应方式,所以

视音频同步推送-是否有视音频裸流一起推送的例子?

问题描述 是否有视音频裸流一起推送的例子? SRS设计理念真好,我们很喜欢. 文章中给出单独推送H.264 及AAC裸流的例子,是否有视音频裸流一起推送的例子?因为实际中大多是视音频一起的. 解决方案 http://download.csdn.net/detail/ganhuanghuang/4984256 解决方案二: 谢谢! 我需要的是视音频裸码流同步推送,你推荐的是"SDL播放PCM音频裸流",不是一回事.

在ubuntu下通过RTP(tcp)的方式往window发送h264裸流,VLC接收问题

问题描述 在ubuntu下通过RTP(tcp)的方式往window发送h264裸流,VLC接收问题 在ubuntu下通过RTP(tcp)的方式往window发送h264裸流,用VLC打开SDP文件的方式为什么接不到数据?在windows下发给自己就可以接收到数据,能播放

sdp-TS裸流以每次188个字节通过RTP的方式发送给VLC合理吗?为什么VLC播放不了?

问题描述 TS裸流以每次188个字节通过RTP的方式发送给VLC合理吗?为什么VLC播放不了? 这是我的sdp文件,请大神帮我看看我的sdp文件是否正确? v=2 t=0 0 m=video 9400 RTP/AVP 96 a=rtpmap:96 MP2T a=framerate:25 c=IN IP4 10.1.1.117 解决方案 188个字节太小了,设置大一些看看.

视频-基于UDP的h264实时裸流播放

问题描述 基于UDP的h264实时裸流播放 本人想用<最简单的基于FFmpeg的解码器-纯净版>该项目中的解码器直接解码socket到的h264裸流,请问可以吗???该项目是解码本地文件视频的一个简单的播放器,可解码h264裸流.我想把socket到的裸流直接喂给里面的解码器. 解决方案 http://blog.csdn.net/wxl1986622/article/details/37835935

流 采集卡 播放-TS流的实时播放怎么实现?

问题描述 TS流的实时播放怎么实现? 主机插了一块TS流(不知道TS的只要理解为视频流就可以)的采集卡,能够实现把外部TS流收集到缓冲区,但是我怎么实现将TS流给实时播放出来呢?用到什么插件?我知道的有和directshow和ffmpeg,但是不知道怎么用.求大神给予指导!万分感谢! 采集卡有个开发包,里面有个接收TS流的函数: int btert_receive(void* pBuffer,int nLength,int DeviceId,int ChannelId); 参数说明如下: pBu

视频流-Android端音视频采集到推流这一步,服务器端不需要

问题描述 Android端音视频采集到推流这一步,服务器端不需要 各位大牛,小弟现在因为项目需求,需要做一个android端采集音视频并实时对音视频编解码(AAC/H.264), 然后封包RTMP推送至流媒体服务器,服务器端再实时将可播放的流发送至其他android客户端以支持RTMP协议的流媒体播放. 在网上找了很多文章都大同小异,而且感觉不是很适合. 感觉视频流用MediaRecorder进行H264硬编码 + LocalSocket的方案可行,但要是直接可播放的流貌似应该要先发送SPS和P

Window 下 VFW 视频采集与显示

引言       经过几天的努力终于将VFW视频采集与显示功能完整实现了,不得不说网上对这方面完整的详细讲解文章是在太少了.所以就要本人来好好总结一下让后来者不再像我一样折腾好久.在本文中我将详细讲解VFW视频采集过程的实现,以及采集后视频的显示方法. VFW简介          虽然这是篇技术博文,但是我觉得用一个东西,那么关于它的概述还是不能少,所以特从百度上copy了下VFW的概念描述,如果读者不想看可以直接去观看正文部分.          VFW(Video for Windows)