《音视频问题汇总》
1.当视频在传输过程中丢帧,会出现什么现象?
1.丢I帧
现象:
- 整屏马赛克
- 画面冻结
- 黑屏
- 后续P/B全部无法解码
原因:
I帧是”参考基准“,丢了它,后面的帧全都没法解。
恢复时间:等待下一个I帧。
2.丢P帧
现象:
- 从丢帧点开始画面错误
- 马赛克/画面或拖影
- 错误会向后传播
原因:
后续P/B帧依赖这个P帧
恢复时间:等待下一个I帧或者出发IDR
3.丢B帧
现象:
- 轻微抖动
- 某一帧跳过
- 用户往往感受不到
原因:
B帧是”双向预测“,本身不被依赖。
因此B帧是”最安全可丢的“
实时系统里经常直接禁用B帧
备注:
丢I帧和P帧马赛克的区别:
丢I帧和P帧会有可能出现花屏或者马赛克。区分就是,丢I帧会立马全屏花,或者大块马赛克。而丢P帧,画面会从清晰--->局部马赛克,错误区域逐渐扩散,有一个从好到坏的过程。
2.为什么实时系统禁用B帧
结论:B帧丢了,对”画面内容“影响小,但是对”系统行为“影响大。而实时系统关心的是系统行为,而不是”画质评分“。
B帧丢了,对画面影响不大:
原因:
- B帧不被任何帧作为参考
- 后续I/P帧不依赖它
- 解码器可以直接跳过或用前后帧插值
所以:
- 不会引发错误扩散
- 不会破坏参考链条
B帧丢了,对系统行为影响很大:
1.B帧=强制引入”未来依赖“
B帧的定义:
I --- P --- B --- B --- P
↑ ↑
后果是:
- 编码端:必须先编码”未来P“
- 解码端:必须先接收”未来P“
- 显示端:必须等所有依赖到齐
这一步的后果: 强制缓冲 + 等待
所以会有一个问题,就算B帧丢了,虽然它不影响画面。但是它的这种机制,不会因B帧丢了,就没了。也就是就算B帧丢了,依旧会强制缓冲 + 等待,出现”B帧没用上,但是为了B帧付出的代价已经发生“
2.丢包场景下,B帧会放大”不确定性“
实时系统最怕的是不确定。
没B帧(IPPPP)
- 丢包---》立即知道哪一帧坏
- 行为:等下一个或快速刷新
有B帧(IBBP)
- 解码器需要先判断:是B帧丢了还是未来参考帧丢了?
- 时间线可能变成:等一下......再等一下.....确认不了.....跳帧
因此总论是B帧会让错误”判断路径“变复杂,增加抖动(jitter)
3.B帧会破坏”时间确定性“
B帧的帧重排以及非线性解码顺序,会导致帧到达 不等于 帧可显示。
总结:
B帧的收益 = 画质
B帧的代价 = 延时 + 抖动 + 复杂度
浙公网安备 33010602011771号