关于直播的技术文章很多,成体系的很少。咱们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面、深刻地了解视频直播技术,更好地技术选型。html
本系列文章大纲以下:缓存
(一)采集网络
(二)处理性能
(三)编码和封装测试
(四)推流和传输优化
(五)延迟优化编码
(六)现代播放器原理spa
(七)SDK 性能测试模型视频
在上一篇推流和传输中,关于「直播的第一千米」的关键因素咱们展开了详细的介绍。本篇是《解密视频直播技术》系列之五:延迟优化。htm
咱们在不少线上和线下场合分享了如何优化直播体验,详细讲解了各部分形成低延迟和卡顿的缘由和相应的优化原理。实际上,音视频的直播系统是一个复杂的工程系统,要作到很是低延迟的直播,须要复杂的系统工程优化和对各组件很是熟悉的掌握。这里面咱们再分享几个简单而经常使用的调优技巧。
1. 确保 Codec 开启了最低延迟的设置。Codec 通常都会有低延迟优化的开关,对于 H.264 来讲其效果尤为明显。不少人可能不知道 H.264 的解码器正常状况下会在显示以前缓存必定的视频帧,对于 QCIF 分辨率大小的视频(176 × 144)通常会缓存 16 帧,对于 720P 的视频则缓存 5 帧。对于第一帧的读取来讲,这是一个很大的延迟。若是你的视频不是使用 H.264 来编码压缩的,确保没有使用到 B 帧,它对延迟也会有较大的影响,由于视频中 B 帧的解码依赖于先后的视频帧,会增长延迟。
2. 编码器通常都会有码控形成的延迟,通常也叫作初始化延迟或者视频缓存检验器 VBV 的缓存大小,把它当成编码器和解码器比特流之间的缓存,在不影响视频质量的状况下能够将其设置得尽量小也能够下降延迟。
3. 若是是仅仅优化首开延迟,能够在视频帧间插入较多的关键帧,这样客户端收到视频流以后能够尽快解码。但若是须要优化传输过程当中的累计延迟,尽量少使用关键帧也就是 I 帧(GOP 变大),在保证同等视频质量的状况下,I 帧越多,码率越大,传输所需的网络带宽越多,也就意味着累计延迟可能越大。这个优化效果可能在秒级延迟的系统中不是很明显,可是在 100 ms 甚至更低延迟的系统中就会很是明显。同时,尽可能使用 AAC-LC Codec 来编码音频,HE-AAC 或者 HE-AAC V2 虽然编码效率高,可是编码所需时间更长,而产生更大致积的音频形成的传输延迟对于视频流的传输来讲影响更小。
4. 不要使用视频 MJPEG 的视频压缩格式,至少使用不带 B 帧的 MPEG4 视频压缩格式(Simple profile),甚至最好使用 H.264 baseline profile(X264 还有一个「-tune zerolatency」的优化开关)。这样一个简单的优化能够下降延迟,由于它可以以更低的码率编码全帧率视频。
5. 若是使用了 FFmpeg,下降「-probesize 」和「 -analyze duration」参数的值,这两个值用于视频帧信息监测和用于监测的时长,这两个值越大对编码延迟的影响越大,在直播场景下对于视频流来讲 analyzeduration 参数甚至没有必要设定。
6. 固定码率编码 CBR 能够必定程度上消除网络抖动影响,若是可以使用可变码率编码 VBR 能够节省一些没必要要的网络带宽,下降必定的延迟。所以建议尽可能使用 VBR 进行编码。
1. 在服务端节点和节点之间尽可能使用 RTMP 而非基于 HTTP 的 HLS 协议进行传输,这样能够下降总体的传输延迟。这个主要针对终端用户使用 HLS 进行播放的状况。
2. 若是终端用户使用 RTMP 来播放,尽可能在靠近推流端的收流节点进行转码,这样传输的视频流比原始视频流更小。
3. 若是有必要,可使用定制的 UDP 协议来替换 TCP 协议,省去弱网环节下的丢包重传能够下降延迟。它的主要缺点在于,基于 UDP 协议进行定制的协议的视频流的传输和分发不够通用,CDN 厂商支持的是标准的传输协议。另外一个缺点在于可能出现丢包致使的花屏或者模糊(缺乏关键帧的解码参考),这就要求协议定制方在 UDP 基础之上作好丢包控制。
1. 咱们曾经介绍过实时流传输网络,它是一种新型的节点自组织的网状传输网络,既适合国内多运营商网络条件下的传输优化,也适合众多海外直播的需求。
2. 在服务端节点中缓存当前 GOP,配合播放器端优化视频首开时间。
3. 服务端实时记录每一个视频流流向每一个环节时的秒级帧率和码率,实时监控码率和帧率的波动。
4. 客户端(推流和播放)经过查询服务端准实时获取当前最优节点(5 秒一次),准实时下线当前故障节点和线路。
1. 考察发送端系统自带的网络 buffer 大小,系统可能在发送数据以前缓存数据,这个参数的调优也须要找到一个平衡点。
2. 播放端缓存控制对于视频的首开延迟也有较大影响,若是仅优化首开延迟,能够在 0 缓存状况下在数据到达的时候当即解码。但若是在弱网环境下为了消除网络抖动形成的影响,设置必定的缓存也有必要,所以须要在直播的稳定性和首开延迟优化上找到平衡,调整优化缓冲区大小这个值。
3. 播放端动态 buffer 策略,这是上面播放端缓存控制的改进版本。若是只是作 0 缓存和固定大小的缓存之间进行选择找到平衡,最终仍是会选择一个固定大小的缓存,这对亿级的移动互联网终端用户来讲并不公平,他们不一样的网络情况决定了这个固定大小的缓存并不彻底合适。所以,咱们能够考虑一种「动态 buffer 策略」,在播放器开启的时候采用很是小甚至 0 缓存的策略,经过对下载首片视频的耗时来决定下一个时间片的缓存大小,同时在播放过程当中实时监测当前网络,实时调整播放过程当中缓存的大小。这样便可作到极低的首开时间,又可可以尽可能消除网络抖动形成的影响。
4. 动态码率播放策略。除了动态调整 buffer 大小的策略以外,也能够利用实时监测的网络信息来动态调整播放过程当中的码率,在网络带宽不足的状况降低低码率进行播放,减小延迟。
以上,是咱们在低延迟优化方面的部分技巧。实际上咱们优化低延迟的时候并非只关注「低延迟」,而是在保证其它条件不影响用户体验的状况下尽可能作到低延迟,所以它的内容涉及到更多普遍的话题。而视频直播的优化也包含方方面面,这里只分享了其中通过咱们实践的部分。随着实践的积累,咱们接下来会在线上和线下分享更多关于视频直播甚至点播的优化技巧。
本文做者: 何李石@七牛云布道师,更多云行业技术洞见请访问七牛云博客。