请问在对一个.wav文件录音的时候,能同时回放吗?新人求救! 请问在对一个.wav文件录音的时候,能同时回放吗?我用的是一个控件的函数在录音,录出来的是.wav文件.然后用什么方法回放呢?最好是录音和回放差不多同时进行,相当于实时监控功能. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以。下面是代码片断BEGIN_MESSAGE_MAP(LAudio, CWnd)... ON_MESSAGE(MM_WIM_DATA, OnWaveInData)...END_MESSAGE_MAP()waveInStart(...);waveOutOpen(...);LRESULT LAudio::OnWaveInData(WPARAM wParam,LPARAM lParam){...//Save to disk//Output...} 首先控件肯定不合要求,你应该用WaveInXXX WaveOutXXX函数直接自己做,具体察看MSDN录音缓冲应该绝对的小才能实现实时 使用WaveInXXX WaveOutXXX函数自己作录音和回放录音和回放基本流程如下:基本流程是:打开录音设备函数 MMRESULT waveInOpen( LPHWAVEIN phwi, //输入设备句柄 UINT uDeviceID, //输入设备ID LPWAVEFORMATEX pwfx, //录音格式指针 DWORD dwCallback, //处理MM_WIM_***消息的 //回调函数或窗口句柄、 线程ID等 DWORD dwCallbackInstance,//通常为0 DWORD fdwOpen //处理消息方式的符号位 );为录音设备准备缓存函数 MMRESULT waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT bwh ); 给输入设备增加一个缓存 MMRESULT waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh ); 开始录音 MMRESULT waveInStart( HWAVEIN hwi ); 清除缓存 MMRESULT waveInUnprepareHeader( HWAVEIN hwi,LPWAVEHDR pwh, UINT cbwh); 停止录音 MMRESULT waveInReset( HWAVEIN hwi ); 关闭录音设备 MMRESULT waveInClose( HWAVEIN hwi );相关消息 MM_WIM_OPEN:打开设备时消息,在此期间我们可以进行一些初始化工作 MM_WIM_DATA:当缓存已满或者停止录音时的消息,处理这个消息可以对缓存进行重新分配, 实现不限长度录音 MM_WIM_CLOSE:关闭录音设备时的消息。//-----------------------------------相对于录音来说,回放就简单的多了,用到的函数主要有以下几个: 打开回放设备 MMRESULT waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPWAVEFORMATEX pwfx, DWORD dwCallback, DWORD dwCallbackInstance, DWORD fdwOpen ); 为回放设备准备内存块 MMRESULT waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh );写数据(播放) MMRESULT waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh );相应的也有三个消息,用法跟录音的类似: MM_WOM_OPEN:打开设备时消息,在此期间我们可以进行一些初始化工作 MM_WOM_DONE:当缓存已播放完毕或者停止播放时的消息, 处理这个消息可以对缓存进行重新分配,实现不限长度播放 MM_WOM_CLOSE:关闭播放设备时的消息。//--------------------------------------------------------------------要实现同步,则要处理录音和播放的回调消息录音使用双缓冲区交替写,播放使用双缓冲区交替读分别在录音和回放回调函数里进行控制协调,设置互斥和同步关系: 1、录音缓冲区写满一个才能将该缓冲区送给播放设备回放,送出到播放设备后在另外一个缓冲区进行录音写入,如此交替进行; 2、播放设备播放的时候互斥写,即不让录音写入正在播放的缓冲区播放完一个缓冲区后将其交还到录音设备以准备写,同时读出另外一个已经写满的缓冲区,如此交替进行。 3、同一时间内录音和播放不能同时访问存取同一个缓冲区 其中需要注意设置每个缓冲区的大小,缓冲区太小则要频繁切换读写缓冲区,并且不容易设置互斥和同步关系;太大则从开始录音到开始回放的间隔越大,同步性差。//---------------------------------------------------------------至于其中的数据结构如WAVE文件头部结构LPWAVEFORMATEX等在查看MSDN的时候顺带看看相信很容易就能明白 自己补充一下录音和回放同在缓冲区中进行,不用存成文件,否则同步性会很不好如果要远程传送,最好对录制的声音数据压缩后用流传送(如果在Delphi中用流压缩和传送很方便,VC中会麻烦些),接收方进行解压和回放,就象在自己本机回放一样。 如何将IPicture抽象类实例化 请大侠出手相救!vfw中生成avi文件的问题 openGL显示三维文字 在C++ vs2005 中编译的lib 库,是否可以链接到VC6.0 中。 关于access数据库 !!一个小问题,各位大侠,你们能帮小弟一把吗? 如何在CFileDialog加自己的控件 数据库小问题,急等! 能不能暂停Windows中所有用户应用程序的执行? 数据库连接有问题啊,紧急求救 可以得到iframe中的页面内容吗? 急问:基于对话框的mfc应用程序
下面是代码片断
BEGIN_MESSAGE_MAP(LAudio, CWnd)
...
ON_MESSAGE(MM_WIM_DATA, OnWaveInData)
...
END_MESSAGE_MAP()
waveInStart(...);
waveOutOpen(...);LRESULT LAudio::OnWaveInData(WPARAM wParam,LPARAM lParam)
{
...
//Save to disk
//Output
...
}
录音缓冲应该绝对的小才能实现实时
录音和回放基本流程如下:
基本流程是:
打开录音设备函数
MMRESULT waveInOpen( LPHWAVEIN phwi, //输入设备句柄
UINT uDeviceID, //输入设备ID
LPWAVEFORMATEX pwfx, //录音格式指针
DWORD dwCallback, //处理MM_WIM_***消息的
//回调函数或窗口句柄、 线程ID等
DWORD dwCallbackInstance,//通常为0
DWORD fdwOpen //处理消息方式的符号位 );为录音设备准备缓存函数
MMRESULT waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT bwh );
给输入设备增加一个缓存
MMRESULT waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh );
开始录音
MMRESULT waveInStart( HWAVEIN hwi );
清除缓存
MMRESULT waveInUnprepareHeader( HWAVEIN hwi,LPWAVEHDR pwh, UINT cbwh);
停止录音
MMRESULT waveInReset( HWAVEIN hwi ); 关闭录音设备
MMRESULT waveInClose( HWAVEIN hwi );相关消息
MM_WIM_OPEN:打开设备时消息,在此期间我们可以进行一些初始化工作
MM_WIM_DATA:当缓存已满或者停止录音时的消息,处理这个消息可以对缓存进行重新分配,
实现不限长度录音
MM_WIM_CLOSE:关闭录音设备时的消息。
//-----------------------------------
相对于录音来说,回放就简单的多了,用到的函数主要有以下几个:
打开回放设备
MMRESULT waveOutOpen( LPHWAVEOUT phwo,
UINT uDeviceID,
LPWAVEFORMATEX pwfx,
DWORD dwCallback,
DWORD dwCallbackInstance, DWORD fdwOpen ); 为回放设备准备内存块
MMRESULT waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh );写数据(播放)
MMRESULT waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh );相应的也有三个消息,用法跟录音的类似:
MM_WOM_OPEN:打开设备时消息,在此期间我们可以进行一些初始化工作
MM_WOM_DONE:当缓存已播放完毕或者停止播放时的消息,
处理这个消息可以对缓存进行重新分配,实现不限长度播放
MM_WOM_CLOSE:关闭播放设备时的消息。
//--------------------------------------------------------------------
要实现同步,则要处理录音和播放的回调消息
录音使用双缓冲区交替写,播放使用双缓冲区交替读分别在录音和回放回调函数里进行控制协调,设置互斥和同步关系:
1、录音缓冲区写满一个才能将该缓冲区送给播放设备回放,送出到播放设备后在另外一个缓冲区进行录音写入,如此交替进行;
2、播放设备播放的时候互斥写,即不让录音写入正在播放的缓冲区播放完一个缓冲区后将其交还到录音设备以准备写,同时读出另外一个已经写满的缓冲区,如此交替进行。
3、同一时间内录音和播放不能同时访问存取同一个缓冲区 其中需要注意设置每个缓冲区的大小,缓冲区太小则要频繁切换读写缓冲区,并且不容易设置互斥和同步关系;太大则从开始录音到开始回放的间隔越大,同步性差。//---------------------------------------------------------------
至于其中的数据结构如WAVE文件头部结构LPWAVEFORMATEX等
在查看MSDN的时候顺带看看相信很容易就能明白
录音和回放同在缓冲区中进行,不用存成文件,否则同步性会很不好
如果要远程传送,最好对录制的声音数据压缩后用流传送(如果在Delphi中用流压缩和传送很方便,VC中会麻烦些),接收方进行解压和回放,就象在自己本机回放一样。