VOIP RTP分析和AC490除錯記錄

2021-05-22 10:51:21 字數 3294 閱讀 3036

最近在研究voip,**閘道器底層使用ac490進行語音頻號ip化(驅動不由我寫),碰見一些,總結如下。

ac490是audiocodes公司的voip處理器,可以執行8/12通道lbrc,包括g.723/g.729/ilbc/amr/gsm fr。支援24通道的g.711演算法或12通道的g.711/g.723演算法的語音編碼;g.168-2002回波消除;t.38傳真;支援rtp/rtcp的打包/解包。

詳細定義請見rfc3550 (對rtp格式的描述) 和 rfc3551 (對rtp攜帶的**資訊格式的描述).
前12個位元組在每乙個rtp packet中都存在,而一系列的csrc標記只有存在mixer時才有。

version (v): 2 bits

標明rtp版本號。協議初始版本為0,rfc3550中規定的版本號為2。

padding (p): 1 bit

如果該位被設定,則在該packet末尾包含了額外的附加資訊,附加資訊的最後乙個位元組表示額外附加資訊的長度(包含該位元組本身)。該欄位之所以存在是因為一些加密機制需要固定長度的資料塊,或者為了在乙個底層協議資料單元中傳輸多個rtp packets。

extension (x): 1 bit

如果該位被設定,則在固定的頭部後存在乙個擴充套件頭部,格式定義在rfc3550 5.3.1節。

csrc count (cc): 4 bits

在固定頭部後存在多少個csrc標記。

marker (m): 1 bit

該位的功能依賴於profile的定義。profile可以改變該位的長度,但是要保持marker和payload type總長度不變(一共是8 bit)。

payload type (pt): 7 bits

標記著rtp packet所攜帶資訊的型別,標準型別列出在rfc3551中。如果接收方不能識別該型別,必須忽略該packet。

sequence number: 16 bits

序列號,每個rtp packet傳送後該序列號加1,接收方可以根據該序列號重新排列資料報順序。

timestamp: 32 bits

時間戳。反映rtp packet所攜帶資訊包中第乙個位元組的取樣時間。

ssrc: 32 bits

標識資料來源。在乙個rtp session其間每個資料流都應該有乙個不同的ssrc。

csrc list: 0 to 15 items, 32 bits each

標識貢獻的資料來源。只有存在mixer的時候才有效。如乙個將多聲道的語音流合併成乙個單聲道的語音流,在這裡就列出原來每個聲道的ssrc。

payload:此部分的格式規定見rfc3551, 隨攜帶的**流格式不同而不同。

按照rfc3551 中4.5.6規定,乙個攜帶g729格式的rtp包的payload可以由0或多個g.729 或 g.729 annex a 幀組成,後面再有0或多個g.729 annex b幀組成。

g.729 或 g.729 annex a每幀長10 byte,相互間完全相容,主要攜帶語音資訊。g.729 annex b幀每幀長4 byte,主要攜帶vad(voice activity detector, 語音行為檢測)和cng(comfort noise generator,舒適噪音生成)。

不過根據對sip**和軟sip**的g729的rtp包抓包分析,其payload一般是由4個g.729 或 g.729 annex a組成。因為vad不是所有裝置都支援,例如asterisk不支援。

按照rfc3551中4.5.14規定,乙個攜帶g711格式的rtp包格式較簡單,在g711中每個聲音取樣被編碼為8 bit。56 kb/s和48 kb/s在rtp中是不被支援的。

本身希望用ac490直接傳送rtp包,但是控制其直接傳送的rtp包卻無法被sip**,asterisk和wireshark正確分析。

3.1 g

.729

的問題

rtp頭部多了4個bit,一般來時g729的rtp包頭2個bite是80 12,或者80 92(mark被置為1,一般是在第乙個rtp包中),而
ac490傳送g729的rtp包中80 12前面多個4bit, 修改ac490的驅動使其去掉頭4個bit,可以被wireshark分析為g729的rtp包,
但仍然無法與sip**互通,繼續分析發現sip**的g729的rtp包payload長度為20 bit,而ac490的為12bit,且在通過
asterisk的時候,asterisk報告檢測有vad幀,檢視asterisk原始碼發現asterisk的frame.c不支援vad。
綜上和前面對g729格式的描述,猜測ac490的預設g729的rtp包由2個g.729 或 g.729 annex a 幀和乙個g.729 annex b
幀組成。而sip**和軟sip**的g729的rtp包一般由4個g.729 或 g.729 annex a 幀組成。
修改驅動,改變ac490的g729的rtp包為4個g.729幀,與sip**和軟sip**互通成功。
3.2 g

.711a

的問題

在前面的除錯過程,由於修改ac490的g729的rtp包格式的方式需要些時間,嘗試修改ac490的rtp格式為g.711a,也就是pcma,
因為其格式較為簡單。但開始時仍然無法與sip**互通,表現為sip**可以聽到聲音但有很大的雜音,ac490這面的普通**靜音。分析
為還是兩端包格式不符,ac490丟棄了所有發過來的包。
繼續抓包,sip**的g.711a的rtp包payload長度為160bit,而ac490g.711a的rtp包payload長度為162bit,多次試驗分析後,發
現主要在ac490rtp包payload最後兩個bit上,在一次通話中,這兩個bit要麼是00 00,要麼是固定的兩個bit,所有包後面都是這兩種型別。
而不同通話中,00 00 外的另一種方式的兩個bit不同。而00 00或兩個固定bit出現方式暫時為發現規律,在靜音包和語音包尾部兩種都會
出現。
建議修改ac490驅動為在傳送時去掉尾部兩個bit,接受時補上兩個bit 00 00。
再次試驗互通成功。
1. 較為仔細的學習了rtp有關rfc,主要是rfc3550, rfc3551,還有rfc 2198和rfc2833。
2. 基本掌握了sip**和軟sip**的rtp包結構,了解了常見的rtp包格式(即rfc中建議的多種方式那種最常用)。
3. 對asterisk的sip.conf配置進一步熟悉,尤其是canreinvite這一段,怎樣使其表現的近似於stateless的sip伺服器。
4. 對用wireshark抓包進一步掌握。

VOIP RTP分析和AC490除錯記錄

最近在研究voip 閘道器底層使用ac490 進行語音頻號ip 化 驅動不由我寫 碰見一些,總結如下。ac490 是audiocodes 公 司的voip 處理器,可以執行8 12 通道lbrc 包括g.723 g.729 ilbc amr gsm fr 支援24 通道的g.711 算 法或12 通...

DC係數和AC係數

1 dc係數的中間格式計算 jpeg中為了更進一步節約空間,並不直接儲存資料的具體數值,而是將資料按照位數分為16組,儲存在表裡面。這也就是所謂的變長整數編碼 vli。即,第 0組中儲存的編碼位數為 0,其編碼所代表的數字為0 第 1組中儲存的編碼位數為 1,編碼所代表的數字為 1或者 1.如下面的...

AC和AP的區別

wlan系統一般由ac 接入控制器 和ap 無線接入點 組成。無線ap,為access point簡稱,一般翻譯為 無線訪問節點 它是用於無線網路的無線交換機,也是無線網路的核心。無線ap是移動計算機使用者進入有線網路的接入點,主要用於寬頻家庭 大樓內部以及園區內部,典型距離覆蓋幾十公尺至上百公尺,...