百問 FreeSwitch(整理版)

註明:由於不知道原作者是哪位大俠,這位大俠也沒有整理,所以特此轉載整理一番

基礎知識部分

本文檔讀者對象是哪些?

毫無疑問FreeSwitch百問的讀者肯定是技術人員,他們可能是:
A. 對voip有興趣沒有基礎的夥計
B.對FreeSwitch有興趣站在門口的夥計
C.計劃把FreeSwitch從實驗所或者研發中心部署應用到實網系統中的夥計
D.準備使用FreeSwitch做IPPBX的夥計
E.準備開發IP呼叫中心的夥計
F.對FreeSwitch進行運營維護的夥計


研究VOIP/FreeSwitch之前需要哪些基礎知識?

假如你不開發應用,只是使用FreeSwitch,通常熟悉SIP就夠。
假如要你開發應用,熟悉C/C++是必須的。
雖然FreeSwitch支持很多語言的開發接口,但是實際上基本都是在C/C++的接口上通過SWIG進行擴展的。通過swig 包裝支持多種腳本語本語言控制呼叫流程,如perl php lua python ruby java tcl等。
事件套接字使用
Event Socket 可以使用任何其它語言通過Socket 方式控制呼叫流程、擴展FreeSWITCH 功能。通俗講FreeSwitch是也是一個VOIP,目前主流的VOIP,甚至包括運營商的IMS毫無例外都是基於SIP協議的。因此要搞定FreeSwitch,SIP協議是必須的。


VOIP基礎設施有哪些?

以太網絡,這個是廢話,沒有這咋實現IP通信呢。
IP話機,相當於普通電話機,不過不是普通電話機的電話線
RJ11的接口而是網線
RJ45接口.
軟電話,安裝在電腦上的(通常是windows下)模擬ip話機的軟件。當然安卓和linux下也有軟電話。
SIP Server/IPPBX,完成VOIP交換的設備或者安裝在pc上的軟件。
IP網關,通常是完成VOIP網絡到PSTN E1數字接口或者模擬電話線接口轉換的設備。


SIP 常見問題哪些?

IP協議廣義上是包括SIP協議,RTP協議和SDP協議。他們的關係可以這樣描述:SIP是信令控制,相當於電信裏面的7號信令,或者相當於發號施令的領導角色,RTP 是媒體傳輸,相當於幹體力活的民工角色。SDP 是媒體描述,相當於描述使用哪些或者哪種語音和視頻編碼進行協商。


舉個例子
a 用戶使用電話打給b用戶,SIP是信令控制相當於a 舉起電話機然後b的號碼和通話之後掛機的動作。RTP是媒體傳輸相當於電話通了a 和b 語音通話的動作。SDP 是媒體描述相當於a 和b 都使用普通話進行對話。假如a 和b 沒有一個共同的語言會導致協商不成功。就無法通話。比如a是中國人,b是英國人,a問:會說漢語嗎。b聽不懂,b 問:can you speak English?a 也不懂。最終只能放棄通話。


SIP是控制命令,是具有文本的,通過網絡抓包是可以直接看出內容,這樣調試排查問題就比較方便。SIP協議默認使用UDP協議。但是也支持TCP協議,有些變態的系統或者軟電話只能支持TCP,比如微軟的LYNC。SIP默認是使用5060端口。但是通常也可以指定其他端口。比如5061之類。有些軟件,比如tom 版本的skype 啓動之後也會使用5060端口,這樣導致了其他軟電話或者FreeSwitch啓動失敗。通常系統有很多線路可以併發使用,但是他們都是使用一個端口(默認是5060)進行信令控制的。


SIP使用模式有兩種:一種是註冊模式,大家每個人分配一個分機號碼和密碼,然後都註冊到一個SIP SERVER /IPPBX 上。呼叫的時候只要呼叫分機號碼就可以。另外一種是點對點模式:通過呼叫軟電話的或者IP話機的IP+端口(默認5060)的模式。
標準的sip 地址格式是:sip:1234@IP:PORT其中1234是號碼。


RTP 常見問題有哪些?

RTP的默認端口是沒有指定的,通常系統有很多線路可以併發使用,每一路通常都會佔用兩個端口一個是RTP 一個是RTCP,RTP 媒體傳輸的機器的IP 和SIP 的信令控制的IP可以不是同一個。雖然很多情況下他們是一個,表示信令控制和媒體傳輸都是一臺機器上發起的。但是大的系統裏面往往他們的ip 不是同一個。
e.g. 小系統:一個部門就是一個人,這個人既是領導(SIP)也是幹苦力活的(RTP)。因爲一個機器的cpu 畢竟計算能力有限。而一個大的系統相當於一個部門很多人,領導(SIP)通常一個就夠,幹苦力活的(RTP)需要很多人。


SIP的流量通常很少,但是RTP 的流量通常是巨大的,因爲要傳輸語音流個視頻流。所謂:領導一句話,手下幹活累死人。RTP的語音流是一份一份(從時間上看是離散的)進行傳輸的。一份就是一個UDP包,通常情況下一個包包括了20ms或30毫秒的語音。每個包的負載大小根據語音編碼器不同,在幾十Byte 到幾百Byte之間。這樣的話,假如是20ms 一個包,1秒的語音要發50次,可見流量是很大的。


SDP 常見問題有哪些?

SDP 是對媒體的描述,描述了RTP 的IP 和端口PORT。說明自己這邊有哪些編碼器(相當於一個人會說哪些語言),也描述了是否支持視頻(說白了就是有視頻編碼器)。也描述了是否支持按鍵。很多情況下呼叫建立不成功都是因爲SDP 協商不成功導致(一般會提示錯誤Incompatible SDP)。沒有提示的SDK則需要通過抓包才能看出。


SDP 的核心包含:
A.說明媒體的來源IP地址
B.說明媒體的來源的端口port
C.說明自己有哪些媒體能力(能說幾個語言)
D.包括對dtmf 按鍵的是否支持是說明。
一旦兩個軟電話要對話,就要對比交換上面這些信息。


常用的支持語音的軟電話有哪些?

Windows 下常見的軟電話有:Xlite/eyebeam,kapanga,linphone,jitsi,PJSIP等等
Linux下有Linphone,PJSIP等
安卓系統下常用的軟電話有:sipdroid,CSipSimple,jPhoneLite,IMSDROID。


常用的支持視頻的軟電話有哪些?

Windows 和Linux 下的軟電話大多也支持視頻。
Windows 下常見的軟電話有:
Xlite/ eyebeam,kapanga,linphone,jitsi等等
Linux下有Linphone等
本人使用kapanga和Linphone 測試過FreeSwitch的視頻通話。


