录制声音一般采用两种机制:

第一种: 直接在UI下采用消息;

第二种: 开辟一个线程单独进行;

下面先介绍第一种如何进行,DEMO是网上的,挺零碎的,我费了点功夫,调试能直接使用的.

<1> : wav族函数进行声音采集和播放时,会以下几个消息:

MM_WIM_OPEN、 MM_WIM_DATA、MM_WIM_CLOSE、MM_WOM_OPEN、MM_WOM_DONE、MM_WOM_CLOSE

所以新建一个MFC工程,并且添加如下三个消息:

MM_WIM_OPEN、 MM_WIM_DATA、MM_WIM_CLOSE

当然也可以将另外三个播放的消息也一并添加.

假设新建了Recorde MFC Dialog工程.

<2> : 添加消息:

// Generated message map functions
 //{{AFX_MSG(CRecordeDlg)
 virtual BOOL OnInitDialog();
...
 afx_msg LRESULT OnMM_WIM_OPEN(UINT wParam,LONG lParam);
 afx_msg LRESULT OnMM_WIM_DATA(UINT wParam,LONG lParam);
 afx_msg LRESULT OnMM_WIM_CLOSE(UINT wParam,LONG lParam);
 afx_msg LRESULT OnMM_WOM_OPEN(UINT wParam,LONG lParam);
 afx_msg LRESULT OnMM_WOM_DONE(UINT wParam,LONG lParam);
 afx_msg LRESULT OnMM_WOM_CLOSE(UINT wParam,LONG lParam);
...
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CRecordeDlg, CDialog)
 //{{AFX_MSG_MAP(CRecordeDlg)
...
 ON_MESSAGE(MM_WIM_OPEN,OnMM_WIM_OPEN)
 ON_MESSAGE(MM_WIM_DATA,OnMM_WIM_DATA)
 ON_MESSAGE(MM_WIM_CLOSE,OnMM_WIM_CLOSE)
 ON_MESSAGE(MM_WOM_OPEN,OnMM_WOM_OPEN)
 ON_MESSAGE(MM_WOM_DONE,OnMM_WOM_DONE)
 ON_MESSAGE(MM_WOM_CLOSE,OnMM_WOM_CLOSE)

...

//}}AFX_MSG_MAP
END_MESSAGE_MAP()

<3> : 添加头文件:

#include<mmsystem.h>
#pragma comment(lib, "Winmm.lib")

全局变量:

#define INP_BUFFER_SIZE 2048//该值越大,录取的数据就越多.
#define WAVE_HEADER_SIZE 44

enum et{
 RECORD_STATE_INIT,
 RECORD_STATE_STOP,
 RECORD_STATE_STOPING,
 RECORD_STATE_PLAYING,
 RECORD_STATE_RECING
};

类中自定义变量:

int m_nRecordState;

DWORD m_dwDataLength;        //数据长度
 WAVEFORMATEX m_waveform;    //声音格式
 HWAVEIN m_hWaveIn;            //音频输入句柄
 HWAVEOUT m_hWaveOut;        //音频输出句柄
 PBYTE m_pSaveBuffer;        //音频存储内存

WAVEHDR m_WAVEHDR1;
 WAVEHDR m_WAVEHDR2;

char m_cbBuffer1[INP_BUFFER_SIZE];    //声音临时缓存1
 char m_cbBuffer2[INP_BUFFER_SIZE];    //声音临时缓存2

新添加录音button1播放button2按钮.

<4> : 录音按钮如下:

void CRecordeDlg::OnButton1()
{
 // TODO: Add your control notification handler code here
 //打开声音设备
    if(waveInOpen(&m_hWaveIn,WAVE_MAPPER,&m_waveform,
            (DWORD)m_hWnd,NULL,CALLBACK_WINDOW)){
        MessageBeep(MB_ICONEXCLAMATION);
        MessageBox(_T("录制声音失败!"),
                    _T("错误"),MB_ICONEXCLAMATION|MB_OK);
        return;
    }

//设置缓冲区
    m_WAVEHDR1.lpData = (LPTSTR)m_cbBuffer1;
    m_WAVEHDR1.dwBufferLength = INP_BUFFER_SIZE;
    m_WAVEHDR1.dwBytesRecorded = 0;
    m_WAVEHDR1.dwUser=0;
    m_WAVEHDR1.dwFlags=0;
    m_WAVEHDR1.dwLoops=1;
    m_WAVEHDR1.lpNext=NULL;
    m_WAVEHDR1.reserved=0;

m_WAVEHDR2.lpData=(LPTSTR)m_cbBuffer2;
    m_WAVEHDR2.dwBufferLength = INP_BUFFER_SIZE;
    m_WAVEHDR2.dwBytesRecorded = 0;
    m_WAVEHDR2.dwUser=0;
    m_WAVEHDR2.dwFlags=0;
    m_WAVEHDR2.dwLoops=1;
    m_WAVEHDR2.lpNext=NULL;
    m_WAVEHDR2.reserved=0;

//设置双缓冲
    waveInPrepareHeader(m_hWaveIn,&m_WAVEHDR1,sizeof(WAVEHDR));
    waveInPrepareHeader(m_hWaveIn,&m_WAVEHDR2,sizeof(WAVEHDR));

waveInAddBuffer(m_hWaveIn,&m_WAVEHDR1,sizeof(WAVEHDR));
    waveInAddBuffer(m_hWaveIn,&m_WAVEHDR2,sizeof(WAVEHDR));

//先随便分配个内存
    if(m_pSaveBuffer == NULL){
        free(m_pSaveBuffer);
        m_pSaveBuffer = NULL;
    }
    m_pSaveBuffer = (PBYTE)malloc(1);
    m_dwDataLength = 0;

//开始录音
    // Begin sampling   
    waveInStart(m_hWaveIn);

}

