WebRTC 擁塞控制之 REMB - 接收方帶寬估計(jì)

1. What - REMB 是什么冰木?

Receiver Estimated Max Bitrate (REMB) 是一種RTCP 反饋消息,作為接收方勉躺,告訴發(fā)送方它可以接收的帶寬是多少佩捞,它是一種簡單的擁塞控制方法钉跷,接收不了就發(fā)發(fā)慢點(diǎn)。

根據(jù) RFC4585 中的定義,它屬于 PSFB(Payload Specific FeedBack) 消息赠摇,其 payload type 為 206, fmtType 為15.

它同時(shí)也定義了一個(gè)絕對(duì)值時(shí)間戳的 RTP 擴(kuò)展 abs_send_time,用于帶寬估計(jì)藕帜。

  1. RTP 擴(kuò)展 abs_send_time
  2. RTCP 擴(kuò)展 REMB

REMB 這個(gè) RTCP 反饋消息用于接收方通知發(fā)送方烫罩,它們?cè)谕籖TP會(huì)話上有多個(gè)媒體流在傳輸, 所通知的內(nèi)容就是該RTP會(huì)話的接收方路徑上的總的可用帶寬的估計(jì)值 (比特率)。

在用于 REMB 反饋消息的公共數(shù)據(jù)包頭中(如[RFC4585]的6.1節(jié)所定義)洽故,“數(shù)據(jù)包發(fā)送者的SSRC” 字段指示通知的來源贝攒。 不使用“媒體源的SSRC”,并且應(yīng)將其設(shè)置為0时甚。在其他RFC中也使用零值隘弊。

媒體發(fā)送方對(duì)符合此規(guī)范的REMB消息的接收將導(dǎo)致該消息在RTP會(huì)話上發(fā)送的總比特率等于或低于此消息中的比特率。 新的比特率限制應(yīng)盡快應(yīng)用荒适。 發(fā)送者可以根據(jù)自己的限制和估計(jì)自由應(yīng)用其他帶寬限制长捧。

2. Why 為什么要有 REMB?

發(fā)送者不知道接收方的帶寬情況吻贿,它需要有一個(gè)機(jī)制由接收方告訴它有多少帶寬可供傳輸, 這樣發(fā)送方可以根據(jù)這個(gè)估計(jì)的帶寬來調(diào)整分辨率(90p, 180p, 360p, 720p等)和幀率(每秒24, 30, 40, 60幀等)

3. How 怎么實(shí)現(xiàn) REMB串结?

3.1. SDP 中包含如下屬性

a=rtcp-fb:<payload type> goog-remb
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time

3.2. 發(fā)送 RTP 包時(shí)帶下 abs_send_time 頭

這是一個(gè) one-byte 擴(kuò)展,3 個(gè)字節(jié)的數(shù)據(jù)舅列,每個(gè)包額外攜帶 4 個(gè)字節(jié)肌割。還有與其他擴(kuò)展頭共享的 2 字節(jié)魔術(shù)字節(jié) 0xBEDE, 2 字節(jié)擴(kuò)展頭個(gè)數(shù)

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |       0xBE    |    0xDE       |           length=n            |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  ID   | L=2   |     abs_send_time                             | 
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

abs_send_time 是一個(gè)以秒為單位的時(shí)間戳帐要,總共 3 個(gè)字節(jié)(24 bit) , 格式為 6.18 (小數(shù)位固定為18位), 每 64s 會(huì)溢出環(huán)繞把敞,分辨率為 3.8us (在 1Gbps 的網(wǎng)卡上每 477 個(gè)字節(jié)就會(huì)產(chǎn)生一個(gè)增量)。

相對(duì)于64位的 NTP timestamps榨惠,以32位來表示秒數(shù)奋早,32位來表示秒的小數(shù)部分,轉(zhuǎn)換公式為

abs_send_time_24 = (ntp_timestamp_64 >> 14) & 0x00ffffff

注:RTP 包在要發(fā)出到網(wǎng)卡時(shí)標(biāo)記這個(gè)時(shí)間戳赠橙,中繼的可能要修改媒體流的節(jié)點(diǎn)應(yīng)該刪除這個(gè)擴(kuò)展耽装,或者設(shè)置自己的發(fā)出時(shí)間戳。

3.3. 需要限制帶寬時(shí)發(fā)送 REMB RTCP 消息

