概述
freeswitch支持三种模式的DTMF传输方式,分别时inband、INFO、2833。
在传统的PSTN网络中,所有的DTMF码都是inband模式,所以VOIP网络和PSTN网络对接中,需要将DTMF码做格式转换,通常是2833和inband之间的转换。
环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.10.7
GCC:4.8.5
inband到2833的两个接口
freeswitch中有两个inband到2833格式的转换接口,分别是“start_dtmf”和“spandsp_start_dtmf”。
两个接口的功能是一样的,都是检测inband中的DTMF按键波形。
<action application="start_dtmf" />
<action application="spandsp_start_dtmf"/>
fs官方的描述中已经有明确说明,“start_dtmf”接口为老版本接口,尽量使用“spandsp_start_dtmf”来实现业务。
那么,这两个接口有什么区别呢。
start_dtmf测试
配置dialplan拨号计划如下。
<include>
<context name="out2in">
<extension name="sbc-out2in" continue="true">
<condition field="destination_number" expression="^(\d+)$">
<action application="export" data="nolocal:execute_on_media=start_dtmf" />
<action application="bridge" data="{sip_invite_call_id=${sip_call_id}
}sofia/external5066/sip:${destination_number}@10.55.55.138:5090"/>
</condition>
</extension>
</context>
</include>
从截图中,可以看出。
start_dtmf接口有识别出inband中的DTMF码,并转换为2833到A路。
但是红框中的媒体流中的DTMF波形并没有任何变化。
A路收到的媒体流中,既有inband的DTMF波形,也有2833的DTMF码。
spandsp_start_dtmf测试
配置dialplan拨号计划如下。
<include>
<context name="out2in">
<extension name="sbc-out2in" continue="true">
<condition field="destination_number" expression="^(\d+)$">
<action application="export" data="min_dup_digit_spacing_ms=40"/>
<action application="export" data="spandsp_dtmf_rx_threshold=-42"/>
<action application="export" data="spandsp_dtmf_rx_twist=8"/>
<action application="export" data="spandsp_dtmf_rx_reverse_twist=6"/>
<action application="export" data="spandsp_dtmf_rx_filter_dialtone=true"/>
<action application="export" data="nolocal:execute_on_media=spandsp_start_dtmf" />
<action application="bridge" data="{sip_invite_call_id=${sip_call_id}
}sofia/external5066/sip:${destination_number}@10.55.55.138:5090"/>
</condition>
</extension>
</context>
</include>
从截图中,可以看出。
spandsp_start_dtmf接口有识别出inband中的DTMF码,并转换为2833到A路。
同时,红框中的媒体流中的DTMF波形被过滤掉了大部分,遗留部分的波形大概有30ms左右,当A路设备(如TG)会同时检测2833和inband时,仍然有概率会发生重码的问题。
A路收到的媒体流中,有2833的DTMF码,和少量inband的DTMF码波形。
总结
freeswitch的“spandsp_start_dtmf”接口,表现更好,功能性更完整。
freeswitch的DTMF从inband转换为2833的功能仍然有缺陷,表现为inband中的波形过滤不完全,会造成后续节点识别DTMF时重码的问题。
后续我们再研究如何解决该问题。
空空如常
求真得真