freeswitch基础篇二

基础篇

1. freeswitch -nc是将FREESWITCH启动到后台
2. 在windows上,可以将freeswitch注册为windows服务(使用“FreeswitchConsole -install”)
3. log/freeswitch.log是freeswitch的运行日志
4. conf/autoload_configs/switch.conf.xml定义了控制台的快捷键F1~F12
5. fs_cli.exe类似一个telnet的客户端,可以连接freeswitch;不仅可以连接本地的也可以连接其他的freeswitch,在主目录中编辑配置.fs_cli_conf文件
    [server1]
    host    =>  192.168.1.10
    port    =>  8021
    password    =>  secret_password
    debug   =>  7

    [server2]
    host    =>  192.168.1.11
    port    =>  8021
    password    =>  someother_password
    debug   =>  0
确保目标机器的event socket监听的是真实网卡的ip,而不是127.0.0.1,如果是改为服务器IP或“0.0.0.0”
配置完成,在fs_cli中可以使用命令server1或者server2切换地址

6. conf/autoload_configs/event_socket.conf.xml是监听真是网卡地址的配置文件

SDP(会话描述协议)

主要是描述媒体数据   
与sip配合使用

SOA(媒体流得协商过程,提议/应答)

3PCC(第三方呼叫控制)

一种灵活的会话控制方式

媒体

编码

1. PCM编码
2. FS支撑得其他语音编码
3. fs中编码名称得格式“名称@xxh@yyi”,h代表Hz频率,i代表ptime,打包间隔,xx和yy代表实际得数值

重新加载编码模块查看编码参数
如:查看SILK编码
reload mod_silk
4. 在FS中有些编码不是默认安装得,可以执行以下命令安装,例如安装silk编码,在fs中执行一下命令
    make mode_silk-install
5. 查看当前与profile相关得配置
    sofia status profile internal

RTP(实时传输协议)

RTP协议详细说明了在互联网上传递音频和视频得标准数据包格式,RTP协议是建立在UDP协议之上的

RTCP(实时传输控制协议)

是RTP的一个姊妹协议,RTP使用一个偶数UDP端口,而RTCP使用RTP的下一个相邻的奇数端口
RTCP为RTP提供信道外的控制,本身不传输数据,和RTP协作打包发送媒体数据。
主要功能:为RTP提供的服务的质量提供反馈信息,例如传输的字节数、传输分组数等

转码

“8 9 0 3”分别代表PCMA,G722,PCMU,GSM
透传:指不经过转码的情况下,将从一方收到的媒体流原样的转给另一方。
媒体绕过:将媒体流点对点传输,不经过FS
媒体代理:不管FS是否支持此类转码,都对RTP数据不进行任何处理发给另一方,它改变的是SDP中的“c=”部分。
视频,所有编码的视频流都是透传的,FS还不支持视频编码的转码
Media Bug 检测监听媒体流

SIP模块

Sofia-SIP:是由诺基亚公司开发的SIP协议栈
Endpoint:实现一些互联网协议接口的模块称为Endpoint,Endpoint一般是跟通话相关的

NAT(网络地址转换)

当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法
装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。 

基本功能及实现

批量创建用户

1. 默认20个用户,需要手动添加,例如添加1020用户,首先创建1020.xml,复制1000.xml的模版,然后把出现1000的地方替换为1020即可
2. windows上批量创建1020-1039.xml文件需要安装UnxUtils,
    1. 下载地址https://sourceforge.n et/projects/unxutils/,
    2. 解压到自己的文件夹,把/usr/local/wbin文件夹的绝对地址加到我的电脑(右键)->属性->高级->环境变量->系统变量->path值
    3. 在1000.xml相同的目录下创建“.bat”的文件,文件内容如下:
    for /L %%i in (1020,1 1039) do sed -e "s/1000/%%i" 1000.xml > %%i.xml
    4. 编辑更改生成的文件的,修改内容
3. 修改默认的Dialplan的正则表达式
    <extension name="Local_Extension">
    <condition field="destination_number" expression="^(10[0-3][0-9])$"

实现ivr

