日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RTCP协议分析

發布時間:2024/4/11 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RTCP协议分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RTCP協議分析


目錄

  • RTCP功能
  • RTCP報?格式–報?類型
  • RTSP play同步
  • 時間戳映射關系
  • 媒體間同步?法(不同設備的同步)
  • RTCP同步

  • 1. RTCP功能

  • Real-time Transport Control Protocol或RTP Control Protocol或簡寫RTCP)是實時傳輸協議(RTP)的?個姐妹協議。RTCP由RFC 3550定義(取代作廢的RFC 1889)。
  • RTP 使??個 偶數 UDPport ;?RTCP 則使? RTP 的下?個 port,也就是?個奇數 port。
  • RTCP與RTP聯合?作,RTP實施實際數據的傳輸,RTCP則負責將控制包送?參與者。其主要功能是就RTP正在提供的服務質量做出反饋。
  • RTCP報?封裝在UDP中進?傳輸,作?如下:
  • 質量反饋
  • 傳輸層標識(CNAME)
  • 給參與者發送RTCP控制報?
  • 最?會話控制消息(可選)
  • RTCP端?號 = RTP端?號 + 1

  • 2. RTCP報?格式–報?類型

  • 在RTP的規范(RFC 3550)中,?共定義了5種RTCP報告?來報告當前控制信息:
  • Packet Type值分組類型描述
    200SR(Sender report)發送?報告
    201RR(Receiver report)接收?報告
    202SDES(Source description)源描述報告
    203BYE(Goodbye)離開會話
    204APP(Application-defined)應?定義
    206REMB(Receiver Estimated Maximum Bitrate)接收方估計的最大比特率
  • RTCP的5種報告:RR,SR,SDES,BYE,APP和REMB。他們使?共同的結構,但是在某些具體的地?有?些不同。
  • 以下是RTCP報?基本結構:
  • 其中?較重要的?個域及其意義如下:
  • 域名?度(bit)含義
    Version(V)2定義了RTP的版本,此協議定義的版本是2。
    Padding(P)1如果填充位被設置為1,則?個或多個附加的字節會加在包頭的最后,附加的最后?個字節放置附加的字節數。填充可能?于某些具有固定?度的加密算法,或者在底層數據單元中傳輸多個RTP包。
    Item count(IC)5有些RTCP分組類型包含多個條?(item),IC?來計算有多少個條?。因為IC只有5個?特,所以最多31個item。如果需要的item超過31個,那么應?實現必須包含多個RTCP分組。如果IC為0表示空的item列表。分組如果不需要item列表,那么可以把IC字段?于其他?的。
    Packettype(PT)8PT標識了分組中攜帶消息的類型。在RTP標準中定義了5種類型:RR,SR,SDES,BYE和APP
    Length(M)16分組?度,以4 bytes為單位,所以意味著RTCP分組必須是4字節對?。該?度不包含32 bites固定頭,也就是說length為0也是合理的,說明只有4字節的頭部(這種情況IC也是0)。
  • header size = 2 + 1 + 5 +8 + 16 = 4個字節
  • SR 包,總共28字節 = header 4字節 + 4字節*6
  • typedef struct _rtcp_header_t {uint32_t v:2; // versionuint32_t p:1; // paddinguint32_t rc:5; // reception report countuint32_t pt:8; // packet typeuint32_t length:16; /* pkt len in words, w/o this word */ } rtcp_header_t;

    1. RTCP報?格式-- SR報?格式

  • 為了補充接收者報告,RTP協議還規定了最近發送數據的參與者發送SR,該報告提供了發送的媒體的?些信息。主要?于接收端同步多媒體流,如語?和視頻流
  • 其中域及其意義如下:
  • 域名?度(bit)含義
    NTP timestamp6464 bites,?符號整數。指出了該報告發出時的時間。該時間戳的?32 bites以NTP格式表示,從1900年1?1?開始計數,以秒為單位。低32 bites表示秒后?的?數。如果需要轉化Unix時間到NTP時間,在Unix時間加上2,208,988,800即可。
    RTP timestamp/RTP時間戳以RTP媒體流的時鐘為單位,這個值通常不等于前?分組數據的RTP時間戳,因為時間會流逝。
    Sender’s packet count/表示這個同步源從這個會話開始到現在(發出RTCP報?時)發出的數據分組的個數。
    Sender’s octet count/表示同步源從這個會話開始到現在(發出RTCP報?時)發出的所有數據分組的字節數。如果發送者改變了SSRC,那么sender’s packet count和sender’s octet count被會被重置。
    typedef struct _rtcp_sr_t // sender report {uint32_t ssrc;uint32_t ntpmsw; // ntp timestamp MSW(in second)uint32_t ntplsw; // ntp timestamp LSW(in picosecond)uint32_t rtpts; // rtp timestampuint32_t spc; // sender packet countuint32_t soc; // sender octet count } rtcp_sr_t;

  • 如下圖我們可知:
  • video時間戳是 2794373590,采樣率是90000,相除得到具體時間:31048.595秒
  • audio時間戳是 4216229973,采樣率是48000,相除得到具體時間:87838.124秒
  • 我們發現,相隔0.1毫秒(29.790-29.789)發送出去的視頻、音頻包時間戳的差值特別大
  • rtp包打時間戳時,是有一個base_time的,base_time是隨機,比如視頻第一幀,應用層是0.04秒,換算成90khz的時基,則為3600+base_time(起點時間)
  • base_time是隨機生成的
  • 既然接收端,不能直接用收到的rtp的timestamp做音視頻同步,那應該怎么辦?
  • 接收端需要發送端把NTP時間發送過來
  • rtcp發送間隔的問題
  • 在發送第一個rtp包前要先發一個rtcp包(推流SR)
  • rtcp包占用rtp包的 %0.5的字節比例,rtcp_bytes>=28字節
  • 上次發送rtcp包和目前時間間隔超過5秒
  • 能否不發rtcp也能做音視頻同步
  • 每一路rtp通道的ts的起點時間不能隨機進行初始化,每個通道base_timestamp進行換算成秒單位值要一致。
  • 2. RTCP報?格式-- RR報?格式

  • RTCP通過RR可以很好地保證傳輸質量,每個接收數據的參與者都要發出RR。

  • 其中PT定義為201。接收者報告包含發送者的SSRC,跟隨在由RC指定的(0個或多個)報告塊之后。

  • 其中域及其意義如下:

  • 域名?度(bit)含義
    Reportee SSRC(接收者同步源)32占?32 bites,表示這個報告反饋給誰,也就是誰適合接收這個報告。
    Loss fraction(丟包率)8占?8 bites,定義為這個報告周期丟失的分組除以期待的分組數量。
    Cumulative number of packets lost(丟包數量)2424 bites帶符號整形,累計丟失的包的個數。計算?法是:期待接收的分組數?-實際接收的分組數?。所謂期待的分組數?是這樣定義的:最后?個分組的序列號-初始化分組序列號。
    Extended highest sequencenumber(擴展?位序列號)32占?32 bites,低16 bites取值為當前收到的RTP報?的序列號,?16 bites是擴展位,?于標識序列號周期的計數。
    Interarrival jitter(抖動評估)32占?32 bites,數據分組傳輸的統計評估值,?于評估?絡的抖動情況。表示?式和時間戳相同
    Last sender report (LSR)32占?32 bites,等于從reportee最近接收到SR分組的64 bits NTP 格式時間戳的中間32 bites,如果沒有接收到SR分組,那么LSR置0。
    Delay since last sender report (DLSR)32表示接收到最近的SR到發出這個報告的時延,單位是1/65,536秒。如果沒有接收到SR,DLSR置0。
    typedef struct _rtcp_rr_t // receiver report {uint32_t ssrc; } rtcp_rr_t; typedef struct _rtcp_rb_t // report block {uint32_t ssrc;uint32_t fraction:8; // fraction lostuint32_t cumulative:24; // cumulative number of packets lostuint32_t exthsn; // extended highest sequence number receiveduint32_t jitter; // interarrival jitteruint32_t lsr; // last SRuint32_t dlsr; // delay since last SR } rtcp_rb_t;
  • 丟包率計算:表示?式:分?固定為256,分?是loss fraction表示的整數。所以如果想要表示1/4的報?丟失,那么loss fraction=64。
  • 丟包數量計算:cumulative number of packets lost不是以每個周期為計算范圍,?是以整個會話為計算范圍。所以0x7fffff是cumulative number of packets lost的最?值,因為它是帶符號整數。
  • 擴展?位序列號:隨著會話時間增?,16?特?度的序列號可能會不夠?,當序列號?回到初始化序列號時,為了表示這個環繞,在?16?特記錄環繞的次數,也就是把序列號擴展了。
  • 3. RTSP play同步

  • RTP 包中的時間戳字段是說明數據包時間的同步信息,是數據能以正確的時間順序恢復的關鍵。時間戳的值給出了分組中數據的第?個字節的采樣時間。為了計算各個數據流的播放時間以及同步處理,僅有 RTP包中的時間戳信息是不夠的。
  • 在整個播放過程中,包括這樣?種時間:
  • RTP 包中的 rtptime
  • PLAY 請求的 Response 中的 rtp time 和 npt
  • 1. 時間戳映射關系

  • ?先介紹 PLAY 請求的 Response ?的兩個域:
  • 1. npt
  • npt 顧名思義 Normal PLay Time ,正常播放時間,指出了流相對與播放開始時的絕對位置。播放開始時的之間定義為 0.0s 。這個特殊的常量 now 被定義為現場事件的當前時刻。
  • " now "常數允許客戶端請求接收實時反饋?不是存儲或者延時的版本。因為對于這種情況??,既沒有絕對時間,也沒有 0 時間,所以需要該參數。
  • 2. rtptime
  • rtptime 是發送 PLAY 請求后將收到的第?個 RTP 包的時間戳值。
  • npt 和 rtptime 的區別在于 npt 是影?開始的相對時間,? rtptime 是會話開始的相對時間。因此在client 端,需要對這兩者進? map 處理。
  • 在 client 端計算播放時間戳的公式如下:
  • nptUs = (current_rtpTime - start_rtptime) / scale + srart_npt
  • 其中:
  • start_rtptime 與 start_npt 分別是 PLAY 請求的 Response 中的 rtptime 和 npt 。
  • current_rtpTime 是當前收到的 RTP 包頭中的 rtptime 。
  • scale 為 PLAY 請求的 Response 中的 scale 值。在正常播放的情況下為 1 ,快速播放時?于 1 ,當處于反向掃描模式時?于 -1
  • 2. 媒體間同步?法(不同設備的同步)

  • 上?的處理僅僅實現了媒體內的同步,在實現媒體間同步時,還需要進?其他的處理?作。這就需要?到RTCP 的 SR ( Sender Report )。在 SR 中包含?個< rtp , ntp >時間戳對,通過這個時間戳對可以將?頻和視頻準確的定位到?個絕對時間軸上。
  • < rtp , ntp >時間戳對的必要性在于不同流的 RTP 時間戳有不同的隨機偏移量,因此?法直接進?同步。
  • < rtp , ntp >中的 ntp 是?絡時間協議格式表示的絕對時間值。
  • < rtp , ntp >中的 RTP 與數據包中的 RTP 時間戳具有相同的單位和偏移量,但在?多數情況下此時間戳不等于任何臨近的 RTP 包中的時間戳。
  • 根據不同 stream 中的< rtp , ntp >時間戳對,可以將?個 stream 中的時間戳值映射為另?個stream 的時間戳值,從?實現媒體間的同步。

  • 4. RTCP同步

  • RTP?持傳送不同codec的steaming,不同codec的clock rate的也不?樣,不同的media之間需要依靠RTCP進?同步。這?簡單介紹?下他們的機制。

  • 在每個RTCP SR包中對應有?個RTP時間和?個NTP時間,它表達的意思很明確,那就是這個RTP時間對應的絕對時間, 不同media的RTP時間盡管不同,但可以通過NTP時間映射到同?個時間軸上,從?實現同步。

  • 如下圖所示,RTP session 1 send H264 使?90,000HZ,?RTP session 2 send G.711 使?8,000HZ

  • 也就是是說有3個時間軸,?頻時間軸,視頻時間軸,ntp時間軸。

  • ?視頻的時間軸的單位都是各?的采樣率,需要除以采樣率才能取得單位為秒的時間單位。

  • 有兩個rtcp流,分別為?/視頻的,其中有?個當前的?頻的timestamp和?個ntp的timestamp。

  • 這兩個值是在不同軸上的相同時間點,即?/視頻軸和ntp軸的重合點。使?這個值可以使?視頻軸同步。當拿到?頻NTP時間 (Tan),?頻RTP時間(Tar),視頻NTP時間(Tvn),視頻RTP時間(Tvr),就可以計算?視頻時間軸的差距D:

  • 假設使??頻為主軸,視頻向?頻對?。D = (Tar-Tvr) - (Tan - Tvn);新的視頻時間戳為Tar = Tar + D;

  • 在rtcp的sr單元中有32位的MSW和32位的LSW。MSW的單位為秒,?LSW的單位為232picoseconds。1?秒為1/10^12秒。LSW轉為us的公式為(LSW*10^12/2^32)/1000000;

  • 總結

    以上是生活随笔為你收集整理的RTCP协议分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。