RTCP 消息格式如下:

  • 首先看它的 Payload Type期揪,206 意謂 PSFB 即荷載特定的反饋 Payload-specific Feedback, 參見 http://www.rfcreader.com/#rfc5104 Codec Control Feedback 編碼層反饋
  • 其次看它的 FMT type, 15 意謂應(yīng)用層反饋 Application layer feedback
  • 然后看它的 Unique Identifier 唯一標(biāo)識(shí)符 “REMB”
  • 最后看相關(guān)的 SSRC number, 即RTP流個(gè)數(shù)掉奄,計(jì)算估計(jì)出帶寬為 mantissa * 2 ^ exp

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |V=2|P| FMT=15  |   PT=206      |             length            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                  SSRC of packet sender                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                  SSRC of media source                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Unique identifier 'R' 'E' 'M' 'B'                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Num SSRC     | BR Exp    |  BR Mantissa                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   SSRC feedback                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  ...                                                          |

字段含義

  • 版本 version (V): (2 bits): RTP 當(dāng)前的版本為 2.

  • 是否填充 padding (P) (1 bit): 這里不用填充,總是為 0.

  • 反饋消息類型 Feedback message type (FMT) (5 bits): 因?yàn)檫@是一個(gè)應(yīng)用層的反饋消息凤薛,所以總是填 15

  • 荷載類型: Payload type (PT) (8 bits): 因?yàn)檫@是一個(gè) Payload-specific FB message姓建, 所以總是填 206

  • 長度 Length (16 bits): 這個(gè)包的總長度(32bit)-1, 包括包頭和填充值
  • 包發(fā)送者的同步源: SSRC of packet sender (32 bits)

  • 媒體源的 SSRC 值: SSRC of media source (32 bits): 這里總是填 0

  • 唯一的標(biāo)識(shí)符 Unique identifier (32 bits): 總是為 'R' 'E' 'M' 'B' (4 ASCII 字符).

  • 同步源的個(gè)數(shù) Num SSRC (8 bits)

  • 帶寬的指數(shù) BR Exp (6 bits): The exponential scaling of the mantissa for the maximum total media bit rate value, ignoring all packet overhead. The value is an unsigned integer [0..63], as in RFC 5104 section 4.2.2.1.

  • 帶寬的底數(shù) BR Mantissa (18 bits): The mantissa of the maximum total media bit rate (ignoring all packet overhead) that the sender of the REMB estimates. The BR is the estimate of the traveled path for the SSRCs reported in this message. The value is an unsigned integer in number of bits per second.

  • 所反饋的SSRC 一個(gè)或多個(gè)值 SSRC feedback (32 bits) Consists of one or more SSRC entries which this feedback message applies to.

最終計(jì)算出來的帶寬估計(jì)為

receiver-bit-rate = mantissa * 2^exp

3.4 如何估算出帶寬

這個(gè)帶寬是怎么估計(jì)出來的缤苫,在接收方主要就根據(jù)延遲 delay 通過一些算法來估算

基于延遲的控制的算法主要分為四個(gè)部分:

  • pre-filtering 預(yù)先過濾
  • arrival-time filter 到達(dá)時(shí)間過濾器
  • over-use detector 過度使用檢測(cè)器
  • rate-control 速率控制器

到達(dá)時(shí)間模型

兩個(gè)包發(fā)送的間隔 [T(i) - T(i-1)] 和接收的間隔 t(i) - t(i-1)]在理想情況下是相同的速兔,實(shí)際上會(huì)有不同.也就是說包的到達(dá)時(shí)間并未保持穩(wěn)定的速度。在計(jì)算的時(shí)候可以用以幀分組活玲,對(duì)兩個(gè)組的到達(dá)時(shí)間進(jìn)行計(jì)算涣狗。

  • 發(fā)送時(shí)間間隔與到達(dá)時(shí)間間隔之間的延時(shí)的觀測(cè)公式谍婉,稱為單向延遲變化

d(i) = t(i) - t(i-1) - (T(i) - T(i-1))

還可將數(shù)據(jù)包組之間的延遲變化建模為

d(i) = w(i)

這里的 w(i) 是一個(gè)隨機(jī)過程 W 的采樣,它是一個(gè)連接容量屑柔,當(dāng)前交叉流量和當(dāng)前比特率的函數(shù)屡萤,我們將 W 建模為一個(gè)白高斯過程。如果我們過度使用了傳輸通道掸宛,則 w(i) 的平均值就會(huì)增大死陆,如果網(wǎng)絡(luò)路徑中的擁塞隊(duì)列已經(jīng)清空了,這個(gè) w(i) 的平均值就會(huì)減小唧瘾,否則 w(i) 的平均值為零措译。

由此, 我們可以將w(i) 分解為它的平均值加上一個(gè)偏差

d(i) = m(i) + v(i)

v(i) 表示網(wǎng)絡(luò)抖動(dòng)和其他沒有被這個(gè)模型捕捉到的延遲

1) Pre-filtering 預(yù)先過濾

