Android IOS WebRTC 音視頻開發總結(八十七)-- WebRTC中丟包重傳NACK實現分析

Android IOS WebRTC 音視頻開發總結(八十七)-- WebRTC中丟包重傳NACK實現分析

文主要介紹WebRTC中丟包重傳NACK的實現,作者:weizhenwei ,文章最早發表在編風網,微信ID:befoio

?

支持原創,轉載必須注明出處,歡迎關注我的微信公眾號blacker(微信ID:blackerteam 或 webrtcorgcn)。

?

在WebRTC中,前向糾錯(FEC)和丟包重傳(NACK)是抵抗網絡錯誤的重要手段。FEC在發送端將數據包添加冗余糾錯碼,糾錯碼連同數據包一起發送到接收端;接收端根據糾錯碼對數據進行檢查和糾正。RFC5109[1]定義FEC數據包的格式。NACK則在接收端檢測到數據丟包后,發送NACK報文到發送端;發送端根據NACK報文中的序列號,在發送緩沖區找到對應的數據包,重新發送到接收端。NACK需要發送端發送緩沖區的支持,RFC5104[2]定義NACK數據包的格式。

?

本文在研究WebRTC源代碼的基礎上,以Video數據包的發送和接收為例,深入分析ANCK丟包重傳機制的實現。主要內容包括:SDP協商NACK,接收端丟包判定,NACK報文構造、發送、接收和解析,RTP數據包重傳。下面分別詳細論述之。

?

一、SDP協商NACK

?

NACK作為RTP層反饋參數,和Video Codec聯系在一起。WebRTC在初始化階段,創建PeerConnectionFactory對象,在該對象中創建MediaEngine,其中的VideoEngine為WebRtcVideoEngine2。該對象在構造時,會收集本端支持的所有Video Codec,NACK作為Codec的屬性被一起收集。在接下來的SDP協商過程中,NACK屬性被協商到Offer/Answer中,如圖1所示。

?

圖1 SDP協商NACK及作用于Video JitterBuffer

?

PeerConnection在CreateOffer時,收集本端的會話控制信息、音視頻Codec信息和網絡信息等內容。視頻Codec信息從WebRtcVideoEngine2中獲取。最后本端Offer形成SDP報文,經過PeerConnection對象發送到網絡。

?

接收端在收到Offer之后,首先調用SetRemoteDescription,根據本地配置信息向下創建VideoReceiveStream對象,本地NACK配置信息會最終到達VCMJitterBuffer。接著PeerConnection調用CreateAnswer,生成Answer;根據Offer中的Codec信息和本端支持的Codec信息,最終選定雙方都支持的Codec集合。最后用生成的Answer作為參數調用SetLocalDescription,根據Answer中的Video Codec信息向下重新創建VideoReceiveStream對象。NACK信息向下傳遞最終到達VCMJitterBuffer,在這里設置NACK相關參數。這些參數在接收RTP數據包過程中發揮作用,比如判斷丟包、是否發送NACK報文等。Answer發回發送端時,發送端調用SetRemoteDescription執行同樣的設置流程。

?

二、接收端丟包判定

?

Video接收端丟包判定在Worker線程中進行。RTP數據包到達接收端后,經過RTP模塊到達VCM模塊的JitterBuffer對象,最終調用VCMJitterBuffer的InsertPacket函數對數據包進行緩存和重排。

VCMJitterBuffer把丟失RTP數據包的序列號存儲在集合missing_seq_nums中。對于本次從RTP模塊到來的數據包,標記其序列號為seq1,而上次到達數據包的序列號為seq2。如果seq1 > seq2,則表示seq1順序到達,標記(seqnum2, seqnum1)區間內的數據包為丟失狀態,將其存儲到missing_seq_nums集合中。注意這里的丟失狀態是暫時的,如果下個數據包到達時有seq1 < seq2,則表示數據包亂序到達,則把missing_seq_nums中小于seq1的序列號都刪除掉。

?

在更新missing_seq_nums集合時,如果集合中存儲的序列號超過預設的容量,則通過調用RecycleFramesUntilKeyFrame()不斷丟包來減少集合中的序列號,直到集合中的序列號總數低于預設容量值。

?

三、NACK報文發送和接收

?

接收端的NACK報文構造和發送工作在ModuleProcessThread線程中周期性完成。過程如圖2所示。

?

圖2 NACK報文構造和發送

?

ModuleProcessThread線程周期性調用VideoReceiver::process函數,該函數通過VCMReceiver調用VCMJitterBuffer::GetNackList,從missing_seq_nums集合中得到過去一段時間內丟失RTP數據包的序列號。然后調用RtpStreamReceiver::ResendPackets函數。調用流程最終會到達RTCPSender::SendRTCP,發送類型為NACK的RTCP報文。

