freeswitch支持三种模式的DTMF传输方式,分别时inband、INFO、2833。
在传统的PSTN网络中,所有的DTMF码都是inband模式,所以VOIP网络和PSTN网络对接中,需要将DTMF码做格式转换,通常是2833和inband之间的转换。
freeswitch作为VOIP和PSTN网络中间的媒体服务器时,AB路会协商为不同的DTMF按键格式,我们需要一种可以将2833和inband格式互转的方案。
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.10.7
GCC:4.8.5
freeswitch中有两个inband到2833格式的转换接口,分别是“start_dtmf”和“spandsp_start_dtmf”。根据之前的测试结果,我们选择“spandsp_start_dtmf”。
而2833到inband格式的转换接口只有一个“start_dtmf_generate”。
fs内部默认在没有2833的情况下使用info传递DTMF,需要设置通道变量“rtp_info_when_no_2833”。
在我们的模拟场景中,A路使用2833,B路使用inband。
修改拨号计划如下。
其中,A路使用2833,对A路设置了“start_dtmf_generate”接口,将A路的2833转换为B路的inband。
B路使用inband,对B路设置了“spandsp_start_dtmf”接口,将B路的inband转换为A路的2833。
测试的架构,A(2833)->fs->B(inband)。预期的DTMF流程描述如下。
A路发起呼叫,B路接听并echo媒体流。
A路发送DTMF(2833)到fs,fs转换为DTMF(inband)转发B路,B路终端echo反射媒体流DTMF(inband)到fs,fs转换为DTMF(2833)返回A路。
测试结果如下。
信令流程截图。红框中是A路的DTMF(2833)。
媒体流截图。红框中是B路的DTMF(inband)。
测试结果基本符合预期。
使用拨号计划的app组合,实现了fs支持AB路不同的DTMF格式的转换。
freeswitch的DTMF从inband转换为2833的功能仍然有缺陷,表现为inband中的波形过滤不完全,会造成后续节点识别DTMF时重码的问题。
空空如常
求真得真