常見語音編碼器有哪些?

  • 常用的語音編碼器有G.711 Ulaw 和Alaw。 這個是絕大多數的VOIP都支持的。G.711要是都不支持,就不能稱爲VOIP,所以剛剛開始測試使用某個系統或者軟電話,使用G.711準沒有錯。
  • G.729 這個是公網上使用最多的,但是由於有授權,有些軟電話不支持,或者需要採購才能使用。
  • iLBC 大多數軟電話都支持,而且沒有授權限制。
  • SPEEX大多數軟電話都支持,網絡上也有源碼,siri 和科大的語音識別的的語音傳輸就是使用這個編碼,flash player 也支持這個編碼。
  • GSM

常見視頻編碼器有哪些?

  • H.263 最基本的視頻,大多數的支持視頻的軟電話都支持。其中H.263 又細分爲
  • H.263 , H.263+/ H.263-1998等。
  • MP4
  • H.264 (MPEG-4 part 10)效果最好

PSTN和VOIP區別有哪些?

PSTN是電路交換,是時分,話音質量是可靠的可控的,無論閒死還是忙死,話音質量都是一樣的。VOIP 是數據包交換,話音質量有用以太網的天生屬性,質量是不可靠的。通常網絡情況下話音效果不錯,但是一旦網絡繁忙,話音質量就立刻下降。因此VOIP 的運營最大的難點是在於系統的穩定性。


PSTN常用信令有哪些?

常用的PSTN信令有ISDN PRI 和SS7。其中區別在於ISDN PRI 是一個E1(30路話路)使用其中的16時隙作爲信令控制。SS7 是7號信令,是很多E1,最大可以到2^14 (4096)話路共用某個E1的某個時隙(通常是16時隙,作爲信令LINK)作爲信令控制,爲了提高可靠性,通常使用兩個E1線路上的時隙(即兩個LINK)作爲信令控制。


VOIP的系統開發和測試有哪些常用工具?

最常用的通常是網絡抓包程序Ethereal + WinPcap或者wireshark + WinPcap
有用sip協議是文本字節流模式,抓包之後,直接使用工具裏面的查看窗口直接查看。


如何使用Ethereal對指定機器進行抓包分析?

在Capture 菜單中選擇Option子菜單。然後在出現的對話框中選擇網卡(Interface)。在Capture Filter 裏面輸入udp and host 192.168.11.105。UDP表示只是抓udp 的包,因爲sip默認是基於UDP,RTP 也是基於UDP。Host 192.168.11.105 表示只抓
ip 是192.168.11.105的數據包(從本機器發給192.168.11.105,或者從192.168.11.105發給本機)。其中192.168.11.105也可以是本機地址。然後點start 開始抓包。


如何使用Ethereal對指定端口進行抓包分析?

在Capture Filter 裏面輸入udp and port 5060。UDP表示只是抓UDP的包。Port 5060 表示只是抓5060 端口上的包。因爲sip默認是基於UDP,默認是5060 端口。以上的命令就是隻是抓sip信令控制的包。


Ethereal能對本機內的通信進行抓包嗎?

本機的內地通信實際上沒有經過網卡,因此Ethereal無法實現對本機內的通信進行抓包,比如本機的軟電話呼叫本機上的FreeSwitch,就無法抓包。


Ethereal能對其他機器之間的通信進行抓包嗎?

一般情況下,假如A機器和B機器進行通信,而你要在C機器上對A機和B機的通信進行抓包,是抓不到包的。比如a機的軟電話呼叫B本機上的軟電話,你要在C機器上對他們的通信進行抓包,是抓不到包。


Windows下使用啥命令工具可看哪個port被誰佔用?

使用命令netstat -ano|findstr 5060查看端口5060的佔用情況,可以看到佔用PID是2552,然後可以通過任務管理器查到佔用進程是FreeSwitchConsole.exe
這裏寫圖片描述


如何根據使用的編碼器計算VOIP需要的帶寬?

VOIP的數據包包括SIP 數據包和RTP 數據包,SIP只是傳輸控制命令,跟RTP的語音媒體數據包比較起來簡直就是九牛一毛,完全可以忽略不計。下面僅僅計算RTP的數據包,RTP的數據包=以太網地址+IP類型+IP包頭+UDP包頭+RTP包頭+語音編碼之後的負載。


以G.711 alaw 編碼器爲例:
以太網地址12字節,IP類型2字節。IP數據包頭:20字節。UDP協議的報頭: 8個字節。RTP包頭是12字節。語音負載:160字節:一個包20ms,8K的採樣頻率,每個採樣點使用alaw 編碼之後是1個字節。因此20ms的語音在編碼之後的負載是160 字節。總共是12+2+20+8+12+160=214字節。1秒的語音就是214*(1000/20)=214*50=10700字節,按照流量計算就是10700*8/1024=84Kpbs 左右。


以G.729 編碼器爲例:
假如是G.729. 一個包20ms其他不變,只是語音編碼之後變成了8字節,因此語音負載是8字節,可以算出來:總共是12+2+20+8+12+8=62字節


語音就是62*(1000/20)=214*50=10700字節,按照流量計算就是10700*8/1024=24Kpbs左右。


一個10Mbps 帶寬,有效的帶寬能達到4-5M左右,以G.711 alaw爲例子,一線需要的帶寬是84Kbps.因此可以支持的線路數是:5*1000/84=60線左右。但是考慮到業務通常還有帶寬需求,因此,30線是比較保險的。以G.729爲例子,一線需要的帶寬是24Kbps.因此可以支持的線路數是:5*1000/24=200線左右。但是考慮到業務通常還有帶寬需求,比如CRM的彈屏通常包括了用戶360度的信息和歷史記錄,數據量也是不小。因此,10M的帶寬,100線是比較保險的。
另外要注意的是ADSL 的帶寬上行和下行是不對稱的,而VOIP的語音通話的開銷是要求。上下行一樣的帶寬。因此假如併發使用的線路多了,而且碰到單邊效果不好的情況,很可能的帶寬不對稱導致的。


如何測試你的系統的WAN的進出口帶寬?

有很多網站都可以提供帶寬測試 http://www.speedtest.net/是比較好用的一個。host可以選擇進行測試。根據本人測試的結果還是比較符合實際情況。



FreeSwitch基礎和配置部分

FreeSwitch是什麼?

FreeSWITCH 是一個開源的電話交換平臺,具有很強的可伸縮性,從一個簡單的軟電話客戶端到運營商級的軟交換設備。他可以是一個SIP SERVER,也可以通過他實現很多協議轉換。也可以實現VOIP 的IVR 或者呼叫中心。


Anthony Minessale 在2005年的時候認爲Asterisk 存在許多問題而修復這些問題需要很多時間。於是他想從頭創建一個Asterisk 2.0後面就變成了FreeSWITCH,因此從某種意義上說FreeSWITCH是Asterisk 2.0。一開始沒有人認真考慮他的問題,因此他就自己開發,牛人通常就是這樣。呵呵


FreeSwitch能做啥?

FreeSWITCH幾乎無所不能可以用作,一個簡單的交換引擎、一個PBX,一個媒體網關或媒體支持IVR 的服務器等。它支持SIP、H323、Skype、Google Talk,RTMP 等協議,支持板卡E1接口,這樣就可以實現通過運營商打電話到手機或者固定電話之上。


FreeSwitch如何與其他系統集成?

FreeSwitch 跟其他系統集成基本上是通過他的支持的協議接口進行集成的。最主要的集成方式就是通過SIP協議。可以作爲一個分機註冊到其他系統上,也可以其他系統作爲分機註冊到FreeSwitch上以實現互通,甚至可以不通過註冊直接使用點對點方式進行通訊。實際使用過程中:集成過以下第3方的系統或者設備,
FreeSwitch==SIP==毅航公司ISX1000/4000系列多媒體可編程交換機,ISX1000/4000系列的新驅動支持iLBC編碼器,可以和FreeSwitch公網集成,從而實現FreeSwitch 的落地出口。
FreeSwitch==SIP==東進公司,Keygoe 系列多媒體可編程交換機
FreeSwitch==SIP==Dialogic公司,HMP多媒體可編程軟交換系列


FreeSwitch在實際使用部署的時候如何啓動比較安全?

帶上-nonat 參數啓動比較安全。FreeSwitchConsole.exe -nonat。


FS_CLI跟FreeSwitch是啥關係?

FS_Cli 是FreeSwitch 一個客戶端控制界面,可以在FS_Cli上對FreeSwitch進行管理,比如日誌級別設置,查看日誌,執行呼叫等操作。FS_Cli 是通過ESL 接口對FreeSwitch進行管理。FS_Cli也可以執行APP模擬進行發起呼叫,播放語音等功能。FS_Cli 有快捷按鍵,F1-F12,功能對應如下:


在FS_CLI上如何撥打測試分機?

FS> originate sofia/profile/internal/1000 &echo (撥打1000並執行echo程序)
FS> originate user/1000 &echo (同上)
FS> originate sofia/profile/internal/1000 9999 (相當於在軟電話1000上撥打9999)
FS> originate sofia/profile/internal/1000 9999 XML default (同上)


FreeSwitch能跟哪些外部協議對接?

支持SIP、H323、Skype、Google Talk,RTMP 等協議。實際本人測試過sip 和RTMP


FreeSwitch如何跟PSTN 對接,實現落地?

兩個辦法
1. FreeSwitch 通過SIP接到第三方的VOIP網關上,VOIP網關通過E1 接口接到PSTN上,通常VOIP網關可以支持ISDN PRI 和SS7 信令。比如上面提到的通過ISX1000/4000進行落地
2. 使用支持FreeSwitch的E1接口卡,在機器上插這種卡,安裝卡驅動。然後安裝FreeSwitch ,再進行協議配置才能使用


已經有哪些硬件板卡支持FreeSwitch 跟運營商的E1電路對接?

目前已知的sangoma板卡可以ISDN PRI和SS7信令。
如何在LINUX 的freeswitch 平臺上安裝sangoma 請參考:
http://www.voip88.com/article-1202-1.html
如何安裝在Windows 的freeswitch 平臺上安裝sangoma 請參考:
http://wiki.sangoma.com/fs-windows-freeswitch-compile-isdn
SS7信令的支持軟件是商業版本,是要額外收費的,根據瞭解,1個E1端口差不多是1K的授權費用,根據http://wiki.sangoma.com/wanpipe-freeswitch#sangoma-freetdm-ss7-library-libsngss7 上面的介紹,ss7不支持tup,僅僅支持isup:
Sangoma FreeTDM SS7 Library (libsng_ss7)
Features
Sangoma’s SS7 Library uses Continuous Computing’s (Trillium) MTP2/3 and ISUP stacks
to provide a commercial grade SS7 interface to FreeSWITCH, via the FreeTDM channel
driver.

List of supported variants
ISUP (ITU/ANSI)
MTP3 (ITU/ANSI)
MTP2 (ITU/ANSI)
SCCP API
39. FreeSwitch默認配置啓動之後佔用哪些端口?
FreeSwitch啓動之後,佔用以下這些端口:
SIP 5060 5080
RTP:16384-32768
TCP:1935 假如啓動
mod_rtmp模塊
8021 等
具體如下:
TCP 0.0.0.0:1935
TCP TCP
TCP 192.168.11.105:5060
TCP 192.168.11.105:5080
UDP 127.0.0.1:50621
UDP 127.0.0.1:50622
UDP 127.0.0.1:50623
UDP 127.0.0.1:50624
UDP 192.168.11.105:5060
UDP 192.168.11.105:5080
假如這些端口已經被佔用,將可能導致啓動錯誤。


FreeSwitch常用目錄有哪些?

主要目錄:
mod 可加載模塊sounds 聲音文件,使用playback() 時默認的尋找路徑,
log 日誌,CDR ,recordings 錄音,使用record() 時默認的存放路徑,
conf 配置文件目錄


FreeSwitch基本配置文件有哪些?

