語音傳輸之RTP RTCP UDP及軟體實現關鍵點

2021-08-20 15:03:08 字數 3017 閱讀 8947

語音通訊是實時通訊,一定要保證實時性,不然使用者體驗會很糟糕。ietf設計了rtp來承載語音等實時性要求很高的資料,同時設計了rtcp來保證服務質量(rtp不保證服務質量)。在傳輸層,一般選用udp而不是tcp來承載 rtp包。下圖給出了這三個協議所在的協議層次。

rtp全稱是real-time transport protocol(實時傳輸協議),它是ietf提出的乙個標準,對應的rfc文件為rfc3550。一般用其承載實時性要求很高的資料形成rtp包,在語音通訊中,把pcm資料編碼後得到的碼流作為rtp的payload。下圖是其包頭結構。

這裡主要講一些關鍵點:

a)     包頭的版本資訊等都是用幾個位元位來表示的,共兩個位元組,在軟體實現時要用位域的形式表示。在大小端情況下有不同的表示方式,主要是在乙個位元組裡大小端表示時位置要互換,具體如下圖rtp頭資料結構定義。

b)    rtp包都是以網路序/大端的形式在網路中傳輸,這樣就有乙個網路序主機序互轉的過程。

c)    m 位即mark位,表示語音的開始,在通話剛開始的第乙個語音包,m位要置1。如果 vad使能,從vad包切到語音包時,第乙個語音包m位也要置1。

d)    在通話剛開始的第乙個語音包中,sequence/timestamp/ssrc等都要是隨機值。在後續的包中,ssrc代表通話的一方,在整個通話過程中都要保持不變。sequence要每次加一。timestamp要依據取樣率以及幀長每次加本幀內取樣的點數值,比如8000 hz採用率,幀長為20ms, 每次timestamp要加160。

軟體實現rtp協議時,先要初始化(主要是包頭欄位的初始化)。傳送方把每一幀pcm資料編碼後得到碼流,將其作為rtp的payload,同時填充好包頭中的字段,然後通過udp socket傳送到網路中去。接收方通過udp socket收到rtp包,解析包頭得到payload type/sequence等資訊,同時也得到payload,然後將它們送給下乙個模組處理。

實現完rtp後要檢查實現的是否正確,抓包看是主要的方式。抓到包後把udp轉換成rtp後就可以看相關資訊了,主要看格式是否對以及包頭中的字段的值是否對。如果格式不對,抓包工具(wireshark)會提示。

2,rtcp

rtcp全稱是real-time control protocol(實時控制協議),它也是ietf提出的乙個標準,對應的rfc文件為rfc3551,它的主要功能是:服務質量的監視與反饋、**間的同步。在rtp會話期間,各參與者周期性地(一般是5秒,應用層可以配)傳送rtcp包,rtcp包中含有已傳送的資料報的數量、丟失的資料報的數量、資料報到達的平均時間間隔等統計資訊。

rtcp協議處理機定義了五種型別的報文,它們完成接收、分析、產生和傳送控制報文的功能,如下表所示:

這五種型別中sr應用最頻繁,就以它為例來講,其他型別可以舉一反三。它的封裝結構見下圖:

同rtp一樣,這裡也主要講一些關鍵點:

a)    與rtp類似,rtcp包頭中一些值也用位元位表示,實現時也要用位域表示,也有大小端的問題。

b)    算length時,計算公式是length = size/4 -1。其中size是sr包的真實大小(單位是位元組)。

c)    算週期內丟包率(fraction lost)時,是以定點小數形式表示,即 fraction lost = (週期內丟包數 << 8) / 週期內期望接收包數.

d)    算dlsr時,是以1/65536秒為單位。

軟體實現rtcp協議時,一般是幾種型別的rtcp包組成組合包,所以一般先要判斷要發幾種型別的包。當處於sendreceive模式時,要發sr/sdes包,如果要停止通話,還要發bye包;當處於receiveonly模式時,要發rr/sdes包;如果要停止通話,還要發bye包。rtcp中有rtp包的統計,所以實現rtcp前要先在rtp中把相關的統計做好,同時還要做好sequence number的管理等。實現rtcp時傳送方先要實現sr或者rr包,然後是sdes包,如果是停止通話,還要加上bye包。實現每種rtcp包時是把相應的字段值填好,然後再把包頭填好。這些包都實現後拼在一起形成組合包,然後通過udp socket傳送到網路中去。接收方收到rtcp組合包後也是乙個包乙個包的去解析,然後把相應的資訊報告給上層。

實現完rtcp後同樣要檢查實現的是否正確,抓包看同樣是主要的方式。抓到包後把udp轉換成rtcp後就可以看相關資訊了,主要看格式是否對以及包中相應的字段是否對。如果格式不對,抓包工具會提示。

個人覺得實現rtp相對簡單,rtcp相對複雜一些,它是基於rtp的,有對rtp的各種統計,有對rtp sequence number的管理等。同時還要理解rtcp中為什麼要設計這些字段以及它們的計算方法。這些都搞清楚了也就不難了。

3,udp

udp 全稱是user datagram protocol(使用者資料報協議),屬於傳輸層協議(跟tcp在同一層),提供面向事務的簡單不可靠資訊傳送服務,在ietf中對應的rfc文件為 rfc 768。至於為啥用udp而不用tcp來傳輸實時性要求較高的資料,個人覺得主要有以下幾點:tcp的重傳機制(這時最主要的原因),tcp的包頭較大浪費了頻寬,tcp不支援組播。

實現時主要是呼叫系統提供的socket api。具體到linux上,我做過兩種實現,一種是在user space裡(這也是絕大多數使用者用的方法),另外一種是在kernel space裡,用kernel 提供的socket api做。不管是user space還是kernel space裡實現,主要是掌握socket api的使用,都是些套路,這裡就不詳細講了。udp的socket建立好後給rtp、rtcp用(rtp、rtcp各用乙個socket,各有乙個port號,一般rtp用的是偶數, rtcp的port號是相對應的rtp的port號加一)。

語音傳輸 音訊採集

我想做語音傳輸方面的設計,駐極式咪頭採集語音頻號經lm358放大,用的mcu是stm32,請問該電路輸出是否會超過ad的參考電壓3.3v?謝謝!lm358可以用3.3v吧,它的單電源電壓範圍3 32v 是想著打算c2輸出就接mcu的adc引腳,有什麼問題嗎?1.lm358給3.3v供電下,輸入輸出的...

語音識別 之 GMM HMM

gmm,gaussian mixture model,gmm,高斯混合模型。資料往往不知道是哪個高斯分布,這給gmm的引數初始化帶來困難。所有聚類演算法都可用於此,常用的有k means lbg等。模型自適應,由於各地口音,採集裝置,環境雜訊等因素的差異,已訓練過的gmm hmm很可能和新領域的測試...

如何減少IP語音網路傳輸時延

網路傳輸時延表示通過ip網路的單向時延。如果經過internet,很多因素可以影響資料流而且不受控制,這些因素包括語音資料報傳輸過程中必經路由器的流量狀況 每個路由器的處理能力 連線路由器線路的頻寬 網路進入點和輸出點之間路由器的數目等。isp可能會提供端到端的服務等級協議 sla 保證,但不管有沒...