老生常谈,聊聊直播延迟
这篇尽量用能听懂的方式来说。
事件的起因是。今天快手真心夜的腾讯视频直播流。比快手慢了不少。
几个群里都在问卫视有没有延迟。快手有没有延迟。腾讯怎么延迟这么大。一系列。所以想讲讲这事儿。算作更新技术博客?
老粉别打我,我知道我又水……更细致点的 几年前会上讲过,你们去翻翻。

1. 直播有没有延迟
有。任何形式任何平台的直播都有。肯定有。
只是时长不一样。
2. 直播延迟如何产生的
大部分人会以为是网络。网络其实还好吧。一般直播的延迟,大头是缓存产生的。并不是网络。(此处需要严谨一点,这里的一般直播指的是网络直播是指淘宝 抖音 快手带货那种 以及斗鱼虎牙B站游戏那种 分发式网络直播。并不包含会议、语音聊天、一类的直播场景)
然后就从采集到观看的顺序说一下。哪有缓存。
第一步就是综艺、比赛。画面由导播台给到编码器。然后有些直接会过一道加延迟的机器。做缓存。就是为了应对现场突发状况直接放弃缓存不要了。
第二个地方是在服务端上行边缘节点。这有个知识点:大部分网络直播用的分发网络。即 上行边缘节点(离现场最近的)—> 源站 —> 分发网络-> 下行边缘节点(离观众最近的)于是有些时候这种需要加缓存保证内容可控的也会直接做在上行边缘节点。
第三个地方 分发网络。并不是每份数据都是直接传给我们每个人的。实际上在分发网络中。我们每个用户都在和他人共享同一份数据。原理是。某个边缘节点。比如有十个人。它会把这段数据给这十个人。当边缘节点没有。就向上一级服务区要数据。再没有。上一级服务区会去源站取数据。所谓大的回源就是这样了。当然。越是冷门的直播。边缘节点有数据的概率越小。就成了冷流。这样每一级分发都会缓存数据。就出现了延迟。
3. 播放器
播放器为了防止卡顿也会缓存数据。我一般会把缓存时长给到500毫米左右。也就是10-30帧。另外,有一点很重要:直播播放器必须追帧!
什么是追帧?
就是当卡顿发生。因为缓存就在那里。你卡一下就从下一帧开始播的。所以约卡,累计延迟也就越高。
这批评一下腾讯视频。点名批评。直播开始的时候我看了眼。快手给的流确实加了延迟。但是没多少。然后我去写代码了。快下班的时候,发现要录的东西开始了。就录了。录完,传了群里。发现腾讯看直播的姑娘一脸茫然:不是刚开始吗?我就想问 追帧了吗?累计延迟处理了吗?
这里其实也不能完全怪腾讯视频。确实一般主办平台会给其他平台的信号直接加个延迟。大部分在一分钟左右。确保自己平台的观看数据。无可厚非。
另外。我一般代码里追帧频率是检测卡顿,小幅卡顿也算即便用户感知不到。计算一个累积卡顿时长。到点儿就看看当前状态,当前卡没卡,缓存里有没有。有就快进。没有嘛。重新拉流吧亲。
差不多就这么多。至于Webrtc延迟…反正webrtc承载不了这大几百万人一起看直播。这里不想说了。

重申一点:大部分情况下和当前网络状况没太大关系网差只会卡 (除非播放器不好好写)
Ps:无意争吵。涉及我专业领域,会较真一点。杠精注意:1. 网络有延迟。但是这种分发式的直播,网络延迟远小于缓存导致的延迟。2. 卡顿会造成延迟。前提是播放器没写好。3. 无意争吵,就事论事。
另外,今年北京LVS会去跟大家聚聚,不讲。新东西能写出来文章的时候会给LVS投稿,大家去关注LVS微信号就行。

群:711929228
进群问题:哈希查找时间复杂度?
O(1)原理自行百度。