播音按钮如下:

void CRecordeDlg::OnButton2()
{
 // TODO: Add your control notification handler code here
 //打开声音播放句柄
    if(waveOutOpen(&m_hWaveOut,WAVE_MAPPER,&m_waveform,(DWORD)m_hWnd, NULL, CALLBACK_WINDOW)){
        MessageBeep(MB_ICONEXCLAMATION);
        MessageBox(_T("录制声音失败!"),_T("错误"),MB_ICONEXCLAMATION|MB_OK);
        return;
    }
}

<4> :添加响应消息函数(附带了功能代码):

LRESULT CRecordeDlg::OnMM_WIM_CLOSE (UINT wParam,LONG lParam){

waveInUnprepareHeader(m_hWaveIn, &m_WAVEHDR1, sizeof (WAVEHDR)) ;
    waveInUnprepareHeader(m_hWaveIn, &m_WAVEHDR2, sizeof (WAVEHDR)) ;
   
    m_nRecordState = RECORD_STATE_STOP;
    //SetButtonState();

return NULL;
}

LRESULT CRecordeDlg::OnMM_WIM_DATA (UINT wParam,LONG lParam){

PWAVEHDR pWaveHdr = (PWAVEHDR)lParam;
   
    if(pWaveHdr->dwBytesRecorded > 0){
        m_pSaveBuffer = (PBYTE)realloc(m_pSaveBuffer,m_dwDataLength + pWaveHdr->dwBytesRecorded);
        if(m_pSaveBuffer == NULL){
            waveInClose (m_hWaveIn);
            MessageBeep (MB_ICONEXCLAMATION) ;
            AfxMessageBox("erro memory");
            return NULL;
        }

memcpy(m_pSaveBuffer+m_dwDataLength , pWaveHdr->lpData,pWaveHdr->dwBytesRecorded);

m_dwDataLength += pWaveHdr->dwBytesRecorded;
    }

if(m_nRecordState == RECORD_STATE_STOPING){
        waveInClose(m_hWaveIn);       
    }

waveInAddBuffer(m_hWaveIn, pWaveHdr, sizeof (WAVEHDR));

return NULL;
}

LRESULT CRecordeDlg::OnMM_WIM_OPEN (UINT wParam,LONG lParam){

m_nRecordState = RECORD_STATE_RECING;
    //SetButtonState();
    return NULL;
}

LRESULT CRecordeDlg::OnMM_WOM_CLOSE (UINT wParam,LONG lParam){

m_nRecordState = RECORD_STATE_STOP;
    //SetButtonState();
    return NULL;
}

LRESULT CRecordeDlg::OnMM_WOM_DONE (UINT wParam,LONG lParam){

PWAVEHDR pWaveHdr = (PWAVEHDR)lParam;
    waveOutUnprepareHeader (m_hWaveOut, pWaveHdr, sizeof (WAVEHDR)) ;
    waveOutClose (m_hWaveOut);
    return NULL;
}

LRESULT CRecordeDlg::OnMM_WOM_OPEN  (UINT wParam,LONG lParam){

memset(&m_WAVEHDR1,0,sizeof(WAVEHDR));
    m_WAVEHDR1.lpData = (char *)m_pSaveBuffer;//指向要播放的内存
    m_WAVEHDR1.dwBufferLength = m_dwDataLength;//播放的长度
    m_WAVEHDR1.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
    m_WAVEHDR1.dwLoops = 1;

waveOutPrepareHeader(m_hWaveOut,&m_WAVEHDR1,sizeof(WAVEHDR));

waveOutWrite(m_hWaveOut,&m_WAVEHDR1,sizeof(WAVEHDR));

m_nRecordState = RECORD_STATE_PLAYING;
    //SetButtonState();
    return NULL;
}

