看到好多网友问到这个问题。一般我们在打电话时会听到“您拨的电话正在通话中,请稍后再拨....”,或“电话无应答...”之类的提示,我们在 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. JVM-class文件完全解析-访问标志

    访问标志 在前面分析了 class文件的魔数,次版本号,主版本号,常量池入口,常量池,那么在常量池结束后,紧接着的两个字节代表访问标志(access_flages).这个标志用于识别一些类或者接口层次 ...

  2. Notification通知栏

    Notification通知栏 首先实现的功能就是通知栏显示Notification,Notification是显示在系统的通知栏上面的,所以Notification 是属于进程之前的通讯.进程之间的 ...

  3. iOS多线程--NSOperation 浅显易懂

    NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...

  4. 关于EOF的种种。

    EOF读取数据是读取一个向下进行一次,知道没有数据可以读取. EOF的使用,用while和eof的

  5. bootstrap菜单完美解决---原创

    由于bootstrap的各方优点,偶的“点金项目细化分包管理平台”决定采用它.但在使用中遇到了一些问题,比如菜单的问题,这个菜单是用的一个JQuery的一个效果,点击后,所点击的链接处的class要加 ...

  6. ERP权限系统(七)

    添加链接权限的字段: //权限管理 n.Target = "MainFrame"; //折叠 TreeView1.Nodes.Add(n); n.Expanded = false;

  7. IPhone手机自动添加到itunes设置

    一,项目设置 如图:点击项目--info 在key下面条目上右键点击,选择添加Application supports iTunes file sharing   value设置为yes

  8. 12、SQL基础整理(运算符与优先级)

    运算符 + - * / %(取余),赋值运算符 = declare @jia int set @jia = 1+1 print @jia declare @jia int set @jia = 10% ...

  9. [转]在Windows中配置Rsync同步

    在Windows中配置Rsync同步 Rsync是一款不错的文件免费同步软件,可以镜像保存整个目录树和文件系统,同 时保持原来文件的权限.时间.软硬链接.第一次同步时 rsync 会复制全部内容,下次 ...

  10. java 代码分析工具——JDepend

    最近学习Mybatis的官方文档,看到了[项目文档]一节有很多内容没有见过,做个笔记,理解一下. 百科上的介绍,我竟然都看懂了,那就不找其他地方的资料了. JDepend 一个开放源代码的可以用来评价 ...