國內現在很多語音聊天工具都是基于TURN方式實現的,包括YY、AK等等,這種方式對于服務器的性能要求很高,而且在用戶量增大的時候,服務器壓力也會越來越大,用戶的語音質量也會受到很大影響。而基于P2P方式實現的語聊服務器,就可以極大的避免這種情況的發生,而且用戶的語音體驗也會非常好。
通過上文(
P2P的原理和常見的實現方式(為libjingle開路))我們知道,因為NAT設備沒有固定標準的原因,導致并不能100%的實現P2P,但是根據現在通用的ICE&STUN的方式,P2P的成功率可以達到90%多。前段時間在找使用這種方法實現的成熟庫,最后猛然發現libjingle就在那里。
通過一個多星期的研究,在此記錄一下libjingle庫的大致情況,如有不妥,希望朋友們可以留言或者郵件(peakflys@gmail.com)指正。
Libjingle綜述
Libjingle是一個方便實現P2P傳輸的開源庫,由google公司開發,并與2005年12月15日發布第一個版本,可以粗略的看成是Jingle協議的C++實現庫(peakflys注:只是和Jingle協議非常相似,并不完全兼容,區別以后介紹),Google Talk即是基于這個庫開發的。通過libjingle我們可以建立一個直通的網絡連接(無視中間的NAT、防火墻、中繼服務器和代理等),無需特別關心Session建立的細節(加解密、格式等),直接進行數據的交換。它也實現了一些輔助的功能,例如XML的解析和網絡代理的處理。我們通過它可以實現如下的應用:
·一個多用戶的語音聊天應用
·一個多用戶的視頻會議應用
·一個多用戶的現場音樂、流媒體應用
·一個點到點的文件傳輸和共享的應用
目前庫的版本是0.7.1(2012年10月2日發布),支持Windows和UNIX/Linux,開源許可用的是Berkeley-style,這也就意味著,可以任意的修改和擴展它來更好的滿足自己產品的需要。
庫的SVN路徑:http://libjingle.googlecode.com/svn/trunk/talk
值得注意的是:
① Libjingle庫本身的實現依賴于一些第三方庫,例如: 語音聊天依賴于Linphone或者GIPS,這取決于使用者的平臺
② Libjingle只是一個客戶端的實現, relay Server協議和STUN協議(如果需要),還需要自己實現
實現relay Server后的網絡結構(STUN使用 網絡上現有的,例如Google等公司提供的公有STUN服務器):

實現relay Server和STUN Server后的網絡結構:

STUN協議的實現不難,網上也有很多開源的代碼實現,關鍵是需要一些資源的部署(需要兩個公網IP)
P2P的關鍵實現在客戶端,通過使用libjingle我們可以快速的構造一個健壯高效的P2P Client,如果僅僅是實現類似于Skype或者QQ那樣的兩人或者幾人聊天,服務器方面實現就非常容易。但是如果要實現大用戶參與的語音室,那么我們就得專注于服務器廣播包的優化了。
by peakflys 16:53:47 Wednesday, January 30, 2013