1. 从电话按键到数据包:DTMF到底是什么?
如果你用过老式的座机电话,一定记得按数字键时听筒里发出的那种“嘀嘀”声。这可不是随便响响的,它背后是一套精密的音频编码系统,叫做DTMF,中文叫“双音多频”。简单来说,每个按键(0-9、*、#)都对应着两个特定频率的正弦波声音,一个高频,一个低频。比如你按“1”,电话就会同时发出697赫兹和1209赫兹的声音,接收方通过分析音频频谱,就能知道你到底按了哪个键。
在传统的电话网络里,这个声音是直接混在通话的语音流里传输的,也就是所谓的“带内”传输。但到了今天基于IP网络的VoIP时代,比如我们用的微信语音、网络电话,情况就复杂多了。我们不再仅仅传输声音,还要高效、准确地把“用户按了哪个键”这个信息告诉服务器,以便进行IVR语音导航(“按1转人工,按2查余额”)、电话会议密码验证等操作。
这时候,如果还像以前一样,把按键音当作普通声音塞进语音流,问题就来了:网络传输可能有丢包、有延迟,音频编码(如G.711、G.729)本身也会对声音进行压缩和改变,很容易导致服务器端“听不清”或“听错”按键音。所以,工程师们想出了几种更聪明的办法,把按键信息“打包”成数据,进行传输。在FreeSWITCH这个强大的开源软交换平台上,主要支持三种模式:RFC2833、INBAND和SIP INFO。
我刚开始接触FreeSWITCH做IVR项目时,就曾在这里踩过坑。客户反馈说电话菜单经常错乱,明明按了1,系统却识别成了2。排查了半天,最后发现是对方网关设备发送DTMF的方式,和我的FreeSWITCH配置不匹配。所以,搞清楚这三种模式的原理、优缺点和怎么配,可不是纸上谈兵,而是直接关系到你的语音服务稳不稳、用户体验好不好的实战问题。接下来,我就把自己这些年摸爬滚打总结的经验,掰开揉碎了分享给你。
2. 三种DTMF传输模式深度对比
选择哪种DTMF模式,有点像选快递:有的快但可能不同步,有的稳但开销大,有的兼容性好但效率一般。下面这张表能让你快速抓住核心区别:
| 特性维度 | RFC2833 (RTP事件包) | INBAND (带内音频) | SIP INFO (信令带外) |
|---|---|---|---|
| 传输通道 | RTP流内,特殊负载类型 | RTP流内,与语音包混合 | SIP信令通道 |
| 本质 | 带内事件(特殊标记的数据包) | 带内音频(真实的双音多频声音) | 带外信令(独立的SIP消息) |
| 效率 | 高,数据包小,专包专用 | 低,需编码为音频,占用语音带宽 | 中,复用信令通道,但需额外信令交互 |
| 可靠性 | 高,有序列号、时间戳和结束标志 | 低,受语音编码、丢包、延迟影响大 | 高,依赖SIP信令可靠性 |
| 同步性 | 好,与RTP流时间戳同步 | 好,本身就是音频流一部分 | 可能不同步,信令与媒体路径可能独立 |
| CPU消耗 | 低,直接解析文本 | 非常高,需实时音频解码和频谱分析 |


645

被折叠的 条评论
为什么被折叠?