1. IVR的默认配置文件为:conf\autoload_configs\ivr.conf.xml,内部装入conf\ivr_menu\目录下的所有的xml文件,系统给的实例是demo_ivr.xml
2. 在conf\ivr_menus、目录下创建自己的welcome.xml的ivr文件,内容如下

      <!-- 测试ivr语音 -->
     <menu name="welcome"   
      greet-long="ivr/8000/welcome.wav"             
      greet-short="ivr/8000/welcome_short.wav"
      invalid-sound="ivr/ivr-that_was_an_invalid_entry.wav"
      exit-sound="voicemail/vm-goodbye.wav"
      confirm-macro=""
      confirm-key=""
      tts-engine="flite"
      tts-voice="rms"
      confirm-attempts="3"
      timeout="15000"
      inter-digit-timeout="2000"
      max-failures="3"
      max-timeouts="3"
      digit-len="4">

    <entry action="menu-exec-app" digits="0" param="transfer 1003 XML default"/>  
    <entry action="menu-exec-app" digits="/^(10[01][0-9])$/" param="transfer $1 XML features"/> 
    </menu>

以上各项的含义:
    1. greet-long表示播放的语音文件,默认位置FreeSWITCH\sounds\目录下,此处是将录音文件放入FreeSWITCH\sounds\zh\cn\link\ivr\8000目录下
    2. greet-short表示用户长时间没有按键提示的语音文件
    3. invalid-sound表示用户按错键的提示音
    4. exit-sound表示菜单退出时的“再见”的提示音
    5. timeout表示超时时间
    6. max-timeouts表示最大超时次数
    7. max-failures:允许用户输错的次数
    8. inter-digit-timeout:两次按键按下的最大间隔时间
    9. digit-len:可以输入的号码的长度,此处输入“1234”,定为4位
    10. 第一个action表示按“0”,转接到1003话务机
    11. 第二个action表示直接转接到播的分机号
3. 配置dialplan,在dialplan的context(defualt/public)加入extension
    <!-- 测试自定义ivr -->
    <extension name="incoming_ivr">
        <condition field="destination_number" expression="^1234$">
            <action application="answer" data=""/>
            <action application="sleep" data="1000"/>
            <action application="ivr"   data="welcome"/>
        </condition>
    </extension>

拨打1234,接入应答“answer”(必须应答才能向对方播放声音);然后暂停1秒,等待建立声音通路;最后执行ivr,指定到刚建立的菜单项的名字welcome
一下action的值代表的意思:
    1. menu-exec-app执行app的param
    2. menu-sub进入下级菜单
    3. menu-top返回上级菜单

按时间进行路由

这里时匹配拨打DID的用户转入ivr
第一步创建以下extension
<!-- 设置时间使用不同的ivr -->
<extension name="time_based_ivr" continue=true>
    <condition wday="2-6" hour="8:30-17:30">
        <action application="set" data="ivr=ivr_day" inline="true"/>
        <anti-action application="set" data="ivr=ivr_night" inline="true"/>
    </condition>
</extension>
1. wday表示星期(0表示周日)周一至周五表示为“2-6”
2. hour表示小时,工作时间8:30-17:30
3. 如果在条件范围内执行第一个ivr_day,如果不在执行ivr_night
4. extension中使用”continue=true“,保证在dialplan解析的时候解析完此处继续往下执行
5. inline属性设置为true表示该动作立即生效
<!-- 第二步匹配DID执行应答,转入ivr -->
<extension name="ivr" >
    <condition wday="destination_number" expression="^DID$">
        <action application="answer" data=""/>
        <anti-action application="ivr" data="${ivr}"/>
    </condition>
</extension>
1. 呼入号码匹配DID
2. 接听回应匹配ivr

配置中文语音包

1. 语音包地址:http://wiki.freeswitch.org/wiki/Language_File#Chinese
2. 下载语音包,zh表示中文语音包,拷贝到sounds目录下
3. 修改var.xml文件的sound_prefix变量,修改声音文件的具体路径
    <X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/zh/cn/link"/>
