| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 超低延时超低卡顿率视频传输的秘密 -> 正文阅读 |
|
[系统运维]超低延时超低卡顿率视频传输的秘密 |
微信后台如何应对像跨年,特殊时刻(比如2022年2月22日22时22分22秒)这样的朋友圈突发流量,可做如下策略(只是比如):
在不影响P99用户体验的前提下,提供有损服务,保证核心可用性,这就是柔性。 受TCP的影响,普遍认可的传输即确保传输,而TCP也确实能保证最低可用性,这便让它更加被认为“绝对正确”,即便UDP-based协议也常常看到TCP的影子,重传,保序,诸如此类。 TCP的普遍性使它几乎被认为是唯一的标准,故谈到传输优化,大多数人都会关联TCP优化(together with QUIC优化)那一套,实际的传输场景(比如,传输的内容)却很少被关注。 本文的话题有关音视频传输优化,优化目标:
优化要点不外乎:
本文不含技术细节,更不会涉及API调用,但理解这些基本思路,胜过10倍的技术细节。 稍详细点说。 如TCP,QUIC类通用传输协议不适合传输音视频,更无助于其传输优化,极致体验需在音视频流中自行斟酌传输细节。 计算机科学有一铁律强调分层解耦解决一切,而上述结论却将分层逻辑进行杂糅,虽与铁律相违背,但有理由。 分层铁律外,计算机科学还有一个约束强调一切皆trade-off。有此约束,分层协议的代价就是层次之间细节互不沟通,只通过接口交流PDU,而极致优化必依赖细节。 极致优化诉诸差异,而非共性。通用不为性能,性能也不鸟通用。 通用的另一个代价是不易定制。诸如TCP类协议均集成在系统,系统并不易改,甚至无权限修改,若需修改手机端TCP,便无能为力。优化若收敛于应用本身,则无障碍。 企图基于TCP,QUIC等通用协议做音视频传输优化终究徒劳,结合业务细节做定制才是正道。 类似量体高定西装之于产线均码西装,后者换一个人都穿不合身,它只属个人,这便是它的昂贵。 值得期待的是,若音视频传输统一标准,则此基础上通用的极致优化便成可能,新的差异方可发芽,一个螺旋上升的韵脚支撑着这押韵的故事。
音视频传输,必在流畅度,清晰度,通用性之间做trade-off。事情非往复,但押韵,重画之前的一幅图: 若非要图示buffer,流畅度和清晰度两个圆之间交集的面积即为buffer的大小,而buffer大小直接表征延时: 类似水库,深浅宽窄各处蜿蜒不同的河道要保证出水率恒定,需建一座水库充作buffer。传统音视频传输场景下,buffer意义类似水库:
但调转视角,何必引入大buffer只为坚持速率,损失掉速率保持流畅于体验更好,若不再重传,延时大降低,所需buffer将大减少,若在小速率下只保障关键帧传输,效果亦然,此即为柔性策略,属无级变速。 再和坑洼颠簸的路面上盖厚土类比,柔性相当于不动路面而改造车辆,经理座驾加装避震,工人只能在班车里忍着。 前面一个图,将代表流畅度和清晰度的两个圆交集面积看作buffer大小,该视角下,buffer越大,为了既流畅又清晰的延时代价就越大,这显然是既要也要还要模式,但在柔性视角下,则是舍鱼而取熊掌模式了,解释就有了大不同:
小buffer只为感知网络变化,为无级变速提供依据,由柔性替代重传和gap,同时小buffer平滑微弱的拥塞。2~3个RTT的buffer足以感知网络变化,另一方面,所谓微弱平滑拥塞的背后是对互联网公平收敛的信任。
宁愿相信公平收敛原则被普遍遵守,拥塞总是不下心而为之转瞬即逝,受益者将是大家:
这就闭环了,但它背后的信任很脆弱,任何激进行为都能破坏平衡:
后果就是集体堕落,所以,不要透支信任。
再详细点说。 信息交互之根本即消除不确定性,亦是信息论的核心。 人体器官可在很宽的分辨率范围识别信息,若信息受体如此类介质,便无需精确复制比特。音视频传输正在此列,这便存在一个关键,在必要时柔性降级清晰度,确保流畅。 TCP,QUIC类仅适用精确复制,如文件传输诉诸文件系统,便要求精确复制,对于音视频流诉诸器官,柔性传输便有更多弹性。
遗憾的是,包括TCP,QUIC在内的通用协议,无法做柔性。 通用协议不理解传输细节,如TCP只是死磕确保传输每一个字节,即便允许不可靠,也不晓得丢弃哪一个包。若音视频协议自行做传输控制,就是另一局面。 例如根据网络实时质量决定如何柔性降级,牺牲清晰度保障流畅:
音视频流知道1,5,8关键,而2,3,4,7非关键,非关键序号可牺牲,亦可将其占位作关键序号的冗余,增加关键序号传输成功率,进一步避免卡顿。即便是发送轻微拥塞,该策略亦可保证关键序号到达。柔性既可抵抗丢包,亦可抵抗拥塞。
这种细节信息,无法通过通用接口传递,若通用协议自行丢包,则不光通用协议需善后,也极易制造上层协议叠加效应,比如重传叠加,无论如何,效果总是卡顿。故柔性只能业务自己做。 柔性不意味着一味退让适配,probe带宽也是必须,但这是别的话题了。 柔性后,画质有损,但卡顿率无损。若使用TCP,弱网环境,丢包明显,为确保传输,仍坚持重传每一个包,滑动窗口自然卡死。 这就手机接入WI-FI,有时视频非常流畅,网页却死活打不开的原因。视频做了柔性,网页是HTTP,没这能力。HTTP的最大柔性只在TCP连接之间,网页元素独立使用TCP连接,若网络不给力,则放弃不重要的,通常图片位置会打叉。
说完了技术,说人。 专有协议优化容易出绩效,却难pr,针对专有协议优化的推广相当于暴露细节,降低进场门槛,属自废武功。 相反,通用协议优化,比如TCP优化在业内很容易pr,却难出绩效,其复制推广的简易程度抹平了差异。 大概就是此意,公开渠道的技术秀以及对应的招聘更多是广而告之,加入团队也不一定能取真经,若不跟随从零到一的过程,就只能维护一个成熟系统。教会徒弟便饿死师父,话不好听,但是事实,秀场就是名利场,有人图名图晋升,有人卖货拿提成,怎么可能让人予取予求。 这实属另一个困局。
浙江温州皮鞋湿,下雨进水不会胖。 |
|
|
上一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 4:45:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |