如何實現一個voip錄音系統

NO IMAGE

這裡討論的voip錄音系統,是在網路交換機上設定埠映象,將所有坐席(如ip話機)的埠資料映象到指定埠,錄音系統接到該埠,抓取埠上所有的資料包。

市場上做voip錄音的廠家,有些是硬體如板卡,有些是純軟體,他們的產品存在下列缺點:
1、很貴;
2、會丟失錄音,原因一是處理能力不夠,二是程式不穩定;
3、介面或介面複雜,有的還需要呼叫CTI介面。

我花了幾天思考了一下,並用一週的時間實現了它,設計目標如下:
1、高效能:
支援1000線以上的併發錄音。
2、簡單、自成體系:
系統對sip訊息也進行了處理,分析建立會話和結束會話的訊息,並從訊息中抽取主叫號碼、被叫號碼等資訊。
支援UDP或TCP傳輸的sip協議。
不支援H323等過時的協議,原因一是此類協議很複雜,二是原先使用h323協議的廠商產品如Avaya,很容易配置成SIP 。
系統可將會話記錄寫到資料庫表,包括主、被叫號碼,開始時間,通話時長,錄音檔名等資訊,供外部應用進行查詢匹配。
(因為主叫或被叫,總有一方對應坐席分機,匹配和查詢統計是很容易的)
通過資料庫,可以很容易和第三方應用整合。
3、穩定:
可長時間穩定執行,不會丟失錄音,也不會丟包。
4、支援多種音訊編解碼:
包括:g711a、g711u,g729ab,gsm,g723,iLbc等多種編碼。

實現的要點:
1、抓包採用wincaplib,抓取tcp和udp,抓取後做快速判斷,比如判斷是否為sip的應答、建立會話200 OK訊息,或是sip的bye訊息,或是rtp包,如是上述三類包,則放入到緩衝區;
2、執行緒池去處理緩衝區,如sip處理的從緩衝區讀取訊息來生成會話和建立錄音檔案,或者關閉會話關閉錄音。

高效率的要點是讀寫必須無鎖,每個執行緒上的緩衝區為環形佇列。

3、rtp包的處理:根據源或目標地址和埠,到會話佇列中去匹配會話,此時需要對佇列進行加鎖。
我參考資料庫思想設計了兩種鎖,讀鎖和寫鎖,多個執行緒同時可以讀,但讀鎖和寫鎖之間互斥。
sip訊息處理執行緒在建立會話或拆除會話時,使用寫鎖;
rtp包處理執行緒在定位會話時,使用讀鎖。

這是巧妙的設計,因為錄音系統大部分時間在處理rtp包,採用讀鎖機制既保證了執行緒安全,又大大地提高了效率。

4、媒體處理:
每個會話的兩個方向的rtp包收到後要進入緩衝區去抖動,並解碼成線性pcm資料,錄音合成執行緒(是個執行緒池)會以20ms的間隔去合成兩個方向的pcm資料並延遲寫入錄音檔案。延遲寫入可以提高磁碟io的效率。
媒體處理使用了藍星際自行開發並長期使用的庫:LxjMediaApi.dll,這個庫經過升級後可以支援外部資料來源。
特別地,藍星際媒體庫對g729的處理十分高效,因為我們採用了Intel的IPP庫,是業界公認效能最佳的g729編解碼器。

歡迎和我討論,或索取試用程式。
[email protected]