在/conf目錄下:
vars.xml文件:一些常用變量默認分機密碼=1234,codec,sip ,ip,port等
/sip_profiles
/autoload_configs
/dialplan
/directory
/dialplan/default.xml—-缺省的撥號計劃
/directory/default/*.xml—-SIP用戶,每用戶一個文件
/sip_profiles/internal.xml—-一個SIP profile,或稱作一個SIP-UA,監聽在本地IP及端口5060,一般供內網用戶使用
/sip_profiles/externa.xml另一個SIP-UA,用作外部連接,端口5080
/autoload_configs/modules.conf.xml配置當FreeSWITCH啓動時自動裝載哪些模塊。


FreeSwitch如何設置日誌級別?

在FS_CLI管理界面上:
FS>console loglevel 級別
FS>console loglevel 級別
從0-7,比如6設置成INFO 級別,基本越高日誌越大比如設置成7,DEBUG級別。幾乎每個操作都很多日誌。
輸入之後,會返回當前的級別提示如下:
FS> console loglevel 0
+OK log level 0 [0]
+OK console log level set to CONSOLE
FS> console loglevel 7
+OK log level 7 [7]
+OK console log level set to DEBUG
FS> console loglevel 6
+OK log level 6 [6]
+OK console log level set to INFO
假如要看sip 的詳細日誌,使用以下命令:
sofia profile internal siptrace on打開sip 日誌
sofia profile internal siptrace off關閉sip 日誌


FreeSwitch如何看有多少用戶註冊上來?

在FS_CLI管理界面上:
FS>sofia status profile internal
(顯示多少用戶已註冊)
假如剛剛啓動,沒有人註冊上來:
提示如下:
ZRTP-PASSTHRU false
AGGRESSIVENAT false
STUN-ENABLED true
STUN-AUTO-DISABLE false
CALLS-IN 0
FAILED-CALLS-IN 0
CALLS-OUT 0
FAILED-CALLS-OUT 0
REGISTRATIONS 0
使用eyebeam測試,實際上開了兩個軟電話,註冊兩個上來。控制檯看到是2註冊上來。這裏面還有sip 的ip,撥入和撥出系統的編碼器等等很多有用信息。


FreeSwitch如何看有哪些用戶註冊上來?

在FS_CLI管理界面上:
FS> sofia status profile internal reg 顯示哪些用戶已註冊
剛剛啓動FreeSwitch,FS> sofia status profile internal reg提示如下:

+OK log level [7]
freeswitch@internal> sofia status profile internal reg
Registrations:
==============================
==============================
Total items returned: 0
==============================
==============================
Total items returned: 0,

FS> sofia status profile internal reg提示如下:
這個可以看到註冊上來的機器的ip 地址分機號碼等詳細信息。
我使用eyebeam測試,實際上註冊兩個上來。控制檯看到是2個注註冊上來。
\db\ sofia_reg_internal.db 裏面保存的是註冊的信息。
假如碰到意外情況,可能存在有軟電話註冊上來之後,一直在裏面的情況。看這個行:
Status: Registered(UDP)(unknown) EXP(2012-11-22 20:45:46) EXPSECS(3655)
最後的秒數目就是註冊有效期。


FreeSwitch默認配置啓動之後有哪些默認註冊用戶和密碼是多少?

FreeSwitch默認配置啓動默認有1000-1019 20個帳號。他們的默認密碼是1234.使用軟電話可以註冊上去進行呼叫。


FreeSwitch默認配置啓動之後有哪些分機比較有用?

FreeSwitch默認配置啓動之後。下面的這些分機會經常用到
9196 echo,迴音測試
9195 echo,迴音測試,延遲5秒
5000 示例IVR
30xx電話會議比如
3000,3001.撥入之後假如是第一個人會聽音樂


如何手工添加FreeSwitch分機?

首先在conf/directory/default目錄下增加一個用戶配置文件,配置文件可以參考已經有的配置文件。然後修改撥號計劃(Dialplan)使其它用戶可以呼叫到它。最後重啓FreeSwitch。


FreeSwitch撥號計劃的正則表達式有哪些是最常用的模式?

撥號計劃使用perl的正則表達式。
常用的匹配模式如下:
^ 表示開始匹配,^123 表示匹配123開頭
456 表示匹配456結束
| 表示或者,匹配任何一個
[] 表示匹配其中的任意一個字符
[0-9] 等於匹配[0123456789]
\d等於匹配[0-9]
\d+ 等於匹配1 個或多個數字
\d* 等於匹配0 個或多個前面的字符


FreeSwitch默認配置如何修改撥號計劃設置沒有註冊上來不走留言信箱?

修改/conf/dialplan 目錄下的default.xml文件。其中的destination_number 是分機號碼。這個例子表示分機號碼是1000-1199 共200個

<context name=”default”> 之後加入:

<extension name=”Local_Extension2″>
    <condition field=”destination_number” expression=”^(1[0-1][0-9][0-9])$”>
        <action application=”export” data=”dialed_extension=$1″/>
        <action application=”set” data=”call_timeout=10″/>
        <action application=”set” data=”hangup_after_bridge=true”/>
        <action application=”set” data=”continue_on_fail=false”/>
        <action application=”bridge” data=”user/${dialed_extension}@${domain_name}”/>
    </condition>
</extension>

FreeSwitch默認配置加載哪些編碼器?

使用show codec 命令可以看到系統加載的編碼器。
FS> show codec

type,name,ikey
codec,ADPCM (IMA),mod_spandsp
codec,AMR,mod_amr
codec,G.711 alaw,CORE_PCM_MODULE
codec,G.711 ulaw,CORE_PCM_MODULE
codec,G.722,mod_spandsp
codec,G.723.1 6.3k,mod_g723_1
codec,G.726 16k,mod_spandsp
codec,G.726 16k (AAL2),mod_spandsp
codec,G.726 24k,mod_spandsp
codec,G.726 24k (AAL2),mod_spandsp
codec,G.726 32k,mod_spandsp
codec,G.726 32k (AAL2),mod_spandsp
codec,G.726 40k,mod_spandsp
codec,G.726 40k (AAL2),mod_spandsp
codec,G.729,mod_g729
codec,GSM,mod_spandsp
codec,H.261 Video (passthru),mod_h26x
codec,H.263 Video (passthru),mod_h26x
codec,H.263+ Video (passthru),mod_h26x
codec,H.263++ Video (passthru),mod_h26x
codec,H.264 Video (passthru),mod_h26x
codec,LPC-10,mod_spandsp
codec,PROXY PASS-THROUGH,CORE_PCM_MODULE
codec,PROXY VIDEO PASS-THROUGH,CORE_PCM_MODULE
codec,RAW Signed Linear (16 bit),CORE_PCM_MODULE
codec,Speex,mod_speex
codec,G.711 alaw,CORE_PCM_MODULE
codec,G.711 ulaw,CORE_PCM_MODULE
codec,G.722,mod_spandsp
codec,G.723.1 6.3k,mod_g723_1
codec,G.726 16k,mod_spandsp
codec,G.726 16k (AAL2),mod_spandsp
codec,G.726 24k,mod_spandsp
codec,G.726 24k (AAL2),mod_spandsp
codec,G.726 32k,mod_spandsp
codec,G.726 32k (AAL2),mod_spandsp
codec,G.726 40k,mod_spandsp
codec,G.726 40k (AAL2),mod_spandsp
codec,G.729,mod_g729
codec,GSM,mod_spandsp
codec,H.261 Video (passthru),mod_h26x
codec,H.263 Video (passthru),mod_h26x
codec,H.263+ Video (passthru),mod_h26x
codec,H.263++ Video (passthru),mod_h26x
codec,H.264 Video (passthru),mod_h26x
codec,LPC-10,mod_spandsp
codec,PROXY PASS-THROUGH,CORE_PCM_MODULE
codec,PROXY VIDEO PASS-THROUGH,CORE_PCM_MODULE
codec,RAW Signed Linear (16 bit),CORE_PCM_MODULE
codec,Speex,mod_speex

但是要注意,有加載不一定就能使用。具體能否使用還要看vars.xml裏面的配置


FreeSwitch默認配置哪些編碼器能使用?

上面說到系統加載了很多編碼器,但是不一定能使用,具體能使用哪些編碼器,要看conf/ vars.xml 配置文件裏面的下面的參數:

<X-PRE-PROCESS cmd=”set” data=”global_codec_prefs=G722,PCMU,PCMA,GSM”/>
<X-PRE-PROCESS cmd=”set” data=”outbound_codec_prefs=PCMU,PCMA,GSM”/>

global_codec_prefs是全局能使用的編碼器。
outbound_codec_prefs 是FreeSwitch撥出的時候使用的編碼器。


FreeSwitch如何設置修改默認配置添加支持G.729 ,iLBC等編碼器?

首先查看:conf\autoload_configs 目錄下的modules.conf.xml 配置文件,看看是否有打開註釋加載到系統,註釋了就是沒有加載的。比如mod_ilbc 默認是沒有加載的。而mod_g729 默認是加載的。然後在conf/ vars.xml 配置文件裏面的看下面的參數:

<X-PRE-PROCESS cmd=”set” data=”global_codec_prefs=G722,PCMU,PCMA,GSM”/>
<X-PRE-PROCESS cmd=”set” data=”outbound_codec_prefs=PCMU,PCMA,GSM”/>

假如沒有就加上:

<X-PRE-PROCESS cmd=”set” data=”global_codec_prefs=G722,PCMU,PCMA,GSM,G729,iLBC”/>
<X-PRE-PROCESS cmd=”set” data=”outbound_codec_prefs=PCMU,PCMA,GSM,G729,iLBC”/>

保存、重啓FreeSwitch就可以

有人說加了G729,但是還是不行,那是因爲FreeSwitch 的G729只能支持透傳的方式。不能轉碼,導致呼叫到IVR,或者兩個軟電話一個是G729一個不是G729 也不能話。要想使用G729通話,只能兩個軟電話都是G729的情況才行


FreeSwitch默認配置哪些編碼器能使用?

上面說到系統加載了很多編碼器,但是不一定能使用,具體能使用哪些編碼器,要看conf/ vars.xml 配置文件裏面的下面的參數:

<X-PRE-PROCESS cmd=”set” data=”global_codec_prefs=G722,PCMU,PCMA,GSM”/>
<X-PRE-PROCESS cmd=”set” data=”outbound_codec_prefs=PCMU,PCMA,GSM”/>

global_codec_prefs是全局能使用的編碼器。
outbound_codec_prefs 是FreeSwitch撥出的時候使用的編碼器。


如何看FreeSwitch當前支持哪些語音和視頻編碼器?

結合使用show codec 命令可以看到系統加載的編碼器和
sofia status profile internal
或者假如是5080端口
sofia status profile external


軟電話上如何指定編碼器?

大多數軟電話上都能指定使用編碼器。我們強烈建議在內網測試,只要指定G.711 alaw語音編碼器就可以。簡單明瞭,有問題也好查,因爲SDP 的協商過程太過複雜,初學者很暈。以eyebeam爲例子,在eyebeam上點右鍵,點setting然後點media,audio,advance。(通常情況下視頻是不需要的,可以都去掉,只有當需要視頻功能的時候才加上h.263)


如何實現用FreeSwitch進行轉碼?

FreeSwitch的默認配置是不進行轉碼的,比如軟電話a 呼叫軟電話b,a 只有G.711alaw,b只有G.711 ulaw。他們都註冊到FreeSwitch上,註冊是成功的,但是無論a 呼叫b 還是b 呼叫a 都是不行的。但是a 呼叫a 自己是可以的,b呼叫b自己也是可以的。要讓FreeSwitch支持分機間能轉碼通話。需要修改:
conf\sip_profiles\ 目錄下的
internal.xml或external.xml (5080端口上的)下面兩個參數都設置爲false:

<param name=”inbound-late-negotiation” value=”false”/>
<param name=”inbound-zrtp-passthru” value=”false”/>

如何解決FreeSwitch的G.729的轉碼?

要實現G.729的轉碼需要自己開發編碼器,即在FreeSwitch的源碼上進行修改。有人已經做成功這個事情。有編譯好的二進制包可以使用。在羣裏面有做好的二進制安裝包,我放到網絡上:url下載地址:http://42.121.7.65/FreeSWITCH1.2.0-G729.rar。或者自己增加這個編碼器。或者網絡上購買別人做好的這個編碼器。


FreeSwitch如何編程修改源碼,手工添加編碼器?

根據Freeswitch 音視頻編碼支持上面的介紹:
以模塊方式加載的編碼在目錄src\mod\codecs下面,所以如果我們想添加自己的編碼,在此目錄下參考其他實現即可,freeswitch對新編碼的添加接口比較簡單,自己增加編解碼器步驟如下:
註冊四個回調:
init
encode
decode
destroy
然後通過switch_core_codec_add_implementation把這幾個回調的實現註冊進去。


FreeSwitch如何設置修改默認配置才能支持視頻通話?

在conf/ vars.xml 配置文件裏面修改下面的參數,增加H263或者H264編碼:

<X-PRE-PROCESS cmd=”set” data=”global_codec_prefs=G722,PCMU,PCMA,GSM”/>
<X-PRE-PROCESS cmd=”set” data=”outbound_codec_prefs=PCMU,PCMA,GSM”/>
<X-PRE-PROCESS cmd=”set” data=”global_codec_prefs=G722,PCMU,PCMA,GSM”/>
<X-PRE-PROCESS cmd=”set” data=”outbound_codec_prefs=PCMU,PCMA,GSM”/>
<X-PRE-PROCESS cmd=”set” data=”global_codec_prefs=PCMU,PCMA,GSM,H263″/>
<X-PRE-PROCESS cmd=”set” data=”outbound_codec_prefs=PCMU,PCMA,GSM,H263″/>

保存、重啓FreeSwitch就可以。要測試支持視頻通話,軟電話要支持。先要有視頻的編碼器,然後在eyebeam 裏面還要設置。
另外:FreeSwitch 的視頻通話是不支持轉碼的,因此使用的時候需要所有的軟電話都設置爲一樣的視頻編碼器,比如都設置爲H263編碼器。


FreeSwitch如何修改默認配置實現在兩個網卡上不同的網段上,與運行兩個網段上的軟電話互通.?

在兩個網卡上不同的網段上,與運行兩個網段上的軟電話互通.這是一個實際應用環境中會經常碰到的問題。
比如:
192.168.1.X 5060 internal profile 1000 1002 register on 192.168.1.X 5060
1000==>1002 ok 1002==>1000 ok
192.168.11.X 5060 external profile 1000 1002 register on 192.168.11.X 5060
1000==>1002 fail 1002==>1000 ok
1000 register on internal 192.168.1.X 5060 1002 register on external
1000 register on internal 192.168.1.X 5060 1002 register on external
X
5060
external 1002 ==>internal 1000 ok
internal 1000==>external 1002 ok
結論只能呼叫在internal上註冊的分機。
修改文件internal.xml和external.xml,位置:/usr/local/freeswitch/conf/sip_profiles
external.xml 修改內容:

<param name=”rtp-ip” value=”192.168.1.236″/>
<param name=”sip-ip” value=”192.168.1.236″/>
<param name=”sip-port” value=”5060″/>

internal.xml

<param name=”rtp-ip” value=”192.168.11.101″/>
<param name=”sip-ip” value=”192.168.11.101″/>

修改sip的external與internal配置文件
打開sip_profile/external.xml文件,反註釋下面的行:

<param name=”force-register-domain” value=”$${domain}”/>
<param name=”force-register-db-domain” value=”$${domain}”/>
<param name=”dbname” value=”share_presence”/>
<param name=”presence-hosts” value=”$${domain}”/>

打開sip_profile/internal.xml文件,反註釋相同的行:

<param name=”force-register-domain” value=”$${domain}”/>
<param name=”force-register-db-domain” value=”$${domain}”/>
<param name=”dbname” value=”share_presence”/>
<param name=”presence-hosts” value=”$${domain}”/>

FreeSwitch FlashPhone

什麼是flash phone/SIP?

Flash phone 就是通過網頁上的flash插件來實現語音媒體通話的功能。作爲搞voip sip 的研發人員,瞭解這個有一定的必要性。我們認爲支持rtmp協議能進行語音通話的系統都可以叫做flash phone。其代表是開源的red5phone ,它使用java 基於red5 媒體服務器上開發的實現flash到sip轉換網關


爲啥需要flash phone/SIP?

Flash sip 或者flash phone 的優勢是在瀏覽器裏面使用flash player 插件不需要新安裝插件


啥情況下下需要flash phone?

A.訪問系統的用戶是非特定的用戶或者遊客。他們通過網頁上對系統進行訪問。使用activeX 插件的形式,用戶會不信任,也不會安裝。因此可以通過Flash sip 或者flash phone來對系統進行語音訪問。因爲絕大多數的機器瀏覽器都安裝了Flash player插件。通俗一點描述:用戶瀏覽某個網站,對裏面的某個產品有興趣,可以點產品邊上的電話按鍵馬上和客服或者銷售人員進行語音溝通。以前類似的業務是通過web 800 或者web call 讓用戶輸入手機號碼然後系統呼叫用戶的手機跟坐席進行通話來實現的。許多用戶不想泄漏手機,不會輸入手機號碼。
B.B/S結構的呼叫中心,系統的客服或者坐席是經常變換機器的,他們今天可能在公司上班,明天可能在家裏上班。
C.有些地方的運營商不允許使用SIP 進行VOIP通訊。比如山東聊城聯通的寬帶就是禁止使用SIP 進行VOIP通訊。這個時候通過Flash phone作爲媒體通訊是合適的。


使用flash phone使用什麼協議?

flash phone使用adobe 公司的flash player插件,跟系統使用RTMP進行通信。RTMP 是基於TCP 協議開發的一種媒體協議。客戶端就是flash player 或者基於AIR的應用程序,服務器可以說FMS,RED5, 和FreeSwitch 的MOD_RTMP


使用flash phone需要注意哪些問題?

由於RTMP 是基於TCP 協議開發的一種媒體協議,TCP的協議網絡影響特別大。因此使用flash phone 的時候需要注意:
A.系統的服務端和客戶端最好能在一個運營商內使用。跨運營商帶寬是不能保證的,延時也會明顯加大。在使用tcp 進行媒體傳輸通訊的時候影響會顯著放大。
B.假如要公衆服務的系統,最好是架設在BGP的四線接入的機房內部,纔能有效
保證接入的帶寬和延時。
C.RTMP 默認是使用1935 端口。機器上要保證這個端口是沒有進程其他佔用的。
D.flash phone 測試呼叫9195延遲5秒的迴音測試,是不行的,有BUG


FreeSwitch如何增加RTMP 接口協議模塊以實現對flash phone的支持?

FreeSwitch默認是不提供mod_rtmp模塊需要自己編譯。編譯好mod_rtmp模塊
之後通過修改 \conf\autoload_configs 目錄下的modules.conf.xml 配置文件,打開<load module=”mod_rtmp”/>的註釋。保存、重啓FreeSwitch 就可以使用


FreeSwitch 的flash 配置文件是哪個,如何配置RTMP的端口?

\conf\autoload_configs目錄下的rtmp.conf.xml 就是這模塊的配置文件。

<param name=”bind-address” value=”0.0.0.0:1935″ />

其中的1935 就是rtmp 模塊發默認端口。假如1935端口被佔用,就要修改這個參數。

FreeSwitch的flash 配置文件如何配置不需要login就可以使用?

\conf\autoload_configs目錄下的rtmp.conf.xml配置文件

<param name=”auth-calls” value=”true” />

參數改爲:

<param name=”auth-calls” value=”false” />

然後不用flash phone 上login 就可以呼叫。但是這樣是有風險的,我們建議除非是內網使用,否則不要設置爲false


FreeSwitch的flash phone 使用啥工具進行修改開發?

提供的支持rtmp的代碼在\clients\flex 目錄下。flash phone是基於FLEX 開發的目前支持Adobe Flash Builder 4.6開發


FreeSwitch的flash phone 代碼哪些是最有用的?

FreeSwitch 默認提供的代碼很龐大,功能很多,尤其是JS部分,給初學者帶來很大的困惑。實際上基本的通話功能只要很少的code,簡化之後的code 只有300多行。整個demo 可以到http://42.121.7.65/fs_flex.rar上去下載


FreeSwitch的flash phone 如何呼叫分機?

flash phone 連接connect到系統之後,可以呼叫已經註冊到FreeSwitch上的分機。呼叫的方法是直接呼叫:sip:分機@FreeSwitch的IP


FreeSwitch的啥情況下iLBC編碼不能使用?

本人測試的1.2.1的版本由於FreeSwitch 的某個bug,導致某些情況下(比如flash phone客戶端)通過iLBC編碼呼叫其他系統,或者其他軟電話分機的時候,INVITE 裏面的SDP 是錯誤的。iLBC編碼的RTP MAP 應該是98.在這裏flash phone 默認的SPEEX的RTP MAP變成了98.而iLBC編碼的RTP MAP變成了99.從而導致無法跟其他系統(比如毅航的ISX系列)集成使用,比如會造成單通。這個時候需要通過修改源碼,重新編譯mod_sofia 模塊替換之後才能使用
具體修改的地方是sofia_glue.c文件裏面的sofia_glue_set_local_sdp函數裏面的下面部分:

if (!tech_pvt->payload_space) {
int i;
tech_pvt->payload_space = 98;
//yhy2012-11-16 98是iLBC的RTM MAP,應該改爲其他比如97
Ver 1.2.3:
mod_rtmp.c
//yhy2012-12-23 帶寬或者採樣rate 由16000改爲8000.
#define SPEEX_BAND_YHY 8000
switch_core_timer_init(&tech_pvt->timer, “soft”, 20, (SPEEX_BAND_YHY / (1000 / 20)),
switch_core_session_get_pool(session));
/* Initialize read & write codecs */
if (switch_core_codec_init(&tech_pvt->read_codec, /* name */ “SPEEX”,
/* fmtp */ NULL, /* rate */ SPEEX_BAND_YHY, /* ms */ 20, /* channels */ 1,
/* flags */ SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
/* codec settings */ NULL, switch_core_session_get_pool(session)) !=
SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, “Can’t initialize read codec\n”);
return SWITCH_STATUS_FALSE;
}
if (switch_core_codec_init(&tech_pvt->write_codec, /* name */ “SPEEX”,
/* fmtp */ NULL, /* rate */ SPEEX_BAND_YHY, /* ms */ 20, /* channels */ 1,
/* flags */ SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
/* codec settings */ NULL, switch_core_session_get_pool(session)) !=

/* fmtp */ NULL, /* rate */ SPEEX_BAND_YHY, /* ms */ 20, /* channels */ 1,
/* flags */ SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
/* codec settings */ NULL, switch_core_session_get_pool(session)) !=

