利用 !"#$% 进行网络环境下实时多点语音通信
李文华 许 刚
’华北电力大学信息工程系!北京 >"!!"&$
摘 要 目前网络语音通信应用逐步增多!但效果还不甚理想" 该文阐述了应用音频处理 *+( 函数&*,+-. 编码调制技
术和 G,+ 协议进行网络环境下实时多点语音通信的方法 !并给出其实现过程 " 实现机制为发送端利用低层音频服务的
回调机制对音频数据块进行动态循环处理 !防止了由于系统在写满语音输入缓冲区后 !新&旧 缓 冲 区 交 换 时 有 一 定 的 间
隙而产生的输入数据泄漏" 在传输之前采用 *,+-. 编码!有效地利用了现有带宽!传输后经缓冲解码再进行播放!尽可
能 地 恢 复 原 始 语 音 信 号 " 由 于 采 用 *,+-. 编 解 码 技 术 !实 现 了 在 各 种 网 络 环 境 下 进 行 实 时 多 点 语 音 通 信 !效 果 较 为
理 想"
关键词 *,+-. 编码 语音通信 G,+ 传输
文章编号 >""!JE%%>J’!""#$%&J">!KJ"# 文献标识码 * 中图分类号 H+%L%
&’()*+,-’ %.)+,*/0,1+ 2/’’34 $0--.1,3(+,01 56,17
!"#8% ,1 80-/.+’9 :’+;09<
=, >’14.( ?. @(17
’,51072M582 <6 (86<7M023<8 N8O3855738O!)<72P -P380 N95Q273Q +"!!"&$
AB6+9(3+( *2 175;582!2P5 01193Q023<8; <6 2P5 ;155QP Q?! 利 用
’()@A-B! 进行网络环境下实时多点语音通信=!C% 发送端采用
*,+-. 编码技术!压缩数据流到原来的 > D E!极 大 地 利 于 网 络
传输" 根据网络状况开设三个以上的缓冲区!利用低层音频服
务的回调机制对音频数据块进行动态循环处理 !防止了由于系
统 在 写 满 语 音 输 入 缓 冲 区 后 !新 &旧 缓 冲 区 交 换 时 有 一 定 的 间
隙而产生的输入数据泄漏" 接收端相应地改变了接到音频数据
经缓冲后马上调用 F045A:2’7325 函数将数据传递给 输 出 设 备
的传统模式=%C!而是采用数据缓冲后解码机制!即接到两个缓冲
区的数据后将这两个缓冲区的音频数 据 进 行 *,+-. 解 码 !再
传递给输出设备!以后每接到一个缓冲区的数据后马上将该音
频数据进行解码再传递给输出设备" 由于输出设备在接收音频
数据后并不是缓冲后立即播放 !而是把数据进行解码 !因此 !如
果数据缓冲区的大小设置得比较合理!在网络正常的情况下输
出数据缓冲队列上会一直有音频数据在等待解码播放 !这样就
避免了在传统方式下!由于网络延时接收端等待音频数据而产
生 的 话 音 停 顿 ! 加 大 了 传 输 的 数 据 量 " 在 传 输 方 式 上 采 用 了
G,+ 协 议 =#C!在 网 络 条 件 较 好 的 情 况 下 !比 H-+ 协 议 =%!IC更 适 合
传输语音信号" 该文最后给出了缓冲区块数&缓冲区路数&同时
连 接 路 数 &语 音 效 果 和 连 接 类 型 的 比 较 实 验 数 据 !并 对 此 进 行
了详细的分析说明!结果表明!采用该文给出的原理机制!进行
网络环境下实时多点语音通信有明显改善"
> ’(),A’@!""" 环境下的音频处理机制和过程
该文介绍的 ’(),A’@!""" 环境下的语音通信!需要经历
作者简介(李文华’>LKIJ$!男!硕士!研究方向为语音信号处理与分析% 许刚!副教授%
计算机工程与应用 !""#$%&
!"#
采集 !编 码 !传 输 !解 码 和 播 放 五 个 阶 段 "这 五 个 阶 段 在 实 时 语
音通信中每一阶段都是十分重要的#
’$’ ()*+,-. /01 音频服务简介
为 了 满 足 不 同 应 用 的 需 求 "()*+,-. /01 $ /234)56+)7
06863,96: 1)4%;&<设 计 了 高 层 &低 层 两 种 不 同 层 次 的 音 频 服 务 #
一般来说" 高层音频服务能够满足大部分的多媒体应用需求 "
它提供与设备无关的应用程序接口 "包 括 媒 体 控 制 接 口 $/=>%
函数和高层波形音频函数"通过存取特定格式的媒体文件来对
音频数据进行操作# 但是这种基于文件格式的控制不适合对音
频数据进行动态实时处理# 而低层音频服务"直接控制与设备
驱动程序打交道的音频数据"它提供了对音频驱动程序的直接
操 作 和 对 音 频 数 据 的 逐 位 的 精 确 控 制 " 是 所 有 音 频 处 理 的 基
础 "包 括 低 层 波 形 音 频 &/>0> 和 辅 助 音 频 函 数 "它 为 多 媒 体 计
算机音频硬件提供了与设备无关的低级接口" 具有灵活性高 &
实时性强的特点# 要想实现对声音的实时处理"就必须摆脱文
件格式的控制"直接对音频数据进行操作"因此"通过低层音频
服务来实现网络通讯比较符合实际需要#
’$! 低层音频采集的过程
首先介绍一下 ()*+,-. 低层波形音频数据块结构 (?@AB
内存(
$&%初 始 化 音 频 数 据 块 结 构 各 成 员 变 量 "主 要 是 将 每 个 缓
冲区指针赋给对应数据块结构中的缓冲区指针变量 390747(调
用 -786>*I:697:6C67+6: $%-786>*?++N2OO6: $% 将 音 频 数 据 块 赋
给输入设备驱动程序(
$_%调用 -786>*J47:4$%函数开始录音#
录 音 开 始 后 "每 当 有 缓 冲 区 填 满 采 样 数 据 后 "就 发 消 息 给
回调对象"由相应的窗口过程或回调函数对数据块中的采样数
据进行处理"到 ?0I=/ 编码阶段#
’$% ?0I=/ 编码
?0I=/ 是利用样本与样本之间的高度相关性和量化阶自
适应来压缩数据的一种波形编码技术;’"_<"==>KK 为此制定了 X$
_!& 推荐标准"使用该标准的编码器的数据率可降低到 ’&‘a L .#
X$_!& ?0I=/ 标 准 是 一 个 代 码 转 换 系 统 " 它 使 用 ?0I=/ 转
换 技 术 " 实 现 ’!Y‘a L . ? 律 或 ! 律 I=/ 速 率 和 ’&‘a L . 速
率 之 间 的 相 互 转 换 # X$_!& ?0I=/ 的 简 化 框 图 如 图 ’ 和 图
! 所 示 #
C0D"其声明如下’
4E96 .4:2F4G
HIJKD 390747( L
0(MD0 +-N2OO6:H6*P4Q( L
0(MD0 +-NE46D6F,:+6+( L
L 指向锁定的数据缓冲区的指针
L 数据缓冲区的大小
L 录音时指明缓冲区中的数据量
0(MD0 +-R.6:( L
0(MD0 +-S37P( L
0(MD0 +-H,,9.( L
L 用户数据
L 提供缓冲区信息的标志
L 循环播放的次数
.4:2F4 -786Q+:T47P!39U6V4( L
0(MD0 :6.6:86+( L
L 保留
L 保留
W (?@AC0D(
声音的采集和播放都是在操作这个音频数据块结构 "实际
上主要用到的就是第一个成员变量 390747"所以只要在分配缓
冲区的同时相应分配 (?@AC0D 数据块结构 " 然后将缓冲区
的指针赋给对应的数据块结构的成员变量 390747"这样当一个
缓 冲 区 填 满 后 "也 就 是 一 个 音 频 数 据 块 填 满 了 "通 过 消 息 机 制
就可以在消息函数中进行处理"处理完后又可通过消息函数把
缓冲区再送给音频设备输入驱动程序" 继续进行采集并处理 "
当 你 一 次 性 分 配 多 个 缓 冲 区 和 数 据 块 结 构 并 赋 给 音 频 设 备 输
入 驱 动 程 序 后 "至 于 把 哪 个 缓 冲 区 填 满 "然 后 再 把 哪 个 空 缓 冲
区赋 给 设 备 输 入 驱 动 程 序 "不 需 人 为 干 预 "完 全 由 ()*+,-. 控
制 "这 就 是 一 种 用 动 态 循 环 缓 冲 区 实 现 话 音 的 实 时 采 集 &编 码
的简单而巧妙的办法# 实现步骤’
$’%用 -786>*X64U25068. $% 查 看 当 前 系 统 波 形 音 频 输 入
设备"用 -786M24X64U25068.$%查看当前系统波形 音 频 输 出 设
备(
$!%按 Y"""CZ"’&N)4"单 声 道 的 格 式 设 置 (?@ASMD/?B
KA[ 结构的成员变量(
$%%用 -786>*M96*$%和 -786M24M96*$%分 别 调 用 (?@AT
SMD/?KT\RAD] 参 数 查 看 波 形 输 入 设 备 是 否 支 持 所 设 定 的
格式(
$#% 再 次 用 -786>*M96* $% 和 -786M24M96* $% 分 别 调 用
=?HHN?=1T(>U0M( 参数打开波形输入设备(
$^%分 别 给 音 频 数 据 块 和 音 频 数 据 缓 冲 区 分 配 &锁 定 全 局
!"#
!""#$%& 计算机工程与应用
图 ’ ?0I=/ 编码器
在 图 ’ 编 码 器 中 "? 律 或 ! 律 I=/ 输 入 信 号 转 换 成 均 匀
的 I=/# 差 分 信 号 等 于 均 匀 的 I=/ 输 入 信 号 与 预 测 信 号 之
差# )自适应量化器*用 ! 位二进制数表示差分信号 "但只用其
中的 ’^ 个数$即 ’^ 个量级%来表示差分信号"这是为防止出现
全)"*信号+ )逆自适应量化器*从这 ! 位相同的代码中产生量
化 差 分 信 号 + 预 测 信 号 和 这 个 量 化 差 分 信 号 相 加 产 生 重 构 信
号+ )自适应预测器*根据重构信号和量化差分信号产生输入信
号的预测信号 "这样就构成了一个负反馈回路+
图 ! ?0I=/ 解码器
X$_!& ?0I=/ 编码器的输入信号是 I=/ 代码"采 样 率 是
Y‘CZ"每 个 代 码 用 ’& 位 表 示 "因 此 它 的 数 据 率 为 ’!Y‘a L .+其
输出代码是)自适应量化器*的输出"该输出是用 ! 位表示的差
分 信 号 "它 的 采 样 率 仍 然 是 Y‘CZ"它 的 数 据 率 为 ’&‘a L ."这 样
就获得了 Yb’ 的数据压缩+ 在图 ! 所示的译码器中 "译 码 器 的
部分结构与编码器负反馈回路部分相同+ 此外"还包含有均匀
I=/ 到 ? 律 或 ! 律 I=/ 的 转 换 部 分 " 以 及 同 步 编 码 调 整
$.E*FQ:,*,2. F,+)*P 7+c2.456*4%部分+ 设置同步$串行%编码调
整的目的是为防止在同步串行编码期间出现的累积信号失真 +
在编码器中"差分信号的计算是’
!$"%#$%$"%&$’$"%
$’%
! ! ! ! 式 !’"中 !"!#"是输入的均匀 ()* 信号#!$!#"是 预 测 信 号 $
量 化 器 是 一 个 # 级 非 均 匀 自 适 应 量 化 器 #在 量 化 前 #%!#"转 化
成以 ! 为底的对数表示#并且用自适应定标因子 &!#"度量$ 量
化器输出的幅度值’(!#"’由表 ’ 给出$
表 ’ 量化器输入输出特性
归一化量化器输入范围 4(!#"4 归一化量化器输出
YWV!4%)!#"’-&!#"
T!$"##]‘"
!,‘#,!$"#"
YWV!4%)!#"’-&!#"
’
"
!$-6
"$a’
量 化 后 差 分 信 号 %)!#"由 逆 量 化 器 计 算 #根 据 自 适 应 定 标
因 子 &!#"度 量 #从 表 ’ 中 得 到 输 出 #再 从 对 数 域 转 换 到 原 域 $
量化器定标因子有 ! 种模式适应#快速方式产生的差分信号波
动大#慢速方式产生的差分信号波动小$ 适应速度由这两种方
式的因子共同控制$ 自适应预测器的主要功能是从量化后差分
信号 %)!#"计 算 预 测 信 号 !$!#"$ 预 测 器 采 用 两 种 结 构 #一 个 &
级的模拟零点部分和一个 ! 级的模拟极点部分$ 这种结构可以
适应广泛的输入信号$ 预测信号计算%
!
过程#由于篇幅有限这里就不多介绍了$ 由于网络传输过程中
的延时和延时长短的不确定性#若接收端采用接到音频数据即
马上进行 <=()* 解码的机制 #在解码完一 个 缓 冲 区 的 数 据 与
接到下一缓冲区的数据之间将有时间间隙#从而产生明显的话
音停顿#而人耳对这样的停顿是最为敏感的$ 因此#该文在第一
次接收到一个缓冲区的音频数据后并不马上进行解码 #而是在
接 到 两 个 缓 冲 区 的 数 据 后 将 这 两 个 缓 冲 区 的 音 频 数 据 同 时 解
码#以后每接到一个缓冲区的数据后马上将该数据解码$ 这样#
由于输出设备在接收音频数据后并不是立即解码播放 #而只是
把 数 据 加 载 在 输 出 数 据 缓 冲 队 列 上 #因 此 #如 果 数 据 缓 冲 区 的
大小设置得比较合理#在网络正常的情况下输出数据缓冲队列
上会一直有音频数据在等待解码播放#上述的话音停顿则会得
到明显改善$ 解码的数据传给下一个阶段$
’$6 接收端的播放过程
经解码后获取进行播放的波形音频格式信息 #接下来进行
语音的播放#过程和语音采集相似$ 主要是%
!’"通 过 调 用 >?@ABCDEADFCG=A@;!"(>?@ABCDBHAI!"函 数
!$!#"*
!,+ !#-’"!. !#-+"/!$0 !#"
+ * ’
其中%
&
!$0 !#"*
!1+ !#-’"%)!#-+"
+ * ’
!!"
打开波形输出设备$
!!"调 用 >?@ABCD(JAH?JAKA?LAJ!"函 数 传 递 音 频 数 据 块 的
方法#请求设备驱动程序完成相应准备工作$
!%"调用 >?@ABCDMJNDA 函数将数据传递给输出设备$
%)*%!#"/$!#"
重建信号定义%
!.!#-+"*!$!#-+"/%)!#-+"
预测系数用一个简单的渐进算法%
对于 ! 级预测器%
,’+!’,!,-",’!#-’"/!%&!,-"!23.4!#"/!23.4!#-’"0
,!+!’,!,1",!!#-’"/!,12!23.4!#"0!23.4!#-!"0,
!%"
5.,’!#,’"0!23.4!#"0!23.4!#-’"03
!#"
其中%
4!#"*%)!#"/!$0 !#"
5!,’"+
#,’
#
,’
4,’ 4"!
,’
!!23!,’ " 4,’ 45!
对于 & 级预测器%
1+!#"*!’,!,-"1+!#-’"/!,1!23.%)!#"0!23.%)!#-+"0
++’#!#’#&
初始值设置为%
%!""+!6!""+!7!""+"
%)!#"
,’#,!
#8"
表示渐进系数
!6"
表示移动平均系数
1+
%!#" 表示差分信号
%)!#" 表示量化后差分信号
$!#" 表示量化误差
-7’&89 : ; 的 录 音 信 号 作 为 输 入 信 号 经 <=()* 编 码 转 为
’&89 : ; 的信号后发送到 传 输 端 口 #然 后 #对 该 数 据 块 进 行 必 要
的准备后重新发送给输入设备# 以准备接受后续的采样数据 $
这 样 #音 频 数 据 块 在 消 息 的 控 制 下 被 循 环 使 用 #使 得 实 时 处 理
过程可以持续下去$
’$# 接收端 <=()* 解码
<=()* 解码器的工作原理和编码器类似 # 就是编码的逆
! 多点双向网络通信机制
!$’ 网络通信机制
目前网络通信有很多不同方式#通常应用较多的主要包括
调 制 解 调 器 拨 号 上 网 (
缓冲区又可参加调度! 减少了等待数据时间和缓冲区的数目 "
由于播放器的缓冲区也可实现缓存!因此不必再将数据进行缓
存!接收方收到数据后将数据直接送到解码器解码 " 但在解码
器中如果数据不够解码显示!则需等待数据的到来" 通过该方
法从而实现了实时语音数据的传输并播放" 与其它网络程序相
比!其初始化稍有不同" 初始化得到一个 ’()*+, 套接字需进行
如下设置#
-’()*./’0’()*+,$
0123456! 7
7 地址家族
’89:2;<=0>! 7
7 套接字的类型
"! 7
7 协议类型
$?@/’0@=86898?2 3418%4A??! 7
7 协议内容
"! 7
7 保留
/’021?0<2>A?63@8346292?501B/’021?0<2>A?63@83462
;2?501%& 7
7 数据报标志
然 后 !通 过 ’+,C()*(D, 函 数 设 置 套 接 字 的 属 性 !如 允 许 地
址重用’缓冲区是接收还是发送等( 通过 /’03(),E 函数设置套
接字生存时间!调用 FGHI 对套接字进行绑定) 注意在初始化时
目的地址一定是上面所提到的多播地址" 但在接收方还需调用
/’0J(GH?+KL 来加入多播组!其设置如下#
-4+MC()*./’0J(GH?+KL *-C()*! 7
7 ’()*+, 套 接 字 必 须 为 多 播 标 志
进行创建否则调用失败
*@’89:0;;=%IC,;+C,0IIN! 7
7 多播地址
7 多播地址长度
4A??! 7
CGO+(L*C,;+C,0IIN%! 7
7 呼叫者数据
7 被叫者数据
7 ’()*+, 套接字的 P(’ 设置
7 ’()*+, 组的 P(’
4A??! 7
4A??! 7
4A??! 7
7 允许接收和发送
J?2F86Q%& 7
发送方和接收方的多播地址一定要相同!它们才是一个组
的 ) 初 始 化 完 成 后 ! 在 发 送 方 响 应 发 送 的 消 息 中 调 用
/’0’+HI6( 函数!接收方的 接 收 调 用 /’0=+)R1N(S 函 数 ) 接
收 方 的 接 收 可 以 是 阻 塞 和 非 阻 塞 的 ! 笔 者 所 采 用 的 是 阻 塞 方
式!所以在接收数据中设置了等待超时) 为了实现返回!调用函
数#
/’0/KG,1(N>TE,GDE+5U+H,C*E! 7
7 指向等待事件的句柄
-5U9H,! 7
7 等待事件的个数
LKEC+! 7
7 等待一个事件的同步
7 等待超时时间
V2H6GS+(T,! 7
表 ! 不同网络下的测试结果
数据缓冲 数据缓冲 同时连
语音效果
网络类型
区块数 区大小*F% 接路数
#
#
#
%
%
%
!
!
!
%
%
%
W&""
W&""
W&""
Y""
Y""
Y""
Y""
Y""
Y""
&""
&""
&""
X
X
%
X
X
%
X
X
%
X
X
%
W""> 局域网
W"> 局域网
可以多点双向正常传输!无顿音!
话音清晰质量好!延时较大
可以多点双向正常传输!无顿音!
话音清晰质量好!延时较大
可以多点双向正常传输!无顿音! 拨号上网
话音清晰质量好!延时较大
可以多点双向正常传输!无顿音!
话音清晰!延时小
可以多点双向正常传输!无顿音!
话音清晰!延时小
可以多点双向正常传输!稍有顿音! 拨号上网
话音清晰!延时小
话音不连续
W""> 局域网
W"> 局域网
话音不连续
话音不连续
W""> 局域网
W"> 局域网
拨号上网
话音连续!音质差!延时最小
话音连续!音质差!延时最小
话音连续!音质差!延时最小
W""> 局域网
W"> 局域网
拨号上网
语音信号只需要 W&* 的带宽!即使用 X&* 的调制解调器上网可
以 正 常 同 时 传 输 % 路 !在 局 域 网 上 路 数 可 以 达 到 更 多 !这 十 分
有利于推广应用" 即使在临界状态下也能很好的传输语音 !这
充分说明了缓冲区的重要性" 在网络阻塞时!网络流量下降到
W"* 左右时短时间内也能正常传输!只要根据自 己 的 网 络 状 况
和资源大小选择好缓冲区大小和块数就能很好地传输语音" 该
程序设计在 U9\\ U&$" /34;8/’!""" 下通过! 其 详 细 源 代
码可以联系笔者"
# 结论
该 文 是 多 媒 体 通 信 与 网 络 传 输 项 目 的 重 要 内 容 ! 在 基 于
/34;8/’ !""" 的 系 统 上 采 用 0;@9> 可 以 很 好 地 完 成 网 络
环境下实时多点语音通信" 从上述实验可以看出 !采样频率固
定的情况下!关键是选择好缓冲区大小和块数使语音的传输效
果达到最好" 由于采用 0;@9> 编码!用 X&*[DC 调制解调器传
输效果也较理想!适合广大网络用户使用!应用范围广泛" 另外
还有待改进的地方将有文章另行介绍" *收稿日期#!""# 年 X 月%
LKEC+%../’02/03625U5462" 7
接收到的数据放到缓冲区!经解码器解码后播放) 每个点
7 超时
参考文献
上的设置大致相同!实现多点语音通信)
% 实验结果和分析
该 实 验 是 在 W""> 局 域 网 +W"> 局 域 网 和 X&:>8;5> 拨
号 上 网 等 多 种 网 络 上 进 行 测 试 ! 基 于 /GHI(MC!""" 环 境 下 完
成的" 五台机器建立连接*五台以上机器连接原理与五台机器
连接相同 %!语音采样用 YZW&*[D 7 C 位单声道方式 !经过反复 试
验得到表 ! 所示实验数据"
从表 ! 数据可以看出!语音传输的质量是由数据缓冲区的
大小决定的!缓冲区越大音质越好!但延时也会增大" 而缓冲区
块数最少要在 % 块以上才能正常工作!网络条件差时可以增加
缓 冲 区 块 数 ! 但 同 时 也 会 消 耗 更 多 的 系 统 内 存 " 由 于 采 用 了
0;@9> 编码!数据流减少到未压缩时的 W 7 Y!每路 YZW&*[ 7 C 的
!"#
!""#$%& 计算机工程与应用
W$36A]6 =+)(SS+HIK,G(H < ^!&$#" !%! !!# !KHI W& *[ 7 C 0IKD,GR+
;GLL+N+H,GKE @TEC+ 9(I+ >(ITEK,G(H *0;@9>%$W__"
!$+ 通 科 技 研 究 中 心$网 络 硬 件 及 配 置 标 准 教 程‘>a$人 民 邮 电 出 版 社 !
!""!]"_
%$张 静 !许 刚$基 于 /GHI(MC_Y 环 境 的 多 点 双 向 数 字 语 音 通 信‘Jb$计 算
机工程!!""%&!_*&%
#$/ =G)-KNI ’,+R+HC$69@ 7 3@ 3EETC,NK,+I!U(ETS+ W!6-+ @N(,()(EC$W__^
X$;(TVEKC 5 9(S+N$用 69@ 7 3@ 进 行 网 际 互 连 ‘>b$ 电 子 工 业 出 版 社 !
W___]"&
&$马华东$多媒体计算机技术原理‘>b$清华大学出版社!W___
^$李煜晖!朱山风!段上为等译$多媒体数字压缩原理与标准‘>b$电子工
业出版社!!"""]"Y
Y$易君$UGCTKE 9\\$456 网络编程‘>b$中国铁道出版社!!""%]"&