搭建好環境,測試通過,熟悉協議之後, 就是自己做一個這樣的平台了。
伺服器想都不用想,直接用Tixbox,重頭寫不現實。
至於用戶端,一般的程式架構應該如下:
一 協議部分:
主要處理sip的註冊,呼叫,接收,掛機等功能,所有的協議都差不多,隨便選一個就行。
二 媒體傳輸,這部分比較複雜 :
1 音視頻採集
2 音視頻編碼
3 音視頻編碼後組RTP
4 RTP/RTCP發送
5 RTP/RTCP接收
6 從RTP解包還原成編碼後的音視頻
7 音視頻解碼
8 音視頻播放
一般如果分配任務,快速做一個用戶端,首先想到的就是找一個開源,編譯出來再修改。
不過,試了幾個,極度痛苦,分別說一下。
1 Linphone:
這個產品只能算一般,不過用到的lib非常不錯,exosip+osip為sip命令服務,ortp+mediastreamer2為流媒體服務。不過,編譯真是麻煩,別的不說,光mediastreamer2就用到了ffmpeg,gsm,ortp,srtp,openssl,speex, theora等,稀裡湖塗足足花了大半天時間把所有這些都編譯好,然後編譯ms2.lib時提示幾個連結出錯。因為我看到網上幾個文章說明是用vc2005輕鬆編譯出來的,我也用的vc2005。估計用mingw會簡單一些。不過,已經耗了近一天的時間,感覺不爽,放棄。估計是linphone估計搞的複雜,好讓antisip賣錢。
2 ekiga
這個需要ptlib,第一感覺這東西很麻煩,不過編譯時間出奇的順利(關鍵是官方提供的資料詳細,網友寫的文章也詳細)。然後編譯opal,也很順利。(只是佔用機器比較厲害,P4 2.6的占CPU極嚴重。不過,用的機器是聯想的超薄機箱那種,不排除官方弄個很爛的CPU冒充。因為換到另一個P4 3G,速度快上兩三倍)。
其實,編譯好opal,基本就可以了,它帶了很不錯的例子,撥打到電話接聽都不錯。
最後編譯ekiga時,需要交叉編譯,直接放棄掉,有那時間不如好好研究opal了。
3 其他
編譯了一下emiplib,這個庫寫的真不錯。雖然封裝的比較深,不過調用時,可以選擇比較靠上的類來調用,有點類似ACE。只是視頻格式少了一點。
回頭再看上面的一般結構,SIP部分不用操心,隨便找個庫就能達到目的,關鍵是媒體傳輸這部分。仔細看1-8這些部分,很多我們自己動手就可以做,其實我們並不需要一下完整的全功能的庫。
比如,音頻採集播放用DirectSound,視頻採用播放用DirectShow.編解碼用ffmpeg編譯出來的libavcodec,傳輸用jrtplib.這麼一看,只有3 音視頻編碼後組RTP和6 從RTP解包還原成編碼後的音視頻 這兩部分相對陌生,其他的都能找到成熟的代碼。基於這個想法,就不用上述開源產品,直接自己寫一個好了。
先做準備工作:
1 編譯好ffmpeg及所帶的libavcodec等幾個lib和dll,音視頻編解碼時需要。
2 利用DirectShow做視頻採集。播放就直接用GDI畫圖好了,簡潔。
3 聲音部分,參考Youtoo這個程式,連SIP都有了,用現成的exosip,osip,ms2.lib(這個庫不可使用視訊,否則就不用做上面那些苦力了)。音質相當不錯。
4 傳輸就用jrtplib,不過開始為了調試方便,自己寫的UDP socket。
這些準備工作做好,下一步就開始參考RFC進行RTP的組包和解包了。
更多技術文章請參看施昌權的個人網站: http://www.joyvc.cn