return SWITCH_STATUS_FALSE;
}

在修改代碼之後測試iLBC和speex@8000h@20i 不能同時設置到編碼器裏面,否則:eyebeam(軟電話的)呼叫會導致ilbc 的rtpmat=97 ,speex 的rtpmap=98。flashphone的呼叫會導致speex 的rtpmap=97,ilbc 的rtpmat=98 導致不一致的錯誤。只能使用iLBC 或者SPEEX裏面的一個。假如沒有設置speex@8000h@20i ,flash呼叫內部分機的時候SDP不會出現:speex 的rtpmap=97。但是假如是flash 呼叫外部的沒有註冊上來的sip,那麼會出現speex 的rtpmap=97的sdp 。呼叫sip:[email protected]:8286


軟電話分機如何實現對FreeSwitch 的flash phone的呼叫?

flash phone 連接到FreeSwitch的MOD_RTMP之後。需要login 才能被呼叫。軟電話分機要呼叫,需要修改撥號計劃,在conf\dialplan目錄下的default.xml 文件裏面修改:

<!– http://wiki.freeswitch.org/wiki/Dialplan_XML –>
<include>
    <context name=”default”>
        <extension name=”Local_Extension2″>
            <condition field=”destination_number” expression=”^(10[01][0-9])$”>
                <action application=”export” data=”dialed_extension=$1″/>
                <action application=”set” data=”call_timeout=10″/>
                <action application=”set” data=”hangup_after_bridge=true”/>
                <action application=”set” data=”continue_on_fail=true”/>
                <action application=”bridge”
                data=”${rtmp_contact(default/${dialed_extension}@$${domain})}”/>
				<action application=”bridge”
				data=”${rtmp_contact(default/${dialed_extension}@$${domain})}”/>
            </condition>
        </extension>
        ... ...

