请问如何用delphi编写一个最简单的局域网语音聊天程序。 请问如何用delphi编写一个最简单的局域网语音聊天程序。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个恐怕有点难。不过Socket肯定是要用到的! 肯定要用UDP,TCP效率太低.但具体怎么办,我也不知道:) 你自己控制录音吧,在API层实现录音和播放一个简略的方案就是 采用双缓冲区,然后用流的方式传送语音数据流(推荐用UDP吧,都有控件的),如果你愿意的话还可以进行压缩后传送,这样效率比较高PS:至于如何录音和播放还用细说吗? 有一个包可以下载.名字记不得了.不好意思.到Delphi盒子去找. tcpserver accept的readln()接收 ,tcpclient connect 连接 并有sendln()发送这是基本的思路,好久没用了,方法名和事件名可能不太对。如果做聊天系统的话,有两种办法:一:在每一个应用程序都放一个tcpserver和tcpclient一个发一个接,每个客户是服务端又是客户端二:做一个服务器,每个用户就是客户端 录音和播放方面想用控件的话用MMTools我觉得比较好用,然后用 UDP进行传输不过很遗憾 MMTools 目前没有完整、正式的帮助文档和说明材料,要自己看例子来摸索一下MMTools控件包封装了API层的语音录制和播放等,使用较直接使用API来的方便 TO: zhouhua206(三尺剑一车书,一枝梅千里路) 如果直接用API要用到哪些API,大概介绍一下吧!!谢谢!! 使用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:关闭播放设备时的消息。//--------------------------------------------------------------------至于其中的数据结构如WAVE文件头部结构LPWAVEFORMATEX等在查看MSDN的时候顺带看看相信很容易就能明白//---------------------------------------------------------------要实现同步,则要处理录音和播放的回调消息录音使用双缓冲区交替写,播放使用双缓冲区(或者更多的缓冲区)交替读分别在录音和回放回调函数里进行控制协调,设置互斥和同步关系: 1、录音缓冲区写满一个才能将该缓冲区送给播放设备回放,送出到播放设备后在另外一个缓冲区进行录音写入,如此交替进行; 2、播放设备播放的时候互斥写,即不让录音写入正在播放的缓冲区播放完一个缓冲区后将其交还到录音设备以准备写,同时读出另外一个已经写满的缓冲区,如此交替进行。 3、同一时间内录音和播放不能同时访问存取同一个缓冲区 其中需要注意设置每个缓冲区的大小,缓冲区太小则要频繁切换读写缓冲区(太频繁则还会产生杂音),并且不容易设置互斥和同步关系;太大则从开始录音到开始回放的间隔越大,同步性差。 至于同步以避免读写冲突的问题你自己考虑考虑吧,总之就是不能在对一个缓冲区进行写入的同时做读操作,否则就很可能产生错误。如果需要远程传送,则需要考虑传输延迟的问题,这样就有可能要增大缓冲区的块数以适应之。而如果想把效果做更好些,最好使用多线程,将录音和播放、发送和接收分开——这时候也要考虑线程之间的同步问题。//---------------------------------------------------------------至于其中的数据结构如WAVE文件头部结构LPWAVEFORMATEX等在查看MSDN的时候顺带看看相信很容易就能明白最后补充一下录音和回放同在缓冲区中进行,不用存成文件,否则同步性会很不好如果要远程传送,最好对录制的声音数据压缩后用流传送(如果在Delphi中用流压缩和传送很方便,VC中会麻烦些),接收方进行解压和回放,就象在自己本机回放一样。而如果你只是用做语音对话的话,调低录音质量就可以了,只是录语音的话质量没必要调太高,也没必要用立体声,使用单声道就好了,采样率11025就差不多了。如果还想高级点,可以考虑用一些方法过滤一下,这样能减小噪音。 如果要系统点的话,最好还是看MSDN吧,那讲得蛮详细的,还有一些简单的例子说了这么多,好累~~剩下的你自己研究研究吧 http://www.eastrise.cn/free/NetPhone_Setup.exe 如果需要减小噪音,推荐使用 MMTools 控件包吧,自己写挺麻烦 关于webBrowser提交表单,文本数据 的问题请教 请问如何在程序中显示公式,急!!! 关于ACCESS数据库的问题 用户QQ号码突遭查封 腾讯可能监测极度隐私 请帮助我一下,好吗? 新建一application, 给application.onhelp和form1.onhelp事件写入代码。为什么按 F1 两个事件都不触发? 要学com从哪开始? 上次问了没得到答案这次再问 delphi5.0的edit,memo控件没了ctl3d属性,那要去掉ctl3d怎办?? 大家帮帮我???我给分!!!!!!!! 【新手每日一问】关于简单解约瑟夫问题--delphi的链表 delphi 2005
一个简略的方案就是 采用双缓冲区,然后用流的方式传送语音数据流(推荐用UDP吧,都有控件的),
如果你愿意的话还可以进行压缩后传送,这样效率比较高PS:至于如何录音和播放还用细说吗?
名字记不得了.
不好意思.
到Delphi盒子去找.
这是基本的思路,好久没用了,方法名和事件名可能不太对。如果做聊天系统的话,有两种办法:
一:在每一个应用程序都放一个tcpserver和tcpclient一个发一个接,每个客户是服务端又是客户端
二:做一个服务器,每个用户就是客户端
不过很遗憾 MMTools 目前没有完整、正式的帮助文档和说明材料,要自己看例子来摸索一下MMTools控件包封装了API层的语音录制和播放等,使用较直接使用API来的方便
如果直接用API要用到哪些API,大概介绍一下吧!!谢谢!!
录音和回放基本流程如下:
基本流程是:
打开录音设备函数
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:关闭播放设备时的消息。
//--------------------------------------------------------------------
至于其中的数据结构如WAVE文件头部结构LPWAVEFORMATEX等
在查看MSDN的时候顺带看看相信很容易就能明白
//---------------------------------------------------------------要实现同步,则要处理录音和播放的回调消息
录音使用双缓冲区交替写,播放使用双缓冲区(或者更多的缓冲区)交替读分别在录音和回放回调函数里进行控制协调,设置互斥和同步关系:
1、录音缓冲区写满一个才能将该缓冲区送给播放设备回放,送出到播放设备后在另外一个缓冲区进行录音写入,如此交替进行;
2、播放设备播放的时候互斥写,即不让录音写入正在播放的缓冲区播放完一个缓冲区后将其交还到录音设备以准备写,同时读出另外一个已经写满的缓冲区,如此交替进行。
3、同一时间内录音和播放不能同时访问存取同一个缓冲区 其中需要注意设置每个缓冲区的大小,缓冲区太小则要频繁切换读写缓冲区(太频繁则还会产生杂音),并且不容易设置互斥和同步关系;太大则从开始录音到开始回放的间隔越大,同步性差。
至于同步以避免读写冲突的问题你自己考虑考虑吧,总之就是不能在对一个缓冲区进行写入的同时做读操作,否则就很可能产生错误。如果需要远程传送,则需要考虑传输延迟的问题,这样就有可能要增大缓冲区的块数以适应之。而如果想把效果做更好些,最好使用多线程,将录音和播放、发送和接收分开——这时候也要考虑线程之间的同步问题。
//---------------------------------------------------------------
至于其中的数据结构如WAVE文件头部结构LPWAVEFORMATEX等
在查看MSDN的时候顺带看看相信很容易就能明白最后补充一下
录音和回放同在缓冲区中进行,不用存成文件,否则同步性会很不好
如果要远程传送,最好对录制的声音数据压缩后用流传送(如果在Delphi中用流压缩和传送很方便,VC中会麻烦些),接收方进行解压和回放,就象在自己本机回放一样。而如果你只是用做语音对话的话,调低录音质量就可以了,只是录语音的话质量没必要调太高,也没必要用立体声,使用单声道就好了,采样率11025就差不多了。
如果还想高级点,可以考虑用一些方法过滤一下,这样能减小噪音。
说了这么多,好累~~剩下的你自己研究研究吧