麦克风录音

源码:

// SoundRecard.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <Mmsystem.h>
#include <string>
#pragma comment(lib, "winmm.lib")

using namespace std;

HWAVEIN         hWaveIn;                                 //输入设备
HWAVEOUT        hWaveOut;                                 //输出设备
WAVEFORMATEX    waveform;                                 //定义音频流格式
BYTE            *pBuffer;                                 //输入音频缓冲区(左右声道)
WAVEHDR         wavehdr_input;                             //输入音频头
WAVEHDR         wavehdr_output;                             //输出音频头
WAVEINCAPS        waveincaps;
WAVEOUTCAPS        waveoutcaps;

static BYTE*    File = (BYTE*)malloc(sizeof(BYTE) * 512);
static DWORD    dwBytesRecorded = 0;
static BOOL        Flag = TRUE;

void GetInputInfo();
void GetOutputInfo();
void InitWaveform();
void Record();
void Player();
void CALLBACK CallBack(HWAVEIN   hwi,          // 设备句柄
    UINT      uMsg,                               // 消息
    DWORD_PTR dwInstance,                       // 对象
    DWORD_PTR dwParam1,                           // 参数1
    DWORD_PTR dwParam2);                       // 参数2

//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveingetnumdevs
//官网:https://docs.microsoft.com/en-us/previous-versions/dd743841(v=vs.85)
void GetInputInfo() {
    cout << "***********************************************" << endl;
    cout << "****************** InputInfo ******************" << endl;
    cout << "***********************************************" << endl;

    int count = waveInGetNumDevs();
    cout << "The Number Of Waveform-Audio Input Devices:" << count << endl;

    MMRESULT mmresult = waveInGetDevCapsW(0, &waveincaps, sizeof(WAVEINCAPS));
    cout << "WAVEINCAPS:" << endl;
    cout << "Waveincaps.dwFormats:" << waveincaps.dwFormats << endl;
    cout << "Waveincaps.szPname:" << waveincaps.szPname << endl;
    cout << "Waveincaps.vDriverVersion:" << waveincaps.vDriverVersion << endl;
    cout << "Waveincaps.wChannels:" << waveincaps.wChannels << endl;
    cout << "Waveincaps.wMid:" << waveincaps.wMid << endl;
    cout << "Waveincaps.wPid:" << waveincaps.wPid << endl;
    cout << "Waveincaps.wReserved1:" << waveincaps.wReserved1 << endl;
}

//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveoutgetnumdevs
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveoutgetdevcaps
void GetOutputInfo() {
    cout << "***********************************************" << endl;
    cout << "***************** OutputInfo ******************" << endl;
    cout << "***********************************************" << endl;

    int count = waveOutGetNumDevs();
    cout << "The Number Of Waveform-Audio Output Devices:" << count << endl;

    MMRESULT mmresult = waveOutGetDevCapsW(0, &waveoutcaps, sizeof(WAVEOUTCAPS));
    cout << "WAVEOUTCAPS:" << endl;
    cout << "Waveoutcaps.dwFormats:" << waveoutcaps.dwFormats << endl;
    cout << "Waveoutcaps.dwSupport:" << waveoutcaps.dwSupport << endl;
    cout << "Waveoutcaps.szPname:" << waveoutcaps.szPname << endl;
    cout << "Waveoutcaps.vDriverVersion:" << waveoutcaps.vDriverVersion << endl;
    cout << "Waveoutcaps.wChannels:" << waveoutcaps.wChannels << endl;
    cout << "Waveoutcaps.wMid:" << waveoutcaps.wMid << endl;
    cout << "Waveoutcaps.wPid:" << waveoutcaps.wPid << endl;
    cout << "Waveoutcaps.wReserved1:" << waveoutcaps.wReserved1 << endl;
}

void InitWaveform() {
    // 设置音频流格式
    waveform.nSamplesPerSec = 44100;                                            // 采样率
    waveform.wBitsPerSample = 16;                                                // 采样精度
    waveform.nChannels = 2;                                                     // 声道个数
    waveform.cbSize = 0;                                                        // 额外空间    
    waveform.wFormatTag = WAVE_FORMAT_PCM;                                        // 音频格式
    waveform.nBlockAlign = (waveform.wBitsPerSample * waveform.nChannels) / 8;  // 块对齐
    waveform.nAvgBytesPerSec = waveform.nBlockAlign * waveform.nSamplesPerSec;  // 传输速率

    //分配内存
    pBuffer = new BYTE[1024 * 1024];
    memset(pBuffer, 0, 1024 * 1024);                // 内存置0

    // 设置音频头
    wavehdr_input.lpData = (LPSTR)pBuffer;            // 指向buffer
    wavehdr_input.dwBufferLength = 1024 * 1024;     // buffer大小
    wavehdr_input.dwBytesRecorded = 0;                // buffer存放大小
    wavehdr_input.dwUser = 0;
    wavehdr_input.dwFlags = 0;
    wavehdr_input.dwLoops = 1;
}

