一种基于局域网的点对点语音通信

引言

随着计算机网络的日益普及,人们通过网络进行交流显得越来越重要,于是出现了一系列语音通信的软件,比如NetMeeting、IPPhone、MediaRing以及VoxPhone等等,但这些软件都功能完善、相对独立,不利于集成到自己开发的软件中,有时我们也希望将这种语音通信功能集成到自己的软件中,尤其当一个单位的局域网用户分散在不同的房间时。本文给出一种灵活、简单的实现方法,采用基于对话框的方式编程,硬件上只需要一块双DMA通道的声卡(目前的声卡大多支持双DMA通道)和一支耳麦,其余全部由软件编程实现。程序在 Windows98/2000、Visual C++6.0 下编译通过,在Windows NT 100M 以太网上运行良好。

设计思路

要实现点对点语音通信,原理非常简单,只要针对一个点实现话音的实时采集、处理、播放,同时能进行可靠的传送和接收,这样两点一连便可通话。对于前者,采用Windows MDK的低层音频服务比较合适,因为低层音频服务中的回调机制为我们提供了很大的方便。当应用程序不断向设备驱动程序提供音频数据时,设备驱动程序控制音频设备在后台完成录音和放音的具体操作,通过回调机制,我们又可以检测到什么时候用完一个数据块,并及时传送下一个数据块,从而保证了声音的连续,有了这种单机上的实时采集、回放功能后,接下来的工作就是在网络上传送话音数据。在点对点网络传输方面,选择面向连接的TCP协议,TCP传输协议自动处理分组丢失和交付失序问题,这样我们不用为这些问题操心,只需很好地利用这个连接,在采集话音回放之前一方面将自己的话音传给网络,另一方面接收网络传来的话音,这样便实现了点对点语音通信。其结构框图如下:

具体实现

一、话音的实时采集、处理、回放

首先要介绍一下Windows低层波形音频数据块结构 WAVEHDR,其声明如下:

type struct{

LPSTR lpData; //指向锁定的数据缓冲区的指针

DWORD dwBufferLength; //数据缓冲区的大小

DWORD dwByteRecorded; //录音时指明缓冲区中的数据量

DWORD dwUser; //用户数据

DWORD dwFlag; //提供缓冲区信息的标志

DWORD dwLoops; //循环播放的次数

struct wavehdr_tag * lpNext; //保留

DWORD reserved; //保留

} WAVEHDR;

声音的采集和播放都是在操作这个音频数据块结构,实际上主要用到的就是第一个成员变量lpData, 所以我们只要在分配缓冲区(内存)的同时相应分配WAVEHDR数据块结构,然后将缓冲区的指针赋给对应的数据块结构的成员变量 lpData,这样当一个缓冲区填满后,也就是一个音频数据块填满了,通过消息机制就可以在消息函数中进行处理和播放,播放完后又可通过消息函数把缓冲区再送给音频设备输入驱动程序,继续进行采集并播放,当你一次性分配多个缓冲区和数据块结构并赋给音频设备输入驱动程序后,至于把哪个缓冲区填满,然后再把哪个空缓冲区赋给设备输入驱动程序,不需人为干预,完全由Windows控制,这就是一种用动态循环缓冲区实现话音的实时采集、播放的简单而巧妙的办法。实现步骤:

时间: 2024-10-09 00:48:26

一种基于局域网的点对点语音通信的相关文章

实时语音通信的实现

引言 本人虽已学习VC++一年半载,仍觉捉襟见肘,好在有VCKBASE的帮忙,确实学 到了不少东西,www.vckbase.com也成了我每次上民网必到之处(阁下有所不知, 鄙人接受最为严格的管理,上民网是要申请的).近日在做一个通信 方面的程序 ,实时的语音和视频通信当然是大家所喜欢的.本文将向您展示局域网环境下实 时语音通信的的一个解决方案(视频这一块正在做,估计很快就能出炉),Winxp环 境下测试效果良好,并且具有网络 拥塞处理机制,您不妨一看. 本文以第26期 栾义明 先生的<基于AP

VoWi-Fi能给LTE时代的语音通信体验带来什么?

互联网时代用户对业务体验的要求很高,包括对语音业务.这从某种程度上可以解释相对于全球LTE的建设高潮,VoLTE业务的发展却相对平缓得多.作为第一个真正意义上的电信级IP公共语音业务,VoLTE对运营商的网络提出了很高的要求.相对于一些技术问题,LTE的网络覆盖覆盖问题显得比较突出.从一些已经商用的VoLTE市场来看,一开始也不是全面铺开,而是根据各个区域LTE网络部署的实际情况来逐步发展的.在这些市场中,虽然LTE的覆盖和切换到3G网络的功能已经比较完善,但是仍然存在一些区域(比如室内)使得V