注意兩條:
bridge 命令,因爲測試發現nod_rtmp有bug,所以呼叫到flash 客戶端有時候不成功。
continue_on_fail=true的情況下,萬一bridge 不行,我們就再來一次bridge!不行甚至可以考慮再來一次


如何實現同時支持呼叫分機和flash client 分機?

在conf\dialplan目錄下的default.xml 文件裏面修改

<include>
    <context name=”default”>
        <extension name=”Local_Extension2″>
            <condition field=”destination_number” expression=”^(10[01][0-9])$”>
                <action application=”export” data=”dialed_extension=$1″/>
                <action application=”set” data=”call_timeout=10″/>
                <action application=”set” data=”hangup_after_bridge=true”/>
                <action application=”set” data=”continue_on_fail=true”/>
                <action application=”bridge” data=”user/${dialed_extension}@${domain_name}”/>
                <action application=”bridge”                data=”${rtmp_contact(default/${dialed_extension}@$${domain})}”/>
				<action application=”bridge”			data=”${rtmp_contact(default/${dialed_extension}@$${domain})}”/>
            </condition>
        </extension>

注意有3條bridge 命令,第一次是呼叫軟電話的分機。要是沒有軟電話分機註冊上,就呼叫flash client 的分機



FreeSwitch 高級配置部分

