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

#include "stdafx.h"
#include <stdio.h>  
#include <windows.h>  
#pragma comment(lib, "winmm.lib")  
 
HWAVEIN hWaveIn;  //输入设备
WAVEFORMATEX waveform; //采集音频的格式,结构体
BYTE *pBuffer1;//采集音频时的数据缓存
WAVEHDR wHdr1; //采集音频时包含数据缓存的结构体
FILE *pf;
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE          wait;
    waveform.wFormatTag = WAVE_FORMAT_PCM;//声音格式为PCM
    waveform.nSamplesPerSec = 8000;//采样率,16000次/秒
    waveform.wBitsPerSample = 16;//采样比特,16bits/次
    waveform.nChannels = 1;//采样声道数,2声道
    waveform.nAvgBytesPerSec = 16000;//每秒的数据率,就是每秒能采集多少字节的数据
    waveform.nBlockAlign = 2;//一个块的大小,采样bit的字节数乘以声道数
    waveform.cbSize = 0;//一般为0
 
    wait = CreateEvent(NULL, 0, 0, NULL);
    //使用waveInOpen函数开启音频采集
    waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform,(DWORD_PTR)wait, 0L, CALLBACK_EVENT);
 
    //建立两个数组(这里可以建立多个数组)用来缓冲音频数据
    DWORD bufsize = 1024*100;//每次开辟10k的缓存存储录音数据
    int i = 20;
    fopen_s(&pf, "录音测试.pcm", "wb");
    while (i--)//录制20左右秒声音,结合音频解码和网络传输可以修改为实时录音播放的机制以实现对讲功能
    {
        pBuffer1 = new BYTE[bufsize];
        wHdr1.lpData = (LPSTR)pBuffer1;
        wHdr1.dwBufferLength = bufsize;
        wHdr1.dwBytesRecorded = 0;
        wHdr1.dwUser = 0;
        wHdr1.dwFlags = 0;
        wHdr1.dwLoops = 1;
        waveInPrepareHeader(hWaveIn, &wHdr1, sizeof(WAVEHDR));//准备一个波形数据块头用于录音
        waveInAddBuffer(hWaveIn, &wHdr1, sizeof (WAVEHDR));//指定波形数据块为录音输入缓存
        waveInStart(hWaveIn);//开始录音
        Sleep(1000);//等待声音录制1s
        waveInReset(hWaveIn);//停止录音
        fwrite(pBuffer1, 1, wHdr1.dwBytesRecorded, pf);
        delete pBuffer1;    
        printf("%ds  ", i);
    }
    fclose(pf);
 
    waveInClose(hWaveIn);
    return 0;
}

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值