实时视频应用中的FEC和网络自适应

网络自适应(拥塞控制)是指根据网络的状况实时动态的去调整码率,什么时候调整主要是根据网络中的时延和丢包的情况来,当网络状况出现恶化的情况时,码率向下调,和FEC没什么关系,当要上调的时候,如果单纯依靠视频数据,很难做到精确的码率控制,不同质量的Video间,码率间隔可能会非常大,如果直接调整,会对网络造成比较大的冲击,导致拥塞。

工作流程

“Congestion Control Using FEC for Conversational Media”对用FEC探测带宽有比较详细的说明。

内部状态

FEC Probing过程中有四个状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
           ^  .........
| / \ /
t |/ \ /
h | +===+===+=\=+ /
r | | F | | \| +===+ +==/+
o +===+---+ | \...........|.F.|...|./F|===+
u | | | | | +===+===+---+===+---+---+
g | | | | | | F | | | | | |

h | | | | |===+---+ | | | | |
p | | | | | | | | | | | |
u | | | | | | | | | | | |
t | | | | | | | | | | | |
| s | p | i | s | d | p | i | p | s | p | i |
+---+---+---+---+---+---+---+---+---+---+---+-->
time

Key:
+===+ Media with minimal FEC for error protection

+===+
| F | Media with FEC for probing and error protection
+---+

....
/ \ Available capacity

d,s,p,i: are the states: Decrease, Steady, Probe, Increase

```
STEADY: 这是一个过渡状态,在这个状态中评估带宽保持不变

PROBE: 拥塞缓解时,通过增加FEC码率,但保持media的码率不变。

DECREASE: 出现了拥塞,减少总的码率,但加上能保证错误恢复的最小FEC码率。

INCREASE: 当探测到足够的带宽后,可以将部分FEC的码率给media码率使用(增加media码率,减少FEC码率),但也要保证错误恢复的最小FEC码率。如果出现丢包了,当这些丢包可以通过FEC恢复,那么可以维持media码率,减少FEC码率。但如果FEC都不能恢复,那么就应该当作拥塞处理,转入REDUCE状态。

### 模块关系

1. 网络自适应模块(Rate Control Module)根据RTCP反馈信息评估当前网络的带宽
2. 如果评估带宽比之前的高,那么拥塞控制模块会通知FEC模块去探测带宽
3. FEC模块根据自己内部的状态决定是否需要去探测,并通知Rate Control模块最终留给Media的可用带宽。
4. FEC模块根据修复之后的丢包率来更新自己的内部状态。

+ - - - - - - - - - - - - - - - - - - - - - - - -+
| +--------------------------------------------+ |
  |            Media Encoder/Decoder           |
| +--------------------------------------------+ |
            |                           |
| +- -- -- -- -- -- -- -+        +- -- -- -- -+  |
  |    Rate Control     |        |     RTP    |
| |       Module        |        |            |  |
  +- -- -- -- -- -- -- -+        +- -- -- -- -+
|   ^        |                          |        |
    |        |                          | Source
|   | R      +--------------------+     |  RTP   |
    | T                           |     |
|   | C                           |     |        |
    | P                           |     |
|   |     +----------+     +----------------+    |
    | F   | FEC Code |<--->|   FEC Module   |
|   | B   +----------+     +----------------+    |
    |                        |        |  |
|   |------------------------+        |  |       |
    |        RTCP FB           Repair |  | Source
|   |                            RTP  |  |   RTP |
    |                                 |  |
| +--------------------------------------------+ |
  |           RTP Processing  Layer            |
| |                  (Queue)                   | |
  +--------------------------------------------+
|                        |                       |
  +--------------------------------------------+
| |             Transport Layer (UDP)          | |
  +--------------------------------------------+
|                        |                       |
  +--------------------------------------------+
| |                     IP                     | |
  +--------------------------------------------+
|                                                |
| Endpoint                                       |
+ - - - - - - - - - - - - - - -  - - - - - - - - +

```

这里面有几个关键的问题:

  1. Video和FEC的带宽如何分配,FEC加的多了,能抗的丢包也就多,但是Video的质量会有一定影响。
  2. 和网络自适应的协调,丢包达到一定阈值网络自适应才会下调评估带宽,FEC则必须能修复这种情况下的丢包。
  3. 在有多路Video流的情况下,怎么加FEC,哪些流加,加多少。
  4. 如何保证这种情况下Audio的质量。m