修改FreeSwitch的proxy_media配置。参考这个地址:https://wiki.freeswitch.org/wiki/Proxy_media。如果FreeSwitch是缺省配置的,在“conf/dialplan/default.xml”文件内找到名为“Local_Extension”的extension。在bridge前设置proxy_media。
<action application="set" data="proxy_media=true" />
<action application="bridge" data="user/${dialed_extension}@${domain_name}"/>
使用此项设置后,主叫方按键程序日志显示不会再收到INFO事件。即,使用此项设置将影响程序获得按键信息的方式。如果不使用此项设置,采用FreeSwitch的缺省设置,听到的语音表明延迟很严重。 或者使用下面的这项设置也会造成这个现象:
<action application="set" data="bypass_media=true" />
经反复测试发现,如采用缺省的Local_Extension设置,听到的语音延迟很严重。但一旦加上这句:“<action application="set" data="proxy_media=true" />”,或者这句:“<action application="set" data="bypass_media=true" />”,无论是否是与FreeSwitch交换RTP包都没有延迟现象。也就是说,media的模式不是影响语音延迟质量的原因。
实现一个完整的软电话或者交互式语音应答系统,必须为软件增加RTP流的处理。简单考察了下后,决定采用EMIPLIB库。EMIPLIB库基于JRTPLIB和JThread。
编译EMIPLIB
首先,尝试在Visual Studio 2010下编译此库。由于EMIPLIB库基于JRTPLIB和JThread,所以得先编译这两个库。编译这两个库参考了这篇文章:http://www.cnblogs.com/skyseraph/archive/2012/04/07/2435540.html。我下载的JRTPLIB版本是3.9.1,下载的JThread版本是1.3.1。分别将他们解压到C:\emiplib\jrtplib-3.9.1和C:\emiplib\jthread-1.3.1。参考的文章中提到还需用到CMake,因此下载了2.8.12.2版本的CMake。CMake解压后的存储路径是C:\cmake-2.8.12.2-win32-x86。再在C:\emiplib目录下建两个子目录build和libs。然后在libs目录下再建两个子目录:jthread和jrtplib,在build目录下再建两个子目录:jthread和jrtplib。这些目录后面将会用到。这些准备工作都完成了后,回到那篇文章的第三部分编译步骤。
编译JThread
文章中的“打开cmake”,是指进入进入到C:\cmake-2.8.12.2-win32-x86\bin目录下,运行cmake-gui.exe程序。
“Where is the source code:”输入框内输入:C:/emiplib/jthread-1.3.1。
“Where to build the binaries:”输入框内输入:C:/emiplib/build/jthread。
CMAKE_INSTALL_PREFIX的值是C:/emiplib/libs/jthread。
LIBRARY_INSTALL_DIR的值是lib。
编译成功后,会在C:\emiplib\libs\jthread目录下生成两个目录lib和include。lib目录下有两个文件jthread.lib和jthread_d.lib,分别对应release和debug版本JThread的Lib文件。include目录下还会生成jthread目录,目录下有一些头文件。
编译JRTPLIB
“Where is the source code:”输入框内输入:C:/emiplib/jrtplib-3.9.1。
“Where to build the binaries:”输入框内输入:C:/emiplib/build/jrtplib。
LIBRARY_INSTALL_DIR的值是lib。
JThread_DIR的值是C:\emiplib\libs\jthread\lib\cmake\JThread。
CMAKE_INSTALL_PREFIX的值是C:/emiplib/libs/jrtplib。
ADDITIONAL_INCLUDE_DIRS的值是C:\emiplib\libs\jthread\include\jthread。
ADDITIONAL_RELEASE_LIBRARIES的值是C:\emiplib\libs\jthread\lib。
编译成功后,会在C:\emiplib\libs\jrtplib目录下生成两个目录lib和include。lib目录下有两个文件jrtplib.lib和jrtplib_d.lib,分别对应release和debug版本JRTPLIB的Lib文件。include目录下还会生成jrtplib3目录,目录下有一些头文件。
编译EMIPLIB
“Where is the source code:”输入框内输入:C:/emiplib/emiplib-1.1.1。
“Where to build the binaries:”输入框内输入:C:/emiplib/build/emiplib。
LIBRARY_INSTALL_DIR的值是lib。
JRTPLIB_DIR的值是C:/emiplib/build/jrtplib/cmake。
CMAKE_INSTALL_PREFIX的值是C:/emiplib/libs/emiplib。
ADDITIONAL_INCLUDE_DIRS的值是C:\emiplib\libs\jrtplib\include\jrtplib3。
ADDITIONAL_RELEASE_LIBRARIES的值是C:\emiplib\libs\jrtplib\lib。
那篇文档并没有编译EMIPLIB的内容,以上信息是我自己瞎编的。虽然有些数据是错的,但经此设置再编译后可以得到lib。编译成功后,会在C:\emiplib\libs\emiplib目录下生成两个目录lib和include。lib目录下有两个文件emiplib.lib和emiplib_d.lib,分别对应release和debug版本EMIPLIB的Lib文件。include目录下还会生成emiplib目录,目录下有一些头文件。