录制声音并且播放录取的声音相关推荐

  1. 系统无声音,播放器有声音

    引用:http://www.8844.com/default.php?mod=ask_detail&tid=136005 确定若声卡.声卡驱动全无问题(只是开机.关机没声音,播放flash没有 ...

  2. ubuntu qq音乐/网易云音乐 播放没有声音,播放mv有声音,解决办法

    重装了ubuntu系统,下载了qq音乐,播放音乐没有声音,忍不了,解决办法: 终端中执行如下命令 sudo apt install ubuntu-restricted-extras reboot 如果 ...

  3. java怎么播放不了声音_JAVA3D播放不出声音的解决办法

    今天在利用JAVA3D播放声音的时候,碰到一个很奇怪的问题,那就是声音设备无法初始化.它抛出如下异常: java.lang.UnsupportedOperationException: No Audi ...

  4. 学生用计算机怎么没音效,电脑有声音用播放器没有声音怎么处理啊???

    1)电脑无声的解决方法:有修复系统和用软件安装声卡驱动的两种解决方法(首先看看小喇叭或在控制面板中看看是否设置了静音,在通过耳机检查是否有声音输出,如果有,则是音箱或喇叭的故障引起的,在有就是声卡驱动 ...

  5. C/C++——如何使用PlaySound同时播放两个声音

    PlaySound是Windows用于播放音乐的API函数.在vs2010以上版本需要加入#pragma comment(lib, "winmm.lib")才能使用PlaySoun ...

  6. win10电脑插耳机没声音_Win10如何录制电脑内部播放的声音

    有很多Win10系统用户常常会碰到需要录制电脑内部声音的情况,比如录制在线视频中的背景音乐,录制在线播放的歌曲,或者一些网页上的其它声音.如果通过先播放,再通过麦克风进行录制的话,无疑音质会大打折扣. ...

  7. 电脑声音太小如何增强_如何录制电脑上播放的声音,背景音乐

    电脑里面有一些声音无法找到音频源文件,电影小品中的对白很搞笑,背景音乐很好听,一些在线音乐,因为版权问题无法下载,我们想将这些声音或音乐无损录制下来,该如何操作呢? 1,首先在要录制声音的电脑上,安装 ...

  8. 声网 java app视频录制_java 声音的播放与录制

    简单总结了下, 就是format, info, line, 把这三个对象获得就可以了. package com.file; import java.io.ByteArrayInputStream; i ...

  9. html网页播放flac,教你如何无损录制网页上播放的声音

    要对网页上的声音进行无损录制其实很简单,不管是网页上所播放视频上的声音,还是网页上的动画里发出的声音,或者是网页的背景音乐,都是可以进行无损录制的. 1,首先打开浏览器,并在百度上搜索下载支持无损内录 ...

最新文章

  1. python怎么继承_Python: 如何继承str/string?
  2. 0x53. 动态规划 - 区间DP(习题详解 × 8)
  3. 4.Java面向对象相关知识总结
  4. 突发!ASML断供中芯国际
  5. 魅族建立基于M8的Android开源项目
  6. 无法识别的属性 configProtectionProvider的解决方案
  7. hadoop2.x HDFS快照介绍
  8. vs2010 rdlc 报表及报表控件
  9. Java VisualVM添加远程JMX连接时提示“无法使用service:jmx:rmi:///jndi/rmi******连接到*****”
  10. gradient descent,计算图,backpropagation
  11. 宣布降低Windows Azure 存储和计算的价格
  12. seaborn箱线图_Seaborn线图的数据可视化
  13. 一个完整的python项目_一个完整的机器学习项目在Python中的演练(一)
  14. C#XtraReport学习之二 winform打印按钮
  15. Excel 条件格式查重问题
  16. Kappa(cappa)系数只需要看这一篇就够了,算法到python实现
  17. Beetl的配置的最基本元素
  18. MPC算法轨迹跟踪课程资源
  19. 【社区周会】2021-07-13 工程进展内容概要
  20. vc2015/2010整型转字符串-字符串转整型 vc++

热门文章

  1. 从前端程序员的视角看小程序的稳定性保障
  2. TreeSet HashSet
  3. 牛客练习赛3 E - 绝对半径2051
  4. 云时代服务器端工程师必备 CDN 技能包
  5. 设置参数cocos2d-x 2.x 进度条CCProgressTimer
  6. ASP.net本地调试时正常,发布时错误的几个问题解析
  7. IE浏览器中iframe背景BODY透明
  8. 四. RxJava之基本原理
  9. axios 参数对象的值为数组时,后端无法接收(待解决)
  10. HDU2544 最短路(模版题dijkstra/floyd/spfa)