一种基于SDR实现的被动GSM嗅探

本文讲的是一种基于SDR实现的被动GSM嗅探, 软件定义无线电(SDR)是一种无线电通信系统,简单来说,就是通过数字信号处理技术在通用可编程数字信号处理硬件平台上,利用软件定义来实现无线电台的各单元功能,从而对无线电信号进行调制.解调.测量.SDR架构放弃了传统无线电电路中所有的硬件单元,包括变频.混频.滤波器.放大器.检波器.解调器等,所有的处理,包括混混频,滤波,解调等都是用软件来完成的,完全是一种新的架构和技术. 其实,SDR技术和架构的无线电产品在军用和商用无线电领域早已广泛使用,近年来

DirectX编程:C#中利用Socket实现网络语音通信[初级版本]

 [声明:本篇来源:http://www.cnblogs.com/stg609/archive/2008/11/19/1334544.html 作者:stg609]       现在时下的VOIP软件很多,比较有名的就是Skype,还有其它诸如UUcall. 快门等等.它们提供的功能除了网络上的语音通话外,还可以与固定电话.手机等通话.在本篇中主要介绍利用C#实现语音通信的基本方法.但是目前只实现了网 络上语音传输的基本功能,而且比较粗糙,没有采用什么算法来优化,所以大家千万不要期望过高.我写这

数据报-关于局域网内计算机的通信

问题描述 关于局域网内计算机的通信 一台计算机是怎么将自己内存中的东西变成数据报然后传递给处于同一局域网内另一台计算机的,能不能详细的说明一下,谢谢啦. 解决方案 首先你应该明白网络通讯是分层的.所以你可以在任何层上进行通讯,当然对方要用对应的程序去解析. 比如说,在IP层上,你可以用raw socket,在传输层上,可以用socket,用udp协议和tcp协议.你还可以在应用层使用http之类的协议. 纠正下你的观点,内存中的东西就是数据,无须"变成数据".你只要选定你采用的协议,按

搜狗研究员讲解基于深度学习的语音分离

基于深度学习的有监督语音分离在学术界和工业界越来越受到关注,也是深度学习在语音领域的应用中重要的一部分.作为雷锋网AI研习社近期组织的一系列语音领域应用的分享会之一,本次我们请到了来自搜狗的研究员文仕学对语音分离方面主要的研究课题和相关方法做一些介绍. 文仕学,过去学物理,后来学EE,现在从事Deep Learning工作,未来投身AI和CM事业.他的研究兴趣在于语音信号处理和深度学习.在加入搜狗之前,曾在中国科学技术大学学习,在该领域的期刊和会议上发表了若干篇论文.现在在搜狗语音团队任副研究员

基于UDP协议的语音聊天系统的设计与实现

问题描述 基于UDP协议的语音聊天系统的设计与实现 系统架构为C/S模式.能登陆.查找.添加好友,先后与2个以上好友语音聊天.服务端存储信息. 解决方案 你可以去学习一下 XMPP 解决方案二: 你这个模型,要是局域网就好说,一个收一个发,开个UDP持续监听就可以,但是要是通外网,那你就要好好学习下,以下几个软件,mqtt,pjsip.不然你做出来的东西可能很难用.

网卡-局域网内的详细通信过程

问题描述 局域网内的详细通信过程 在下正在学习网络相关的知识,现在遇到一个问题. 假设有这样一种网络拓扑结构 PC1<-->B2,B3<-->PC2 其中PC1为1号PC,PC2为2号PC,它们连接到路由器B的端口2和端口3上,其中PC1的IP1为192.168.1.100,PC2的IP2为192.168.1.101,它们的网关(路由器的IP)为192.168.1.1,PC1的MAC地址为MAC1,PC2的MAC地址为MAC2,路由器的MAC地址为MAC3. 现在假如PC1要发一个

Android编程实现基于局域网udp广播自动建立socket连接的方法_Android

本文实例讲述了Android编程实现基于局域网udp广播自动建立socket连接的方法.分享给大家供大家参考,具体如下: android开发中经常会用到socket通讯.由于项目需要,最近研究了一下这方面的知识. 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制. 毫无疑问这中间一定需要用到socket来进行通信.今天就两台设备的握手连接方式分享一下吧,该方法只是本人个人想法的实现,仅供参考,如有雷同,不胜荣幸. 要想使用socket进行通讯,就必须知