?

NACK報文是類型為205的RTCP 擴展反饋報文,如圖3所示:

?

圖3 NACK報文格式

?

其中PT = 205,FMT = 1,Packet identifier(PID)即為丟失RTP數據包的序列號,Bitmao of Lost Packets(BLP)指示從PID開始接下來16個RTP數據包的丟失情況。一個NACK報文可以攜帶多個RTP序列號,NACK接收端對這些序列號逐個處理。

NACK報文構造完成以后,發送到網絡層。NACK報文是RTCP報文的一種,因此其發送、接收和分析遵循RTCP報文處理的一般流程。這部分內容可參考文檔[3]。

?

四、RTP數據包重傳

?

接收端在接收和解析NACK報文后,通過回調機制處理各種類型的RTCP報文,對于NACK報文,會調用RTPSender重新發送RTP數據包,如圖4所示:

?

圖4 發送端數據包重傳

?

RTCPReceiver在解析RTCP之后,得到RTCP報文的描述結構,然后通過回調進行報文語義處理。NACK報文會被發送到RTPSender進行處理。RTPSender根據NACK報文中包含的序列號,到RTPPacketHistory緩存中查找對應的RTP數據包。如果找到,則把數據包發送到網絡。

?

至此,一個完整的NACK報文回路完成,丟失的RTP數據包會重新發送到接收端。

?

五、總結

?

本文深入分析了WebRTC內部關于丟包重傳(NACK)的實現細節,對NACK的SDP協商、丟包判定和重傳進行深入研究,為繼續學習掌握WebRTC的QoS機制奠定基礎。

?

參考文獻

?

[1] RFC5109 - RTP Payload Format for Generic Forward Error Correction.

[2] RFC5104 - RFC 5104 - Codec Control Messages in the RTP Audio-Visual ?Profile with Feedback (AVPF) .

[3] WebRTC中RTP/RTCP協議實現分-http://www.jianshu.com/p/c84be6f3ddf3.

?

posted on 2016-12-09 11:02 RTC.Blacker 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lingyunhu/p/rtc87.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259980.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259980.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何去除TD之間的空隙

table{border-collapse:collapse;}轉載于:https://www.cnblogs.com/passer1991/archive/2013/02/27/2935967.html

android切換到上個頁面,Android 返回上一個界面刷新數據

有些界面需要返回上一個界面刷刷新數據,再此做個記錄.首先startActivityForResult進行Actvity進行跳轉,這是跳轉前的界面.// 通過 startActivityForResult() 啟動 ActivityBIntent intent new Intent(getActivity(), NoticeActivity.class);startActivityForResult(intent, 1)…

composer設置代理_composer 設置代理

Docker registry V2部署私有Docker Registry 搭建 Insecure Registry 修改Registry server上的Docker daemon的配置,為DOCKER_OPTS增加–insecure ...css中的position&colon;relative和absolute 屬性語法: position : static | absolute | fixed | relative 取值: static :…

為網格布局圖片打造的超炫 CSS 加載動畫

今天&#xff0c;我想與大家分享一些專門為網格布局的圖像制作的很酷的 CSS 加載動畫效果。您可以把這些效果用在你的作品集&#xff0c;博客或任何你想要的網頁中。設置很簡單。我們使用了下面這些工具庫來實現這個效果&#xff1a; Normalize.css 來替代傳統的 CSS 復位&…

HTML多選框滾動條,《HTM單選.doc

《HTM單選1. 下面標記中&#xff0c;( )在標記的位置添加一個回車符。【選擇一項】A. B. C. D. 2. 要實現以下功能&#xff1a;在網頁中插入一個圖片joke11.gif,使用者通過單擊該圖片&#xff0c;連接到joke11.htm上去。下面的HTML代碼&#xff0c;( )是正確的。【選擇一項】A…

python時間處理模塊有哪些_Python模塊之時間處理

time 模塊>>> import time>>> dir(time)[__doc__, __name__, __package__, accept2dyear, altzone, asctime, clock, ctime, daylight, gmtime, localtime, mktime, sleep, strftime,strptime, struct_time, time, timezone, tzname]包含的變量:timezone -- …

wel

歡迎來到mathant.com 這個網站是什么 這個網站是我搭建在阿里云vps上的個人網站。目前的用途是充當個人博客和云存儲&#xff0c;當然它的功能不止如此。我會在以后的日子里完善他&#xff0c;希望他能變得更好。目前我在主機上只搭建了這個個人博客和一個ftp服務器。這個網站采…

php 安裝rabbitmq擴展無報錯版