預(yù)濾波旨在處理由信道中斷引起的延遲瞬變。在中斷期間饰序,由于與擁塞無關(guān)的原因领虹,在網(wǎng)絡(luò)緩沖區(qū)中排隊(duì)的數(shù)據(jù)包會(huì)在中斷結(jié)束時(shí)突發(fā)傳送求豫。預(yù)過濾將突發(fā)到達(dá)的數(shù)據(jù)包組合并在一起塌衰。

如果滿足以下兩個(gè)條件之一,則數(shù)據(jù)包將合并到同一組中:

    1. 在一個(gè) burst_time 間隔內(nèi)發(fā)送的數(shù)據(jù)包序列構(gòu)成一個(gè)組蝠嘉。
    1. 具有小于 burst_time 的到達(dá)間隔時(shí)間和小于0 的組間延遲變化d(i)
      的數(shù)據(jù)包被認(rèn)為是當(dāng)前數(shù)據(jù)包組的一部分最疆。

這個(gè) burst_time 的默認(rèn)值為 5 ms

RTP 包中的 timestamp 是與媒體采集和回放相關(guān)的時(shí)間戳,并不是包發(fā)送的時(shí)間蚤告,發(fā)送時(shí)間通過上面提到的 RTP 包頭的擴(kuò)展 abs_send_time 發(fā)到接收方去努酸。

2) 到達(dá)時(shí)間濾波器 arrival time filter

根據(jù)到達(dá)時(shí)間模型,我們可以通過 Kalman Filter 或者 Trendline Filter
來求得網(wǎng)絡(luò)排隊(duì)延遲 [m(i)]{.title-ref}

m(i+1) = m(i) + u(i)
q(i) = E{u(i)^2}
d(i) = m(i) + v(i)

其中

  • q(i) 為狀態(tài)噪聲 u(i) 方差的期望杜恰,推薦值是 10^-3
  • u(i) 是指狀態(tài)噪聲,
    把它建模為具有零均值和方差的高斯統(tǒng)計(jì)模擬的平穩(wěn)過程
  • v(i) 是指測(cè)量噪聲获诈,它是具有方差 [var_v = E{v(i)^2}]{.title-ref}
    的零均值高斯白測(cè)量噪聲

注:

  • 中心化(又叫零均值化):是指變量減去它的均值。其實(shí)就是一個(gè)平移的過程心褐,平移后所有數(shù)據(jù)的中心是(0舔涎,0)
  • 標(biāo)準(zhǔn)化(又叫歸一化): 是指數(shù)值減去均值,再除以標(biāo)準(zhǔn)差檬寂。

卡爾曼濾波器遞歸地更新這個(gè)估計(jì)值 m_hat(i)

z(i) = d(i) - m_hat(i-1)

m_hat(i) = m_hat(i-1) + z(i) * k(i)

                   e(i-1) + q(i)
k(i) = ----------------------------------------
           var_v_hat(i) + (e(i-1) + q(i))

e(i) = (1 - k(i)) * (e(i-1) + q(i))

var_v_hat(i) = max(alpha * var_v_hat(i-1) + (1-alpha) * z(i)^2, 1)

alpha = (1-chi)^(30/(1000 * f_max))

3) 過度使用檢測(cè)器 The over-use detector

每次接收到視頻幀 t_i 時(shí)终抽,過度使用檢測(cè)器都會(huì)產(chǎn)生一個(gè)信號(hào)
s,該信號(hào)基于排隊(duì)延遲 m(t_i) 和閾值 \gamma 來驅(qū)動(dòng) FSM
(下面的有限狀態(tài)機(jī)) 的狀態(tài) \sigma桶至,算法 1 詳細(xì)顯示了 s 是如何生成的 :