4.  使用Phrase(框架)
    1.  作用:屏蔽各种不同语言提示的差异性
    2.  Phrase是在conf/lang/en/demo/demo_ivr.xml中定义的宏
    <macro name="demo_ivr_main_menu" pause="100"> <!-- See conf/autoload_config/ivr.conf.xml for an example on how to use this macro in an IVR -->
    <input pattern="(.*)">
    <match>
        <action function="play-file" data="ivr/ivr-welcome_to_freeswitch.wav"/>
        <action function="play-file" data="ivr/ivr-this_ivr_will_let_you_test_features.wav"/>
        <action function="play-file" data="ivr/ivr-you_may_exit_by_hanging_up.wav"/>

    其中name定义宏的名称;pause表示在每个action之间暂停多长时间(毫秒),匹配(match)指定的模式(pattern)后,执行下面的动作,paly-file表示播放后面的data指定的声音文件。
    3. 声音文件的具体路径实在conf/lang/en/en.xml中定义的,同时include装入了demo_ivr.xml,en.xml的内容如下
        <include>
    <language name="en" say-module="en" sound-prefix="$${sounds_dir}/en/us/callie" tts-engine="cepstral" tts-voice="callie">
     <phrases>
    <macros>
        <X-PRE-PROCESS cmd="include" data="demo/*.xml"/> 
        <X-PRE-PROCESS cmd="include" data="vm/sounds.xml"/> 
        <X-PRE-PROCESS cmd="include" data="dir/sounds.xml"/>
        <X-PRE-PROCESS cmd="include" data="ivr/*.xml"/> 
     </macros>
     <X-PRE-PROCESS cmd="include" data="vm/voicemail_ivr.xml"/>

    en.xml定义了语言,名称(name)为en;该语言是由say-module指定的en模块(在mod_say_en模块中实现)支持的;所有支持它的声音文件都是由sound-prefix指定。
    4. 配置中文Phrase
        在conf/freeswitch.xml中添加
        <X-PRE-PROCESS cmd="include" data="lang/zh/*.xml"/>
    5. say接口支持中文语言,需要mod_say_zh模块
        1. 在源代码目录中执行一下命令
            make mod_say_zh-install
        2. 在freeswitch管理台加载该模块
            load mod_say_zh
        3. 为了FS启动时自动加载该模块,需要在conf/autoload_configs/modules中去掉下列的注释
            <load module="mod_say_zh"/>
5. 中文语音包的使用
    1. 可以在dialplan中加入以下配置
        <action application="set" data="language=zh"/>
    完整的dialplan
    <extension name="ivr_demo">
      <condition field="destination_number" expression="^5000$">
        <action application="set" data="language=zh"/>
        <action application="answer"/>
        <action application="sleep" data="2000"/>
        <action application="ivr" data="demo_ivr"/>
      </condition>
    </extension>
    2. 也可对单个用户配置,配置1002.xml的variables标签中添加如下配置,让语言仅对1002用户生效
        <variable name="language" value="zh"/>
        <variable name="default_language" value="zh"/>

录音

单腿录音

1. 录音命令
    originate user/1002 &record(/1.wav)
2. dialplan中设置
    <!--录音测试-->
    <extension name="record" >
        <condition field="destination_number" expression="^12(.*)$">
            <action application="answer" />
            <action application="playback" data="tone_stream://%(100,1000,800)"/>
            <action application="record" data="/$1.wav"/>
        </condition>
    </extension>
3. 播发录音
    originate user/1000 &playback(/1.wav)

两条腿的通话录音

1. 使用以下api命令进行通话录音
    开始录音 uuid_record <channel_uuid> start /record.wav
    结束录音 uuid_record <channel_uuid> stop /record.wav
2. 使用sox命令混音处理:
    $sox record.wav -c 1 record1.wav
3. media bug录音
    uuid_record <channel_uuid> start /1.wav
    uuid_record <channel_uuid> start /2.wav
    uuid_record <channel_uuid> start /3.wav
可以在不同的时间点分别执行以上命令,录制多个声音文件
可以使用stop停止某个录音,也可以使用“all”停止所有录音
    uuid_record <channel_uuid> stop all
4. 在dialpan中可以通过record_session达到类似的效果
    <extension name="record_session" >
    <condition field="destination_number" expression="^(100[0-9])$">
        <action application="record_session" data="/record-$1.wav"/>
        <action application="bridge" data="user/$1"/>
    </condition>
</extension>
与record相比,record_session是非阻塞的,它可以作用于单腿的呼叫也可以用于桥接(bridge)的呼叫;而record是阻塞知道录音完才,只能录单腿的呼叫

立体声

设置RECORD_STEREO同到变量设置为true可以在录音时直接录成立体声,在dialplan中record_ession时的设置如下
        <action application="set" data="RECORD_STETEO=true"/>
        <action application="record_session" data="/record-$1.wav"/>

放音

playback的参数

1. 声音文件
    大部分声音文件的支持都是在mod_sndfile模块中实现的,该模块直接调用了libsndfile库,典型的如WAV、AU、AIFF、VOX等
    mod_shout模块实现了对MP3文件的支持

2. local_stream
3. silence_stream
4. tone_stream
5. file_string
6. 其他接口与参数
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值