需要安裝rabbitmq-c&#xff0c;rabbitmq-c是一個用于C語言的&#xff0c;與AMQP server進行交互的client庫。下載了v0.5.2版本(https://github.com/alanxz/rabbitmq-c/releases/download/v0.5.2/rabbitmq-c-0.5.2.tar.gztar xvf rabbitmq-c-0.5.2.tarcd rabbitmq-c-0.5.2autor…

ImageMagick 打水印支持透明度設置

convert 35021021120924162418300.jpg DD.png -geometry 60002048 -compose dissolve -define compose:args50 -composite -quality 95 35021021120924162418300_res.jpg轉載于:https://www.cnblogs.com/mfryf/archive/2013/03/04/2943209.html

spring mvc使用html頁面,使用Spring MVC的純HTML頁面應用程序

在Spring MVC所有的請求經過FrontController - DispatcherServlet的有你需要告訴Spring allowe JSP和HTML都在你的情況例dispatcher-servlet.xml:xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.springframework.org/schema/p"x…

python win+r時不成功_Win與R(不使用Anaconda的情況下)

配置R的路徑信息&#xff1a;Path&#xff1a;添加R.dll的路徑 如&#xff1a;E:\software\R\R-3.5.1\bin\x64R_HOME:R的安裝路徑 如&#xff1a;E:\software\R\R-3.5.1\binR_USER:R的使用路徑 如&#xff1a;E:\software\R\R-3.5.1\bin\x64pip install rpy2在win下安裝失敗&am…

Devexpress VCL Build v2014 vol 14.1.4 發布

雖然這次沒加什么新東西&#xff0c;但是及時更新支持xe7&#xff0c;還算可以。 Whats New in 14.1.4 (VCL Product Line) New Major Features in 14.1 Whats New in VCL Products 14.1 Feature Highlights To learn about feature highlights in this version, please refer …

一個YII社區學習網站

2019獨角獸企業重金招聘Python工程師標準>>> https://getyii.com/ 轉載于:https://my.oschina.net/u/2552765/blog/803311

一站式 Java Web 框架 firefly-2.0_07發布

Firefly是一個高性能一站式Web框架。 涵蓋了web開發的主要技術棧。 包含Template engine、IOC、MVC framework、HTTP Server、Common tools、Log、Json parser等模塊。 firefly-2.0_07修復了模版壓縮對javascript單行注釋的影響&#xff0c;并新增了自定義錯誤頁面功能。 更新日…

計算機控制學什么,計算機控制技術專業介紹

專業前景需要早了解&#xff0c;計算機控制技術專業學什么&#xff0c;好不好找工作等是學子和家長朋友們十分關心的問題。以下是個人簡歷網整理的計算機控制技術專業介紹、主要課程、培養目標、就業前景&#xff0c;供大家參考。1、計算機控制技術專業簡介計算機控制技術專業&…

【Python】Python 批量轉換PDF到Excel

PDF是面向展示和打印使用的&#xff0c;并未考慮編輯使用&#xff0c;所以缺少了很多編輯屬性且非常難修改PDF里面的數據。當您需要分析或修改PDF文檔數據時&#xff0c;可以將PDF保存為Excel工作簿&#xff0c;實現輕松編輯數據的需求。PDF轉Excel&#xff0c;技術關鍵就是提取…

js showModalDialog參數的使用詳解(轉)

js showModalDialog參數的使用詳解_javascript技巧_腳本之家 http://www.jb51.net/article/45281.htm 本篇文章主要是對js中showModalDialog參數的使用進行了詳細的分析介紹&#xff0c;需要的朋友可以過來參考下&#xff0c;希望對大家有所幫助 基本介紹&#xff1a; showModa…

ad19生成gerber文件_在“AD19”中怎樣將PCB文件轉換為GERBER

四川自貢是歷史悠久的老工業城市&#xff0c;上世紀八、九十年代&#xff0c;自貢的鍋爐、泵業、閥門全國聞名&#xff0c;在近年發展中&#xff0c;電子產業也取得可喜的成績。Altium Designer在設計電子產品中是應用較多的工具&#xff0c;它的版本更新很快&#xff0c;從最早…

讓windows 2003啟動后直接進入桌面

windows 2003啟動后進入桌面需要解決的幾個問題 1、如何去除掉 ctrlaltdel的提示界面 2、如何設置自動登錄的用戶名密碼 3、在異常啟動時會出現關閉事件跟蹤程序 也會導致不能直接進入桌面 往往直接進入桌面是卡在了這個環節 一、去掉ctrlaltdel的提示界面 1、“開始-->運行…

【C】——C項目中的菜單功能(源碼)

1 #include<stdio.h>2 #include<stdlib.h>3 4 int menu() //選擇菜單5 {6 int result;7 printf("**********請選擇&#xff1a;***********\n");8 printf("**********1.插入&#xff1a;***********\n");9 printf(&quo…