看到好多网友问到这个问题。一般我们在打电话时会听到“您拨的电话正在通话中,请稍后再拨....”,或“电话无应答...”之类的提示,我们在 freeswitch 里也可以这样做。
其实很简单,默认的配置在呼叫失败时会转到 voicemail (语音信箱),我们只需要在这里修改,让他播放一个语音提示,然后再进入语音信箱(或直接挂 断也行)。
找到 <extension name="Local_Extension">部分的最后几行
<action application="bridge" data="user/${dialed_extension}@${domain_name}"/>
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="bridge" data="loopback/app=voicemail:default ${domain_name} ${dialed_extension}"/> 
其中,第一个 bridge 是说明去呼叫被叫号码,如果呼叫失败,则 dialplan 继续往下走,依次是
应答
睡一会
进入 voicemail
OK, 我们只需要把最后一个bridge那行改成
<action application="playback" data="${originate_disposition}.wav"/> 
重新打电话试一下吧,如果被叫忙,则 originate_disposition 变量就是 USER_BUSY ,用户没注册就是 USER_NOT_REGISTERED 之类的,你只需要保证相关目录下有相对应的声音文件即可(如果LOG中提示找不到声音文件的话试试自己录一个)。
当然,呼不通的原因可能有很多,你总不可能录上所有的声音文件是吧,有两种方法:
1) 使用一个 lua (或其它语言) 的脚本
<action appliction="lua" data="/tmp/xxx.lua"/> 
在 lua 脚本中可以拿到这个 originate_disposition 变量,从而可以使用 if then else 之类的逻辑播放各种声音文件。
2) 当然,如果你脚本也不想编辑的话,实现上 FreeSWITCH 的 dialplan 功能是非常强大的,你只需要将呼叫转到播放不同声音文件的 dialplan:
<action application="transfer" data="play-cause-${originate_disposition}"/> 
然后创建如下 dialplan extension:
 
<condition field="destination_number" expression="^play-cause-USER_BUSY$"> <action application="playback" "/tmp/sounds/user-busy.wav"/> </condition> 
 
 
<condition field="destination_number" expression="^play-cause-USER_NOT_REGISTERED$"> <action application="playback" "/tmp/sounds/user-not-registered.wav"/> </condition> 
 
 
<condition field="destination_number" expression="^play-cause0(.*)$"> <!-- for all other reasons, play this file --> <action application="log" data="WARNING hangup cause: $1"/> <action application="playback" "/tmp/sounds/unknown-error.wav"/> </condition> 
 
小结:
当然,能播放上面的声音文件还有一个前提,就是在第一个 bridge 前面要有以下两行:
<action application="set" data="hangup_after_bridge=true"/> <action application="set" data="continue_on_fail=true"/> 
第一行的作用是,如果第一个 bridge 成功了,被叫挂断电话后我们就没有必要再播放该声音了,因此直接挂机。当然这一行可以没有,那么你在后面的 originate_disposition 里如果发现值是 "NORMAL_CLEARING" (正常挂机)的情况再决定是否播放相关语音。
第二行的作用是,如果呼叫失败(空号,拒接等),继续往下走,否则(值为 false 的情况)到这里就挂机了。该变量的值还可以有以下几种,表示只有遇到这几种情况才播放语音,其它的就直接挂机。
<action application="set" data="continue_on_fail=NORMAL_TEMPORARY_FAILURE,USER_BUSY,NO_ANSWER,TIMEOUT,NO_ROUTE_DESTINATION"/>

