freeswitch两个DTMF转换接口的区别

概述
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时重码的问题。
后续我们再研究如何解决该问题。
空空如常
求真得真
freeswitch两个DTMF转换接口的区别的更多相关文章
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
当你看见这个标题的时候,你可能会下意识的去想一下,这两种方式到底有什么样的区别呢? 且看下面的demo,自然便区分开了 /** * */ package com.b510.test; /** * Pr ...
- UI:字典的两种取值的区别
字典的两种取值的区别 (objectForKey: 和 valueForKey )参考 一般来说 key 可以是任意字符串组合,如果 key 不是以 @ 符号开头,这时候 valueForKey: 等 ...
- Android(java)学习笔记227:服务(service)之服务的生命周期 与 两种启动服务的区别
1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...
- form表单中get和post两种提交方式的区别
一.form表单中get和post两种提交方式的区别? 1.get提交表单中的内容在链接处是可见的.post不可见 2.post相比于get是安全的 3.post不收限制大小,get有限制大小(黑马视 ...
- iOS学习——UITableViewCell两种重用方法的区别
今天在开发过程中用到了UITableView,在对cell进行设置的时候,我发现对UITableViewCell的重用设置的方法有如下两种,刚开始我也不太清楚这两种之间有什么区别.直到我在使用方法二进 ...
- Python 中格式化字符串 % 和 format 两种方法之间的区别
Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...
- 网站开发进阶(六)JSP两种声明变量的区别
JSP两种声明变量的区别 在JSP中用两种声明变量的方法,一种是在<%! %>内,一种是在<% %>内.他们之间有什么区别呢?我们直接看一个JSP文件来理解. 代码如下: &l ...
- nuxt框架Universal和Spa两种render mode的区别
如下图,官网上对于Universal 和 Spa 两种render mode的区别,并没有加以说明,相信大多数人跟我一样有点懵,不知道选什么好.虽然两个模式创建的项目看不出区别. 先给出推荐选项: U ...
- Java中String对象两种赋值方式的区别
本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...
- LR两种录制模式的区别
loadrunner的录制模式分为如下两种录制模式: HTML-based script,也称为高层录制: URL-based script,也称为底层录制. 两种录制模式的区别:1)脚本不同:高层录 ...
随机推荐
- 2023振兴杯-Crypto wp
crypto1 题目 from flag import flag def encrypt(x, y): key='zxb' result='' for i in range(len(x)): resu ...
- Selenium的基本api
1.打开浏览器的驱动,以chrome为例 from selenium import webdriver #chrome驱动 driver = webdriver.Chrome(executable_p ...
- java,类、实例化、构造方法、this关键字、方法重载
编写类的步骤: 1.定义类名 2.编写类的属性 3.编写类的方法 public 访问修饰符,表示在整个项目中都可以调用,也可以用其他词 使用class关键字来定义类,如下,定义一个Cat类 给了属性 ...
- 从零玩转QQ登录-clwzqqdlu
title: 从零玩转QQ登录 date: 2021-05-01 15:55:39.951 updated: 2023-03-30 13:29:03.865 url: https://www.yby6 ...
- 微信现金红包开发 PHP
第一次在cnblogs发文章 微信商家后台-现金红包开发 sdk <?php class wxPay { //配置参数信息 const SHANGHUHAO = "1430998xxx ...
- Spring 中循环依赖的处理
Spring 提供了十分强大的依赖注入功能,使得我们不再需要手动去管理对象的依赖项.然而,在实际的使用场景中,可能会遇到类似下面的依赖异常: Exception encountered during ...
- pyecharts 保存图表至本地
pip install snapshot-selenium from pyecharts.render import make_snapshot from snapshot_selenium impo ...
- 文心一言 VS 讯飞星火 VS chatgpt (51)-- 算法导论6.2 3题
三.当元素 A[i] 比其孩子的值都大时,调用 MAX-HEAPIFY(A.i)会有什么结果? 文心一言: 当元素 A[i] 比其孩子的的值都大时,调用 MAX-HEAPIFY(A, i) 会将 A[ ...
- C++产生N以内的随机整数
C++产生N(这里N=100)以内的随机整数的例子: #include <iostream> #include <ctime> using namespace std; int ...
- openGauss内核分析:执行计划生成
摘要:SQL语句解析完成后被解析成Query结构,在进行优化时是以Query为单位进行的,Query的优化分为基于规则的逻辑优化(查询重写)和基于代价的物理优化(计划生成),主入口函数为subquer ...