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ì)藕帜。
- RTP 擴(kuò)展 abs_send_time
- 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è)公式谍婉,稱為單向延遲變化
還可將數(shù)據(jù)包組之間的延遲變化建模為
這里的 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è)偏差
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ù)包將合并到同一組中:
- 在一個(gè) burst_time 間隔內(nèi)發(fā)送的數(shù)據(jù)包序列構(gòu)成一個(gè)組蝠嘉。
- 具有小于 burst_time 的到達(dá)間隔時(shí)間和小于0 的組間延遲變化d(i)
的數(shù)據(jù)包被認(rèn)為是當(dāng)前數(shù)據(jù)包組的一部分最疆。
- 具有小于 burst_time 的到達(dá)間隔時(shí)間和小于0 的組間延遲變化d(i)
這個(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}
其中
- 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
每次接收到視頻幀 時(shí)终抽,過度使用檢測(cè)器都會(huì)產(chǎn)生一個(gè)信號(hào)
s,該信號(hào)基于排隊(duì)延遲 和閾值
來驅(qū)動(dòng) FSM
(下面的有限狀態(tài)機(jī)) 的狀態(tài) 桶至,算法 1 詳細(xì)顯示了 s 是如何生成的 :
當(dāng) 時(shí),算法通過增加幀間隔時(shí)間
的變量
來跟蹤在這種情況下花費(fèi)的時(shí)間匾旭。 當(dāng)
達(dá)到
且
` 時(shí)镣屹,產(chǎn)生過度使用信號(hào)。
另一方面价涝,如果 減小到
以下女蜈,則產(chǎn)生未充分利用信號(hào),而當(dāng)
時(shí)觸發(fā)正常信號(hào)。
4) 速率控制器 Rate controller
發(fā)送速率控制器分為兩部分:
- 根據(jù)延遲估計(jì)的帶寬來控制發(fā)送速率伪窖, 這個(gè)放在接收方 (WebRTC 在后續(xù)版本中也改到了發(fā)送方)
通過下面的公式來計(jì)算
- 根據(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ā)送的碼率簇宽,以滿足基本的通信需求勋篓。