搞音视频开发好些年,分享过许多博客文章,比如:前几年发布的《FFmpeg Tips》系列,《Android 音频开发》系列,《直播疑难杂症排查》系列等等。最近想把多年来开发和优化播放器的经验也分享出来,希望能帮助到音视频领域的初学者。第一期文章要推出的内容主要涉及到播放器比较核心的几个技术点,大概的目录如下:

1.  播放器技术分享(1):架构设计

2. 播放器技术分享(2):缓冲区管理

3. 播放器技术分享(3):音画同步

4. 播放器技术分享(4):首开时间

5. 播放器技术分享(5):延时优化

本篇是系列文章的第五篇,主要聊一聊如何优化播放延时。由于播放的延时,是需要从 “视频的生产 -> 分发 -> 播放” 各个环节联合优化的,并不是单一靠播放器就可以搞定的,因此,本文会更多地介绍一些整体上的延时原因和优化思路,而不是单讲播放器本身如何解决延时问题。

播放一般分为 2 种,一种是实时流的直播,如:网红直播、赛事直播、冲顶大会、安防摄像头监控等,另一种是视频文件的在线点播,如:在线电影电视剧,教育培训视频,直播回放等。只有面对直播的场景,才有对降低延时的诉求。

1 延时的测量

要优化播放延时,首先要知道如何测量延时,目前行业内有多种方法,简单介绍如下:

1.1 在线秒表

image.png

主播端对着北京时间/秒表,然后对比播放器画面中显示的时间与北京时间/秒表的差值,这是最常用的测量手法。

1.2 SEI 帧

image.png

SEI 全称是补充增强信息(Supplemental Enhancement Information),提供了一种向视频码流中加入额外信息的方法,是 H.264/H.265 等视频压缩标准的特性之一。

如图所示,我们可以在流媒体服务器端(或者主播端),定时插入一些 SEI 帧,里面记录当前的 NTP 标准时间,当播放器收到 SEI 帧之后,提取出 SEI 帧的时间,跟当前的系统时间对比,即可得到延时差。

1.3 音频波形

image.png

如图所示,主播端和播放器端,在同一个时刻开始把音频数据写入文件中,然后对比两份文件的音频波形,即可测量出延时差。这个 “同一时刻”,可以是通过消息通知的方式,也可以约定一个共同的 NTP 时刻,或者是借助 SEI 帧作为触发的起始。

2 延时是怎么产生的

影响播放延时的因素很多,这里简单列出来几个:

1. 带宽和传输距离

2. 网络抖动和拥塞控制

3. 服务端的 GOP 缓存

4. 各个环节的缓冲区

5. HLS 协议的切片大小

6. 数据处理性能:如美颜、剪裁拉伸、编码解码、视频渲染等

2.1 网络带宽和传输距离

这是一个基础概念,带宽和传输距离对延时的影响至关重要,特别是国内跨省和跨运营商的出口带宽限制等原因,会导致延时更大。这也是为啥近几年边缘存储、边缘计算等概念被提及得比较多,特别是在智能安防监控场景,由于监控视频的消费大都数在局部地区,如果把视频的存储和多媒体/智能处理均放在边缘,可极大地提升效率和体验。

2.2 网络抖动和拥塞控制

基于 TCP 协议的流媒体传输,对延时很不友好,因为 TCP 协议的很多特性导致延时不可避免地增大,比如:三次握手、丢包重传、某些拥塞控制策略等,因此在网络频繁抖动的弱网下,延时会比较大。

2.3 GOP 缓存

image.png

如图,上一篇讲首开优化的时候,我们提到要在服务端缓存一个 GOP 数据,当播放器申请码流的时候,快速下发这个缓存的 GOP,以实现秒开。

但是,播放器拿到的这段 GOP 数据,是一段历史的 GOP 数据,而不是实时的数据,要播放完这段 GOP 缓存数据是需要一段时间的,假设该直播的 GOP 大小是 5s,则直接会导致播放器的延时至少达到 5s

2.4 缓冲区

image.png

无论是推流端、还是分发端或者是播放器本身,都是会存在一些缓冲区的,以应对如网络、性能等抖动带来的问题。

假设视频的帧率是 30fps,那么,每缓冲 30 帧,相当于带来了 1s 的延时。由此可见,缓冲区带来的延时是比较大的,是导致延时的最大因素之一。

2.5 HLS 切片

image.png

如果播放使用的是 HLS 协议,如图所示,假设服务端按照 3~10s 为单位来切片生成 ts 文件,则会直接导致播放的延时会达到 3~10s,这是该协议在延时方面的硬伤,如果对直播延时敏感,一般改用 RTMP 或者 HTTP-FLV 协议来拉直播流。

3 如何优化播放延时呢 ?

与首开优化的思路类似,要优化播放延时,关键就是从影响延时的各个因素入手,基本思路列表如下;

1. 网络线路优化

    • 选择优质的 CDN 加速服务,保障传输的网络带宽和线路资源

    • 测速选线,动态监测,智能调度,确保每一路流的传输质量

2. 降缓冲区

    • 生产端减小 GOP 大小,从而减少服务端 GOP 缓存的大小

    • 生产端根据发送缓冲区情况,动态调整帧率、码率

    • 播放端主动丢帧/追帧/倍数播放,加快缓冲区的消耗

3. 协议/传输优化

    • Based on TCP -> Based on UDP,如:QUIC,RTP/RTCP

    • 传输策略优化:前向纠错,丢包重传策略,拥塞控制优化,关键帧请求等

4. 处理性能优化

    • 硬件编解码/美颜/渲染等处理

    • 算法性能调优

由于这里的每一项优化,都需要较大的篇幅来阐述,网上也有许多相关的讨论和文章,我就不展开讲了,后面有机会再做深度分享。

4 总结

播放器的延时优化,就分享到这里了,如有疑问的小伙伴欢迎来信 lujun.hust@gmail.com 交流。另外,也欢迎大家关注我的新浪微博 @卢_俊 或者 微信公众号 @Jhuster 获取最新的文章和资讯。

weixin_jhuster.jpg