當(dāng) m(t_i) > \gamma 時(shí),算法通過增加幀間隔時(shí)間 \Delta T 的變量
t_{OU} 來跟蹤在這種情況下花費(fèi)的時(shí)間匾旭。 當(dāng) t_{OU} 達(dá)到
\bar{t}_{OU}=100msm(t_i) > m(t_{i-1})` 時(shí)镣屹,產(chǎn)生過度使用信號(hào)。

另一方面价涝,如果 m(t_i) 減小到 \gamma 以下女蜈,則產(chǎn)生未充分利用信號(hào),而當(dāng)
-\gamma \leq m(t_i) \leq \gamma 時(shí)觸發(fā)正常信號(hào)。

4) 速率控制器 Rate controller

發(fā)送速率控制器分為兩部分:

  1. 根據(jù)延遲估計(jì)的帶寬來控制發(fā)送速率伪窖, 這個(gè)放在接收方 (WebRTC 在后續(xù)版本中也改到了發(fā)送方)

通過下面的公式來計(jì)算 A_r

A_{r}(t_{i})=\cases{\eta A_{r}(t_{i-1}) & ${\rm Increase}$\cr \alpha R(t_{i}) & ${\rm Decrease}$\cr A(t_{i-1}) & ${\rm Hold}$}

  1. 根據(jù)丟失估計(jì)的帶寬來控制發(fā)送速率逸寓, 這個(gè)放在發(fā)送方
  • 狀態(tài)轉(zhuǎn)換表 ( 空白處表示保持狀態(tài))
+----+--------+-----------+------------+--------+
|     \ State |   Hold    |  Increase  |Decrease|
|      \      |           |            |        |
| Signal\     |           |            |        |
+--------+----+-----------+------------+--------+
|  Over-use   | Decrease  |  Decrease  |        |
+-------------+-----------+------------+--------+
|  Normal     | Increase  |            |  Hold  |
+-------------+-----------+------------+--------+
|  Under-use  |           |   Hold     |  Hold  |
+-------------+-----------+------------+--------+

相關(guān)參數(shù)的默認(rèn)配置

+-----------------+-----------------------------------+-------------+
| Parameter       | Description                       | RECOMMENDED |
|                 |                                   | Value       |
+-----------------+-----------------------------------+-------------+
| burst_time      | Time limit in milliseconds        | 5 ms        |
|                 | between packet bursts which       |             |
|                 | identifies a group                |             |
| q               | State noise covariance matrix     | q = 10^-3   |
| e(0)            | Initial value of the  system      | e(0) = 0.1  |
|                 | error covariance                  |             |
| chi             | Coefficient used  for the         | [0.1,       |
|                 | measured noise variance           | 0.001]      |
| del_var_th(0)   | Initial value for the adaptive    | 12.5 ms     |
|                 | threshold                         |             |
| overuse_time_th | Time required to trigger an       | 10 ms       |
|                 | overuse signal                    |             |
| K_u             | Coefficient for the adaptive      | 0.01        |
|                 | threshold                         |             |
| K_d             | Coefficient for the adaptive      | 0.00018     |
|                 | threshold                         |             |
| T               | Time window for measuring the     | [0.5, 1] s  |
|                 | received bitrate                  |             |
| beta            | Decrease rate factor              | 0.85        |
+-----------------+-----------------------------------+-------------+

       Table 1: RECOMMENDED values for delay based controller

4. Example

REMB 的實(shí)現(xiàn)可以參考 webrtc 的源碼:

帶寬的計(jì)算代碼為

uint8_t exponenta = payload[13] >> 2;
uint64_t mantissa = (static_cast<uint32_t>(payload[13] & 0x03) << 16) |
                      ByteReader<uint16_t>::ReadBigEndian(&payload[14]);
bitrate_bps_ = (mantissa << exponenta);

5. Conclusion

網(wǎng)絡(luò)狀況變化多端,時(shí)好時(shí)壞覆山,在發(fā)送音視頻不能由著性子隨便發(fā)竹伸,需要根據(jù)接收者反饋的 RTCP 消息中包含的最大帶寬估計(jì)調(diào)整自己的發(fā)送采樣率/分辨率/幀率,也就是調(diào)整發(fā)送的碼率簇宽,以滿足基本的通信需求勋篓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市魏割,隨后出現(xiàn)的幾起案子譬嚣,更是在濱河造成了極大的恐慌,老刑警劉巖钞它,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拜银,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡遭垛,警方通過查閱死者的電腦和手機(jī)尼桶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耻卡,“玉大人疯汁,你說我怎么就攤上這事÷牙遥” “怎么了幌蚊?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溃卡。 經(jīng)常有香客問我溢豆,道長,這世上最難降的妖魔是什么瘸羡? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任漩仙,我火速辦了婚禮,結(jié)果婚禮上犹赖,老公的妹妹穿的比我還像新娘队他。我一直安慰自己,他們只是感情好峻村,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布麸折。 她就那樣靜靜地躺著,像睡著了一般粘昨。 火紅的嫁衣襯著肌膚如雪垢啼。 梳的紋絲不亂的頭發(fā)上窜锯,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音芭析,去河邊找鬼锚扎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛馁启,可吹牛的內(nèi)容都是我干的驾孔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼进统,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼助币!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起螟碎,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤眉菱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掉分,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俭缓,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年酥郭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了华坦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡不从,死狀恐怖惜姐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情椿息,我是刑警寧澤歹袁,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站寝优,受9級(jí)特大地震影響条舔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乏矾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一孟抗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钻心,春花似錦凄硼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亿胸,卻和暖如春坯钦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侈玄。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工婉刀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人序仙。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓突颊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親潘悼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子律秃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355