//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveinopen
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveinprepareheader
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveinaddbuffer
void Record() {
    memset(pBuffer, 0, 1024 * 1024);                                // 内存置0
    // 开启录音
    MMRESULT mRet = waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform, (DWORD_PTR)CallBack, NULL, CALLBACK_FUNCTION);
    waveInPrepareHeader(hWaveIn, &wavehdr_input, sizeof(WAVEHDR));    //准备buffer
    waveInAddBuffer(hWaveIn, &wavehdr_input, sizeof(WAVEHDR));        //添加buffer

    cout << "开始录音......" << endl;
    waveInStart(hWaveIn);
    cout << "正在录音......" << endl;
    getchar();
    Flag = FALSE;
    //waveInStop(hWaveIn);
    waveInReset(hWaveIn);
    waveInClose(hWaveIn);
    cout << "录音结束......" << endl;
}

//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveoutopen
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveoutprepareheader
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveoutwrite
void Player() {
    // 播放录音
    HANDLE Wait = CreateEvent(NULL, 0, 0, NULL);
    waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveform, (DWORD_PTR)Wait, NULL, CALLBACK_EVENT);

    wavehdr_output.lpData = (LPSTR)File;                // 指向buffer
    wavehdr_output.dwBufferLength = dwBytesRecorded;    // buffer大小
    wavehdr_output.dwBytesRecorded = dwBytesRecorded;
    wavehdr_output.dwFlags = 0;
    wavehdr_output.dwLoops = 1;

    cout << "开始播放录音......" << endl;
    ResetEvent(Wait);
    waveOutPrepareHeader(hWaveOut, &wavehdr_output, sizeof(WAVEHDR));
    waveOutWrite(hWaveOut, &wavehdr_output, sizeof(WAVEHDR));
    DWORD dw = WaitForSingleObject(Wait, INFINITE);
    if (dw == WAIT_OBJECT_0)
    {
        cout << "播放录音结束......" << endl;
    }
    waveOutReset(hWaveOut);
    waveOutClose(hWaveOut);
}

void CALLBACK CallBack(HWAVEIN   hwi,                               // 设备句柄
    UINT      uMsg,                                                    // 消息
    DWORD_PTR dwInstance,                                            // 对象
    DWORD_PTR dwParam1,                                                // 参数1
    DWORD_PTR dwParam2)                                                // 参数2
{
    // 获取音频头
    PWAVEHDR  PWaveHdr = (PWAVEHDR)dwParam1;

    // 处理消息
    switch (uMsg)
    {
    case WIM_OPEN:                                 // 打开录音设备
        cout << "录音设备打开成功" << endl;
        break;

    case WIM_DATA:                                 // 缓冲区已满
    {
        // 缓冲池信息
        cout << "已存储的数据大小:" << dwBytesRecorded << "byte" << endl;

        DWORD BytesRecorded = PWaveHdr->dwBytesRecorded;
        dwBytesRecorded += BytesRecorded;
        // 缓冲扩增
        File = (BYTE*)realloc(File, dwBytesRecorded * sizeof(BYTE));
        // 存储新内容
        if (File)
        {
            memcpy(&File[dwBytesRecorded - BytesRecorded], PWaveHdr->lpData, BytesRecorded);
            cout << "当前缓冲数据大小:" << dwBytesRecorded << "byte" << endl;
        }
        // 循环     
        if (Flag)
        {
            // 加入缓存
            cout << "存储数据到缓存中......" << endl;
            waveInAddBuffer(hwi, PWaveHdr, sizeof(WAVEHDR));
        }
    }
    break;

    case WIM_CLOSE:                               // 关闭录音设备
        cout << "成功关闭录音设备" << endl;
        break;

    default:
        cout << "录音设备信息异常" << endl;
        break;
    }
}

int main()
{
    GetInputInfo();
    GetOutputInfo();
    InitWaveform();

    cout << "***********************************************" << endl;
    cout << "***********************************************" << endl;

    Record();
    Player();

    system("pause");
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值