发布时间:2019-12-18 16:14:59
随着国际互联网的发展, 人们之间的交流已经不再局限于昂贵的普通电话或电子邮件, 越来越多的人开始使用网络电话。网络电话( Internet Phone) 即 IP 电话, 通过对语音信号采样量化, 转化为数字信号, 然后对这些数字信号进行压缩, 通过 IP 网络传送给对方, 对方将这些信号进行解压缩后还原为语音信号。 IP 电话和传统电话的区别关键在于 IP 电话传输基于包交换, 这就导致了 IP 电话的延时。
随着网络技术的飞速发展和语音压缩算法的改进, 普通电脑使用者使用网络电话成为可能。特别是 20 世纪 90 年代以来, 信息目前的计算机基本可以满足要求。处理技术、计算机技术和通信技术飞速进展, 低码率语音压缩技术已经形成国际标准, ITU T 通过H. 323 协议[1], 使得在 IP 网络上传输高质量的语音成为可能。
目前 IP 电话的实现方案
1. 1 实现方案
(1)PC PC 通信: 通话双方由PC 构成, PC 机的声卡采集输入的语音信号, 压缩后经 Internet 或 In tranet 传输, 对方的 PC 进行解压缩后通过声卡播放[2]。
(2)PC 电话通信: 通话双方由 PC 机和普通电话机组成, PC 机对语音进行数字化采样, 经 IP 网络进行语音信号的传输, 在对方的 PSTN 网关, 语音信号被还原并传送到电话机, 而电话机的语音信号则在 PSTN 与 IP 网络接入处被数字化, 然后通过 IP 网路传输[3]。
(3)电话电话通信: 通话双方都由普通电话机组成, 语音信号通过普通电话线到达本地 PSTN 网关, 被采样转化为数字信号, 经 IP 网络进行传输, 在对方的 PSTN 网关被还原为语音信号后传送到电话机[4], 这也是目前 IP 电话主要的使用方式。
1. 2 实现方案的比较
(1) 第(1) 种实现方案利用普通计算机的声卡和网络接入设备进行工作, 语音不经过普通市话网, 资费较低。该方案易于实现, 成本低, 但由于该方案采用纯软件方式, 软件计算量大, 可能会造成语音延时过长, 质量难以保证。目前, 各种 IP 电话软件采用低比特率语音压缩算法来克服网络传输速度较慢的问题, 比较常用的国际标准压缩算法有 G 711PCM (64 kbit s, 1972)、 . 721ADPCM (32 kbit s, 1984)、 G 722SBADPCM (48 kbit s 64 kbit s, 1998)、G 723. 1M P MLQ ACEL P (5. 3 6. 3 kbit s, 1996)、 G. 726ADPCM (16 kbit s 48 kbit s, 1988)、G 727Em beded ADPCM (16 kbit s 32 kbit s, 1988)、
G 728LDCEL P (16 kbits, 1992) 和 G 729CSACEL P (8 kbits, 1995) [5]。对于软件压缩算法的计算量,
(2)第(2) 种和第(3) 种实现方案需要解决的主要问题是网关的功能结构, 包括 PSTN 和 IP 网络的信令互通问题, 实现难度较大, 需要有网关等硬件设备, 因此, 成本也较高。这两种实现方案目前是各个电信运营商采用的方案, 用来向用户提供高质量的 IP 电话业务。由于通话双方的语音经过普通市话网, 所以资费较高。
2.. 基于IP 地址动态分配的 .IP. 电话实现方案. .G2
计算机网络用户, 一般使用第(1) 种实现方案, 即 PC toPC 方式, 常用的软件有 Internet Phone、
定的问题,笔者设计的2IP电话实现方案如下2:22 g
VOXphone和N etm eeting等[6]。这种 IP 电话的优点是资费较低, 缺点是联系不便, 在呼叫对方前需要得到对方的 IP 地址, 对于IP 地址动态分配的网络用户来说使用十分不便。为了解决这种 IP 地址不固
每个用户在第一次注册使用时需要申请一个 IP 注册号, 相当于普通电话号码的 IP 电话号码。该 IP 电话号码可以为数字, 也可以是用户的姓名, 通过设置一个中间服务器, 来保存每个用户的 IP 电话号码和对应的IP 地址, 以后用户每次重新启动 IP 电话客户端软件时, 该软件自动将重新分配到的 IP 地址和相应的IP 电话号码发送给服务器, 服务器根据接收到的用户 IP 电话号码和 IP 地址对数据库进行更新, 保证所有用户的 IP 电话号码所对应的 IP 地址最新。这样主叫用户呼叫其它用户时, 只需要输入被叫用户的IP 电话号码, 软件自动联系服务器, 服务器根据被叫用户的 IP 电话号码得到被叫用户的最新 IP 地址, 发给主叫用户, 主叫用户机器根据得到的 IP 地址直接与被叫用户机器建立连接, 完成呼叫。
实现方案的具体构架, 如图 1 所示。