FreeSWITCH在呼叫失败的情况下播放语音提示的更多相关文章

  1. python3 在文件确实存在的情况下,运行提示找不到文件

    提示 [Errno 2] No such file or directory: 但是路径下确实存在此文件,在不改动的情况下,再次运行,执行成功. 百思不得其解,看到此链接下的回答 http://bbs ...

  2. linux在telnet情况下root登录提示login incorrect

    root登录时总是提示 login incorrect SSH可以登录 别的用户也可以通过telnet登录 唯独root不可以   解决方法: vi /etc/pam.d/login # auth r ...

  3. JQuery如何在验证表单失败的情况下阻止表单提交

    自定义验证时,使用了return false和event.preventDefault(),但是验证失败之后表单还是提交了 这个问题我也碰到了,尝试了多次也没有用,在调试的时候也发现确实return了 ...

  4. NBU7.0 Image Cleanup作业在没有配置hot catalog backup的情况下失败,Status=1

    Issue NBU7.0 Image Cleanup作业在没有配置hot catalog backup的情况下失败,Status=1 Error NBU7.0 Image Cleanup作业失败, D ...

  5. 如何在删除ibdata1和ib_logfile的情况下恢复MySQL数据库

    昨天,有个朋友对公司内部使用的一个MySQL实例开启binlog,但是在启动的过程中失败了(他也没提,为何会失败),在启动失败后,他删除了ibdata1和ib_logfile,后来,能正常启动了,但所 ...

  6. 什么情况下会用到try-catch

    本文不区分语言,只为记录一次有收获的面试. 面试官:什么情况下用到try-catch?程序员:代码执行预料不到的情况,我会使用try-catch.面试官:什么是预料不到的情况呢?程序员:比如我要计算a ...

  7. Android热修复技术选型(不在市场发布新版本的情况下,直接更新app)

    2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以及微信Tinker,它们在原理各有不同,适用场景各异,到 ...

  8. Oracle主库归档丢失,备库日志有gap,在不重建备库的情况下,恢复备库

    本文主要描述Oracle备库日志与主库日志之间有gap,切主库这部分gap的归档日志已经删除或丢失,如何在不重建备库的情况下,恢复备库. 欢迎转载,请注明作者.出处. 作者:张正 blog:http: ...

  9. [cocos2d-x·解Bug]关于cocos2d-x游戏在android锁屏状态下播放Bgm的解决方法

    最近<宠物联萌>在三星App上发布遇到一个问题:如果用户在锁定屏幕时解锁解到一半时取消解锁,这时用cocos2d-x开发的游戏就会出现游戏Bgm会恢复播放,但手机屏幕仍然是锁屏状态的Bug ...

随机推荐

  1. ODI中显示us7ascii字符集的测试

    安装oracle DB时,选择的字符集:美国.英语.US7ASCII. 在不设置nls_lang的情况,插入中文,成功,但存进去的是乱码,select看到也是??(无论后面再怎么设置nls_lang) ...

  2. php无缝连接滚动

    最近用到了,仿照别人的写了一个 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...

  3. sqlserver定时备份

    前言:给客户部署好系统以后,如果不加一个定时备份,总感觉心里不放心,所以一定要做定时备份,并且定时备份是很简单的 新建作业--基本信息 新建步骤 ) ),) print @filename , NOF ...

  4. FR #2题解

    A. 考虑把(u,v)的询问离线挂在u上,然后dfs,每次从fath[x]到[x]相当于x子树dis区间加1,x子树以外区间-1,然后维护区间和区间平方和等. 常数略大. #include<io ...

  5. linux常用命令:3文件搜索命令

    文件搜索命令 1. 命令名:find 命令所在路径:/bin/find 执行权限:所有用户 语法:find  [搜索范围]  [匹配条件] 功能描述:文件搜索 文件搜索类型 通过文件名搜索 -name ...

  6. Unity C#和OC互相调用

    Unity  两种方式 一般都是组合使用 1.[DllImport("__Internal")]  C#调用oc 2.UnitySendMessage        oc调用C# ...

  7. arcgis显示其他国家语言

    接手一个韩国的项目,需要在arcmap中配置一个韩国地图并发布到arcserver中进行切图,给的韩国地图的shapefile文件中属性字段都是韩文的,在中文的系统中,arcMap中显示的韩文都是乱码 ...

  8. Selenium - IWebDriver 控制scroll bar到底部

    有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作.一般用到操作滚动条的会两个场景: 注册时的法律条文需要阅读,判断用户是否阅读的标准是:滚动条是否拉 ...

  9. Dynamic支持CollectionView布局 、 MotionEffects特效 、 BlurImage效果 、 TextKit

    1 使用UIDynamicAnimator对集合视图进行布局 1.1 问题 UIKit Dynamic动力模型一个非常有趣的用途就是影响集合视图的布局,可以给集合视图的布局添加各种动力行为,使其产生丰 ...

  10. 【Modal】

    1.Bootstrap Modal 文档里标签.属性.方法.事件都写的很清楚 2.AngularUI - Bootstrap UI Bootstrap 2.1 $scope.open = functi ...