录制声音并且播放录取的声音
录制声音一般采用两种机制:
第一种: 直接在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;
}
录制声音并且播放录取的声音相关推荐
- 系统无声音,播放器有声音
引用:http://www.8844.com/default.php?mod=ask_detail&tid=136005 确定若声卡.声卡驱动全无问题(只是开机.关机没声音,播放flash没有 ...
- ubuntu qq音乐/网易云音乐 播放没有声音,播放mv有声音,解决办法
重装了ubuntu系统,下载了qq音乐,播放音乐没有声音,忍不了,解决办法: 终端中执行如下命令 sudo apt install ubuntu-restricted-extras reboot 如果 ...
- java怎么播放不了声音_JAVA3D播放不出声音的解决办法
今天在利用JAVA3D播放声音的时候,碰到一个很奇怪的问题,那就是声音设备无法初始化.它抛出如下异常: java.lang.UnsupportedOperationException: No Audi ...
- 学生用计算机怎么没音效,电脑有声音用播放器没有声音怎么处理啊???
1)电脑无声的解决方法:有修复系统和用软件安装声卡驱动的两种解决方法(首先看看小喇叭或在控制面板中看看是否设置了静音,在通过耳机检查是否有声音输出,如果有,则是音箱或喇叭的故障引起的,在有就是声卡驱动 ...
- C/C++——如何使用PlaySound同时播放两个声音
PlaySound是Windows用于播放音乐的API函数.在vs2010以上版本需要加入#pragma comment(lib, "winmm.lib")才能使用PlaySoun ...
- win10电脑插耳机没声音_Win10如何录制电脑内部播放的声音
有很多Win10系统用户常常会碰到需要录制电脑内部声音的情况,比如录制在线视频中的背景音乐,录制在线播放的歌曲,或者一些网页上的其它声音.如果通过先播放,再通过麦克风进行录制的话,无疑音质会大打折扣. ...
- 电脑声音太小如何增强_如何录制电脑上播放的声音,背景音乐
电脑里面有一些声音无法找到音频源文件,电影小品中的对白很搞笑,背景音乐很好听,一些在线音乐,因为版权问题无法下载,我们想将这些声音或音乐无损录制下来,该如何操作呢? 1,首先在要录制声音的电脑上,安装 ...
- 声网 java app视频录制_java 声音的播放与录制
简单总结了下, 就是format, info, line, 把这三个对象获得就可以了. package com.file; import java.io.ByteArrayInputStream; i ...
- html网页播放flac,教你如何无损录制网页上播放的声音
要对网页上的声音进行无损录制其实很简单,不管是网页上所播放视频上的声音,还是网页上的动画里发出的声音,或者是网页的背景音乐,都是可以进行无损录制的. 1,首先打开浏览器,并在百度上搜索下载支持无损内录 ...
最新文章
- python怎么继承_Python: 如何继承str/string?
- 0x53. 动态规划 - 区间DP(习题详解 × 8)
- 4.Java面向对象相关知识总结
- 突发!ASML断供中芯国际
- 魅族建立基于M8的Android开源项目
- 无法识别的属性 configProtectionProvider的解决方案
- hadoop2.x HDFS快照介绍
- vs2010 rdlc 报表及报表控件
- Java VisualVM添加远程JMX连接时提示“无法使用service:jmx:rmi:///jndi/rmi******连接到*****”
- gradient descent,计算图,backpropagation
- 宣布降低Windows Azure 存储和计算的价格
- seaborn箱线图_Seaborn线图的数据可视化
- 一个完整的python项目_一个完整的机器学习项目在Python中的演练(一)
- C#XtraReport学习之二 winform打印按钮
- Excel 条件格式查重问题
- Kappa(cappa)系数只需要看这一篇就够了,算法到python实现
- Beetl的配置的最基本元素
- MPC算法轨迹跟踪课程资源
- 【社区周会】2021-07-13 工程进展内容概要
- vc2015/2010整型转字符串-字符串转整型 vc++