这一构架与其它 IP 电话软件的区别有:
(1)每个 IP 电话用户在第一次注册使用时都需要申请一个惟一的 IP 电话号码(可以是数字, 也可以为文字) , 这个号码用来惟一标识该 IP 电话用户, 相当于普通电话号码, 其它用户知道该号码就可以呼叫该用户。
(2)
设置一个中间服务器, 用来存
储 IP 电话用户的 IP 电话号码和对应的 IP 地址, 用户软件每次重新启动后都自动与服务器联系, 更新对应的 IP 地址。
(3)IP 电话用户在呼叫对方前, 软件会与 IP 电话服务器联系, 根据被叫用户 IP 电话号码得到其最新 IP 地址, 之后自动完成呼叫, 而不是直接输入被叫用户的 IP 地址进行呼叫。
从上述分析可以看出, 这种构架的图 1 IP 电话构架
用户只需要知道对方的 IP 电话号码, 而不需要知道对方动态变更的 IP 地址, 即该方案支持用户 IP 地址的动态分配。
基于 IP 地址动态分配的 IP 电话实现方案的软件实现
鉴于使用 IP 电话的两个用户完全可能使用不同的操作系统, 所以编写一个能同时在不同操作系统下使用的 IP 电话软件更能满足用户的需要。
W indow s 操作系统是目前使用最广泛的操作系统,L inux 也由于免费而受到越来越多的人的青睐, 所以笔者编写了一个能同时在L inux 和W indow s 下使用的 IP 电话软件。由于使用JAVA 开发的程序具有较强的平台可移植性, 因此选用JAVA 来开发该 IP 电话软件, 从而使程序在L inux 和W indow s 之间的移植变得很方便, 对于在其它操作系统下的使用也只需稍作修改。该 IP 电话软件由服务器端软件和客户端软件组成。
3. 1 IP 电话服务器端软件的实现
IP 电话服务器端完成的主要功能有: 用户 IP 电话号码注册、用户拨打 IP 电话时的 IP 地址查询、软件启动时的 IP 地址修改以及用户的通话信息记录等。
服务器不断监听各个客户端发送的请求, 由于可能同时有多个客户请求服务器操作, 所以对每个请求单独开设一个新线程, 该线程在处理完客户请求后自动释放。
监听客户请求和开设新线程的具体实现如下:
ServerSocket listenSocket =new ServerSocket (SERV ER _ PORT, MAX_ CL IEN TS); 创建服务器监听套接字
w hile (keepRunning) {
clientSocket =listenSocket. accep t(); 接收客户请求
HandleClientThread handleClient =new HandleClientThread (clientSocket); 创建处理客户请求处理线程
HandleClient. run ();
运行客户请求处理线程
软件首先创建等待客户请求的服务器套接字, 然后等待客户请求, 如果有客户请求, 则开启新线程去处理[7]。
3. 2 IP 电话客户端软件的实现
IP 电话客户端完成的主要功能有: 不打电话时, 等待别的用户呼叫; 打电话时, 完成从网络接收数据送到声卡播放, 从声卡采样用户话音发送给对方。鉴于目前绝大多数用户使用的是全双工声卡, 因此在通话时, 这些任务是同时发生的。
在 IP 电话客户端之间的通话中, 有通话控制命令的传输和语音压缩数据的传输。通话控制命令(如对方摘机、对方挂机等) 的数据量不大并且要求能被对方准确接收, 因此采用 TCP 进行传输比较合适[8]。而对于语音压缩数据, 即通话双方的通话内容, 这些数据量很大, 要求在一定时间内到达对方, 并且对于其中没有被接收到的数据不能重传, 否则将造成较长延时或语音播放次序颠倒而影响通话质量, 因此采用UDP 来传输[9]。
3. 2. 1 IP 电话客户端完成等待其它用户呼叫的实现
等待其它用户呼叫的实现与 IP 电话服务器端等待客户连接的实现相差不大, 关键在于 IP 电话客户端在同一时间只能同一个 IP 电话用户通话, 而服务器可以同时响应多个客户请求, 应用 TCP 编程, 具体代码如下:
ServerSocket listenSocket =new ServerSocket (SERV ER _ PORT, 1); 创建监听呼叫套接字
w hile (keepW aiting) {
talkSocket =listenSocket. accep t(); 接收其它用户呼叫
HandleTalkThread handleTalk =new HandleTalkThread (talkSocket); 创建通话处理线程
handleTalk. run ();
运行通话处理线程
}
3. 2. 2 IP 电话用户通话时的各个线程实现
在 IP 电话呼叫发起后, IP 电话用户间的 TCP 通讯完成用户双方的摘机判断, 然后UDP 处理线程开启, 将接收到的语音数据发送到声卡进行播放, 同时对声卡数据进行录音、压缩和传输。
其中,UDP 传输以及对声卡进行录音和放音的代码实现如下:
(1)采用UDP 传输语音:
Datagram Socket udpSocket = new Datagram Socket (SERV ER _ PORT+ 1); 创建发送UDP 套接字
udpSocket. send (datagram Packet); 发送数据
(2)对声卡进行录音:
TargetDataL ine line = (TargetDataL ine) A udioSystem. getL ine (info); 创建目标数据L ine
line. open (form at, line. getBufferSize ()2); 打开目标数据L ine
line. start ();
运行目标数据L ine
第 3 期 张 利, 等: 基于 IP 地址动态分配的 IP 电话实现方案325
ATanenbaumlinercher. read,,KCTIP.IP IA(CTdataS, IPI , 0, IPbufferL[M[[MJ [].].M]. ].ength:[J[M]., ].[,J InBytes]. [J,:]. g2);:.:1g 读录音数据
(3)使用声卡播放语音:
SourceDataL ine line = (SourceDataL ine) A udioSystem. getL ine (info); 创建源数据L ine
line. open (form at, bufSize); line. start ();
line. w rite(inputBytes, 0, numBytesRem aining); 播放语音数据
3. 3 软件测试以及结果
在IP 地址动态分配的局域网环境下使用 Pentium III 450M Hz 的计算机, 该软件的测试结果见表
1 所列。
由表 1 测试结果可见, 首先影响语音延
时的关键因素不是操作系统, 而是语音是否表 测试条件及结果
采用压缩算法, 由表 1 中的数据可以看出, 采压缩算法 操作系统 平均语音延时 m s 用 G729 语音压缩算法后, 语音平均延时减无W indow s98160 少一半以上。其次, 用户通过 IP 服务器分配G729W indow s9880 的 IP 电话号码能够顺利地实现相互间的呼无L inux160 叫和通话, 即该实现方案解决了 IP 地址的动G729L inux75 态分配问题。
4 结束语
随着网络技术的飞速发展, 特别是 Internet 的规模更是以几何级数的速度增长, 基于 IP 网络的 IP 电话以其低廉资费必将被广泛使用。
本文介绍了一种可以实现 IP 地址动态分配的 IP 电话构架, 并分析了其中关键技术及其代码实现。经测试, 该软件在W indow s 和L inux 操作系统下都能很好地工作, 如果不采用压缩算法, 即使在局域网通话中也有较明显的延时; 而采用压缩算法如 G729 后, 延时问题得到了明显改善, 并且解决了 IP 地址动态分配的问题。因此, 使用适当的语音压缩算法可以实现高质量的 PC 到 PC 语音通话。
大客户
微信
置顶