沒有註冊的實現對FreeSwitch 的分機的呼叫?

修改:acl.conf.xml。比如允許192.168.11.X網段撥入到軟電話或者flash client,acl.conf.xml修改如下,然後沒有註冊的呼叫註冊的可以直接呼到默認的配置5080 端口就行

<configuration name=”acl.conf” description=”Network Lists”>
<network-lists>
<!-These
ACL’s are automatically created on startup.
rfc1918.auto -RFC1918 Space
nat.auto -RFC1918 Excluding your local lan.
localnet.auto -ACL for your local lan.
loopback.auto -ACL for your local lan.
–>
<list name=”lan” default=”allow”>
<node type=”deny” cidr=”192.168.42.0/24″/>
<node type=”allow” cidr=”192.168.42.42/32″/>
</list>
<!–
This will traverse the directory adding all users
with the cidr= tag to this ACL, when this ACL matches
the users variables and params apply as if they
digest authenticated.
–>
<list name=”domains” default=”deny”>
<!–domain= is special it scans the domain from the directory to build the ACL –>
<node type=”allow” domain=”$${domain}”/>
<node type=”allow” host=”192.168.11.0″ mask=”255.255.255.0″/>
<!–use cidr= if you wish to allow ip ranges to this domains acl. –>
<!–<node type=”allow” cidr=”192.168.0.0/24″/> –>
</list>
</network-lists>
</configuration>

FreeSwitch 爲啥會沒有發掛機信號給A leg?

有兩種情況會導致這個問題:
A.<action application=”set” data=”hangup_after_bridge=true”/> 設置成了false
B.Invite 裏面的from 1005@fs ip 地址發起的會導致被叫掛機,fs 不會轉發掛機信號給主叫。因此跟第三方集成的時候,from 的地址要保證是對的


FreeSwitch如何修改默認配置才能撥打外部的SIP電話或者SIP網關?

在conf\sip_profiles\external 目錄下建立gw1.xml 內容如下:

<gateway name=”gw1″>
    <param name=”realm” value=”192.168.11.103:5060″/>
    <param name=”username” value=”5678″/>
    <param name=”password” value=”1234″/>
    <param name=”register” value=”false” />
</gateway>

其中ip 地址和端口是外撥網關的ip 和sip 的端口
然後在conf\dialplan\default 建立一個call_out.xml
內容如下:

<include>
    <extension name=”call out”>
        <condition field=”destination_number” expression=”^9(\d+)$”>
            <action application=”bridge” data=”sofia/gateway/gw1/$1″/>
        </condition>
    </extension>
</include>

表示撥打 9開頭的號碼都走外撥網關gw1的路由


外部的SIP網關如何撥打到某個分機?

在conf/dialplan/public目錄下建立my_did.xml 文件,內容如下:

<include>
    <extension name=”public_did”>
        <condition field=”destination_number” expression=”^(你的接入號碼)$”>
            <action application=”transfer” data=”1000 XML default”/>
        </condition>
    </extension>
</include>

之後撥打你的接入號碼就會到分機上


FreeSwitch公網運營如何設計?

FreeSwitch運行在公網,意味着:
A.假如是對公衆提供服務,軟電話分機分佈在全國各地,各個運營商都可能存在,因此各個運營商的接入帶寬延時是要考慮的。我們建議部署在BGP 4線機房
B.意味這軟電話在公司內網,需要NAT 穿透才能使用,因此需要去掉–nonat啓動


FreeSwitch公網運營有哪些需要特別考慮的?

除了考慮實網部署的問題之外,公網運營考慮的問題還有帶寬覈算和安全性,
帶寬的問題主要是編碼器的使用
G729 默認是沒有轉碼的
因此考慮iLBC編碼是合適的


FreeSwitch公網運營環境下哪些情況下測試過?

