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è)絕對值時(shí)間戳的 RTP 擴(kuò)展 abs_send_time,用于帶寬估計(jì)。

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

REMB 這個(gè) RTCP 反饋消息用于接收方通知發(fā)送方,它們在同一RTP會(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ā)送方對符合此規(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è)增量)。

相對于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 過度使用檢測器
  • rate-control 速率控制器

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

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

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

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) 是指測量噪聲,它是具有方差 [var_v = E{v(i)^2}]{.title-ref}
    的零均值高斯白測量噪聲

注:

  • 中心化(又叫零均值化):是指變量減去它的均值。其實(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) 過度使用檢測器 The over-use detector

每次接收到視頻幀 t_i 時(shí),過度使用檢測器都會(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容