聯通WCDMA 3G數據通道
電信CDMA 2000 3G數據通道
電信寬帶用戶
聯通寬帶用戶
長寬寬帶用戶
移動(鐵通)寬帶用戶
客戶軟電話在公司內部通過WIFI上網的環境測試


FreeSwitch如何禁止IP地址發生改變後, 自動重啓sofia模塊?

修改文件/freeswitch/conf/autoload_configs/sofia.conf.xml
修改內容<param name=”auto-restart” value=”false”/>
該屬性設置的目的是防止FS在檢測到IP地址發生改變後,自動重啓sofia模塊


FreeSwitch公網運營部署如何配置用戶帳號密碼?

默認用戶的認證密碼和語音郵箱登陸密碼都異常簡單(默認爲1234)。可以參考以下建議:
1、刪除默認的靜態XML配置,通過mod_xml_curl模塊使用後臺數據庫中動態的數據。
2、手動修改配置文件中的用戶名和密碼。
3、通過運行scripts/perl/randomize-passwords.pl修改


FreeSwitch的SDP有啥缺陷?

Alaw 和ulaw 沒有m=rtpmap 0/8000 之類的詳細描述,導致呼叫到kapanga 上,kapanga接通就掛機。沒有rtpmat 描述導致呼叫到red5 phone 等不行


FreeSwitch 的SDP有啥特殊的?

跟其他的軟電話之類的對比多了rtpmap=13靜音的說明


FreeSwitch對內存CPU需求如何?

基本的機器就可以,目前主流的雙四核的CPU,8G內存配置的pc Server機器,可以支持300先線併發帶轉碼。在P950 CPU 2G內存配置的筆記本上測試可以支持30路的轉碼(G.711–SPEEX)。假如內存不夠,會導致FreeSwitch崩潰



FreeSwitch ESL編程部分

FreeSwitch如何設置支持SOCKET EVENT API外聯模式編程?

在\conf\dialplan\default.xml 配置文件裏面加上

<extension name=”socket”>
    <condition field=”destination_number” expression=”^12396$”>
        <action application=”socket” data=”127.0.0.1:8084 async full”/>
    </condition>
</extension>

其中的12396表示接入號碼。之後,撥打12396 的號碼就會到本地的8084端口的服務流程(用戶自己控制的ivr)上


FreeSwitch ESL外聯模式同步和異步模式有啥區別?

A.設置區別:
在\conf\dialplan\default.xml 配置文件裏的<extension name=”socket”> 章節裏面:
異步模式參數:
<action application=”socket” data=”127.0.0.1:8084 async full”/>
同步模式參數:
<action application=”socket” data=”127.0.0.1:8084 sync full”/>
B.使用區別:主要區別在於執行app 或者api 的時候異步模式是馬上返回的。而同步模式是阻塞的。一直到條件滿足函數纔會返回的
C.例子:以播音舉例
esl_execute(handle, “play_and_get_digits”, “1 12 1 15000 # intelno.wav” , NULL);
其中的”1 12 1 10000 # intelno.wav” 分別對應下面參數:
<min> <max> <tries> <timeout ms> <terminators> <file> 分別表示最小收1個按鍵最大收12個按鍵重複1次等15000毫秒,按#結束。提示語音是intelno.wav
異步模式下esl_execute執行之後馬上返回,ivr可以進入處理收按鍵環節,用戶開始聽見intelno.wav的語音內容。在異步模式下,用戶的按鍵處理條件可以是程序自己來處理。按鍵的結束條件也不僅僅只有上面幾個,比如可以設置兩個按鍵的間隔時間等參數。這樣大大增加了靈活性
同步模式下,函數esl_execute執行就沒有返回,除非用戶按鍵達到12個,用戶按了#鍵或語音播放結束超過15秒時間函數纔會返回。表面上看同步模式比較簡單,開發流程比較容易,但是一旦是多線併發,業務複雜的流程,比如使用esl 開發呼叫中心的流程,或者其他的複雜的流程,同步模式處理起來就吃力。簡單就意味着不夠靈活。爲了系統將來的業務擴展支持,我們建議使用異步模式


FreeSwitch默認播音和錄音目錄在哪裏?

播放文件的默認目錄:
\sounds\en\us\callie
錄音文件的默認目錄:
\sounds\en\us\callie


FreeSwitch如何指定錄音文件和目錄?

可以在record 的時候寫上絕對路徑,比如 d:/record/1.wav


FreeSwitch如何指定alaw播音文件的格式?

FreeSwitch的播音除wav文件之外,其他是根據文件擴展名來區分格式的
國內通常的ivr系統都是使用單聲道的8000Hz alaw編碼的語音格式
FreeSwitch 能支持這種格式的語音有兩種辦法:
A.文件名稱的擴展名叫做.alaw
B.使用工具給這些文件加上wav 頭,然後擴展名叫做.wav
假如是其他格式的語音類似參考修改
具體可以在fs_cli下使用show files 命令查看。然後使用合適的語音文件擴展名


FreeSwitch如何指定alaw錄音文件的格式?

國內通常的ivr系統都是使用單聲道的8000Hz alaw編碼的語音格式。要做到能錄製到這種格式的語音,需要以下幾個步驟:
首先在撥號計劃裏面加上<action application=”set” data=”record_sample_rate=8000″/><action application=”export” data=”RECORD_STEREO=false”/>來指定是8000HZ和單聲道,默認是立體聲的。

<extension name=”socket”>
    <condition field=”destination_number” expression=”^12396$”>
        <action application=”set” data=”record_sample_rate=8000″/>
        <action application=”export” data=”RECORD_STEREO=false”/>
        <action application=”socket” data=”127.0.0.1:8084 async full”/>
    </condition>
</extension>

然後在uuid_record 或者record的時候,錄音的時候指定是.alaw的擴展名,這樣就指定是alaw編碼的語音。假如是.wav擴展名則是線性16bit沒有編碼的語音


FreeSwitch雙方通話聲音都正常,但是錄音文件,回放時發現聲音很小,如何解決?

錄音生成的WAV文件,和實際錄音對比聲音只是小一點點。使用cooledit 播放聲音是幾乎正常的。回放錄音文件時發現聲音很小,可以通過設置增益來實現uuid_audio <uuid> [start [read|write] [mute|level <level>]|stop],level參數從 -4 to 4, 0 是默認聲音大小. 4是最大


FreeSwitch 如何實現支持視頻的錄製和播放?

FreeSwtich通過模塊fsv支持視頻的錄製和播放,此模塊提供兩個APP(record_fsv和
play_fsv),一個錄像,一個播放,實現源碼文件:src\mod\applications\mod_fsv/mod_fsv.c
- 錄像:
dialplan 中調用app record_fsv,<action application=”record_fsv” data=”file.fsv”/>,參數爲錄音文件名
- 播放視頻:
dialplan中調用app play_fsv,<action application=”play_fsv” data=”file.fsv”/>,參數同樣爲文件名

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章