淘宝直播低延迟背后的技术探索

2020 年 4 月 18 日

淘宝直播低延迟背后的技术探索

编者按:本次演讲来自阿里巴巴淘系技术部技术专家常高伟在 LiveVideoStack 2019 深圳站上的演讲,主要面向直播行业从业者,以及对低延迟直播技术、 WebRTC 技术感兴趣的技术人员,介绍淘宝直播在低延迟直播技术上的探索,如何基于 WebRTC 实现一秒内的低延迟直播,以及低延迟直播对电商直播的业务价值。

作者简介:常高伟(长山)淘系技术部技术专家。本文将为大家分享《淘宝直播低延迟技术探索》,主要内容是介绍淘宝直播如何在电商直播中降低直播的延迟。低延迟直播作为当下直播技术一个新的方向,我们会重点介绍下我们在这一块的实践。下面我将从上图所示的几个方面介绍。

淘宝直播背景

近期淘宝直播越来越被大家所熟知,其实淘宝直播在 2016 年就已经上线了,到 2018 年淘宝直播引导成交额就已经突破 1000 亿,今年双十一当天直播引导成交额将近 200 亿。

电商直播和强互动是淘宝直播的两个典型特点:

1、电商直播:边看边买,观众观看直播过程中可以与主播互动,主播会在直播中介绍商品信息,观众可以就商品信息提问。相比传统的网购方式,它能提供更丰富信息,所以转化率更高。

2、强互动:是指相对于传统的电视购物,直播中主播和观众可以进行各种互动,包括评论、点赞、关注。其中评论是观众和主播互动的一个重要手段,对达成交易至关重要。

传统的直播技术延迟非常大,从观众评论到看到主播给出反馈一般要在十秒以上。通过多媒体技术降低直播延迟、提高主播和粉丝的互动效率是我们研究低延迟直播技术的初衷

低延迟技术选型

当前直播技术延迟

我们对当前主流直播技术做了分析,在低延迟直播技术出现前主要有 HLS 和 RTMP/HTTP-FLV 两个协议。

HLS:延迟主要来自编码解码时产生延迟、网络延迟、CDN 分发延迟。由于它是切片协议,延迟分两大块,一个是服务端有切片缓冲延迟,另一个是在播放端防抖缓冲会有延迟。切片的大小和数量都会 HLS 影响延迟大小,一般在十秒以上

RTMP/HTTP-FLV:目前国内大部分厂家在用的 RTMP,它相对于 HLS 在服务端做了优化。RTMP 服务端不再进行切片,而是分别转发每一帧,CDN 分发延迟非常小。RTMP 延迟主要来自播放端防抖缓冲:为提升弱网环境下抖动时直播的流畅度,缓冲延迟一般有五到十秒

这两类协议都是基于 TCP,国内厂商基本上已经将 RTMP over TCP 的延迟做到的极致,如果一个协议仍然基于 TCP 优化延迟,效果上很难优于目前的 RTMP 。

TCP 由于其自身的一些特性,并不适用于低延迟直播场景,主要原因如下:

  • 重传慢:TCP 的 ACK 确认机制,丢包后发送侧超时重传,超时时间一般 200ms,会造成接收侧帧抖动。
  • 拥塞判断不准确:基于丢包的拥塞控制算法无法准确判断拥塞,丢包并不等于拥塞;也会造成发送链路 bufferbloat,链路 RTT 增大,延迟增加。
  • 灵活性差:这是最主要原因,TCP 拥塞控制算法在操作系统内核层实现,优化成本较高,移动端只有利用系统已有的优化。

所以我们选择基于 UDP 的方案实现。

低延迟直播技术选型

上图是我们基于 UDP 的两种方案对比,第一种是可靠 UDP 方向,比如 Quic ,另一种是 RTC 方案,比如 WebRTC 。

我们从五个维度对两种方案做了对比:

  • 传输方式:Quic 是可靠传输;而 RTC 是半可靠传输,特定情境下可对音视频有损传输,可有效降低延迟。
  • 复杂度:Quic 的复杂度非常低,相当于将 TCP 接口换位 Quic 接口即可,RTC 方案的复杂很高,涉及一整套的协议设计和 QOS 保障机制。
  • 音视频友好性:Quic 不关心传输内容,对音视频数据透明传输。RTC 对音视频更友好,可针对音视频做定制化优化。
  • 方案完备性:从方案完备性方面来讲,Quic 是针对传输层优化,而 WebRTC 可提供端对端优化方案。
  • 理论延迟:经我们实验室测试以及线上数据分析,WebRTC 方案的延迟可以达到 1 秒以内。

综上,Quic 方案的最大优点是复杂度低,不过这个方案要想达到更低的延迟,也需要引入更多的复杂度。从方案的先进性上看,我们选择 WebRTC 技术作为我们的低延迟方案。同时,我们也相信,RTC 技术和直播技术的融合,是未来音视频传输技术的一个趋势。

阿里云 RTS

RTS 是由阿里云和淘宝直播共建的低延迟直播系统,此系统分两大块:

  • 上行接入:可接入三种输入方式,第一种是 H5 终端,使用标准 WebRTC 推流到 RTS 系统中;第二种是 OBS 等传统 RTMP 推流软件,使用 RTMP 协议推流到 RTS 系统中;第三种是 低延迟推流端,可以使用我们基于 RTP/RTCP 扩展的私有协议推流到 RTS 系统中。
  • 下行分发:它提供两种低延迟分发,第一种是标准 WebRTC 分发,另一种是我们在 WebRTC 基础上的 私有协议扩展,淘宝直播目前使用最多的就是基于私有协议的分发。

低延迟直播技术

下面我将重点从流程协议,终端方案介绍低延迟直播技术,主要回答几个问题:

  • 标准 WebRTC 终端如何接入
  • Native 终端接入如何获得更好体验
  • 如何基于 WebRTC 设计低延迟直播端方案
  • 播放器如何修改支持低延迟直播

标准 WebRTC 接入流程

播放流程描述

  • 播放端端发送接入请求:通过 HTTP 发送 AccessRequest ,携带播放 URL 和 offer SDP;
  • RTS 收到播放的接入请求后,记录 offerSDP 和 URL ,然后创建 answerSDP,生成一次会话 token 并设置到 SDP 的 ufrag 字段,通过 http 响应发送给客户端。
  • 客户端设置 answerSDP,发送 Binding Request 请求,请求中 USERNAME 字段携带 answerSDP 中的 ufrag(即 RTS 下发的 token )。
  • RTS 收到 Binding Request,根据 USERNAME 中的 token,找到之前 HTTP 请求相关信息,记录用户 IP 和端口。

借助 Binding Request 的 USERNAME 传递 token 是由于 RTS 是单端口方案,需要根据 UDP 请求中的 token 信息确定是哪个用户的请求。传统的 WebRTC 是根据端口区分用户,RTS 为每个用户设置端口会带来巨大的运维成本。

标准 WebRTC 接入过程会有各种限制

  • 它不支持直播中常用音频 AAC 编码和 44.1k 采样率。
  • 其它不支持视频 B 帧、H265 等编码特性,多 slice 编码在弱网下也会花屏。
  • WebRTC 建联过程耗时过长,会影响秒开体验。

基于以上的这些问题,我们设计了更为高效、兼容性更好的私有协议接入。

私有协议接入流程

播放流程描述(四次握手建联):

  • 发送播放请求:通过 UDP 发送 PlayRequest ,携带播放 URL ;
  • RTS 收到播放请求后,立即返回临时响应,并且开始回源;
  • RTS 回源成功后,发送最终响应,携带相关媒体描述(编解码等);
  • 客户端发送最终响应 ACK,通知服务端最终响应接收成功;
  • RTS 发送媒体数据:RTP/RTCP,连接建立成功;

对流程的几点说明:

  • PlayRequest 的作用是将 URL 告诉 CDN,同时兼具 UDP 打洞功能;
  • 协议中信令和媒体在一个 UDP 通道传输;
  • 四次握手流程设计,保证建联速度的同时,确保重要信息可靠到达;
  • 整个建联过程只有一个 RTT,建联速度快;

私有协议状态机设计

上图是私有协议的流程状态机:

  • 初始状态下发送播放请求,然后会进入等待临时相应状态;
  • 在临时响应状态会启动毫秒级快速重发定时器,超时未收到临时响应则快速重传播放请求,保证建联速度;
  • 收到临时响应后进入等待最终响应状态,这时会开始更长的秒级定时器;
  • 收到最终响应建联成功;

过程中临时响应可能丢失或乱序,可能出现提前收到最终响应的情况,会直接从等待临时相应状态直接进入最终状态。

私有协议信令设计

私有信令我们选择使用 RTCP 协议。原因是 RFC3550 定义了 RTCP 的四个功能,其中第四项可选功能描述为:RTCP 可以用在“松散控制”系统中,传递最小会话控制信息。比如,标准定义了 BYE 消息,用于通知源已经不再处于激活状态。我们在此基础上扩展了建联的信令消息,包括请求、临时响应、最终响应以及最终响应 ACK 。

同时,我们选择 RTCP 消息中的 APP 消息承载我们的私有信令。APP 消息是 RTCP 提供的一种为新应用、新功能使用的一种扩展协议,即它是 RTCP 提供的一种官方扩展方式,应用层可以自己定义消息类型以及内容。此外,选择此协议也基于以下考虑:

1、使用 RTCP-APP 可以解决私有协议和标准 RTP/RTCP 区分问题。如之前所讲,媒体和信令在同一个通道,服务端收到后如何区分私有协议、RTCP 包以及原生 RTCP 包,RFC3550 有清晰的描述,帮助我们解决了这个问题。

2、使用此协议可以直接使用现有包分析工具解析抓包。

3、我们可复用 RTCP 相关定义,例如 payload type、subtype、ssrc 等。

RTCP-APP 消息介绍

介绍下 RTCP-APP 消息的细节,上图是 RTCP-APP 消息头,主要字段如下:

1、subtype

消息子类型,可用于定义私有应用扩展消息,我们私有信令的请求、临时响应、最终响应都是根据 subtype 区分的。subtype 的取值范围是 0 到 31,其中 31 预留将来做扩展的消息类型。

2、payload type

APP 固定 payload type 是 204。可用于区分其它 RTP 和 RTCP 消息。

3、SSRC

SSRC 是 RTCP sender 的标识。

4、Name

name 是应用名称,用于区分其它应用 APP 消息。RFC3550 中描述消息类型用两个字段区分,name 确定应用类型,subtype 用于区分消息类型,同一个 name 下可有多个 subtype 类型。

5、application-dependent data

应用层扩展消息内容,我们使用 TLV 格式,即 type、length、value,是一种灵活的、扩展性高的二进制数据格式,它占用空间低。

私有协议媒体部分设计

媒体部分协议主体遵循标准 RTP/RTCP 规范以及 WebRTC 的相关规范,其中 H264 采用 rfc6184 规范,H265 采用 rfc7798 规范。

对 RTP 的扩展部分使用标准的 RTP 扩展,为了和 WebRTC 兼容,标准 RTP 扩展头部定义使用了 rfc5285 标准。例如 RTP 协议是戳使用了 DTS ,标准头中是无法携带 PTS 的,这会导致部分硬解异常,所以我们通过扩展头部定义携带了 CTS 。

两种接入方式对比

标准 WebRTC 接入的优点

  • 标准 WebRTC 接入除了 HTTP 建联请求外,全部符合 WebRTC 规范。
  • 标准终端方便接入。
  • 可快速实现原型。

标准 WebRTC 接入的缺点

  • 建联过程耗时长,使用 HTTP 情况下达到 5RTT,选用 HTTPS 会更长。
  • 媒体必须加密传输。
  • 音视频有相关限制,使用时需要在服务端转码。

私有协议接入优点

  • 基于标准扩展信令和媒体协议,与标准协议差异很小。
  • 建联速度快,秒开体验非常好。
  • 支持直播技术栈,增加了媒体兼容性,减少了服务端转码成本。

私有协议接入缺点

  • 虽基于标准扩展,但仍然带来了部分私有化实现。
  • 使用私有协议后,复杂度有所提升。

淘宝直播落地方案中,为了能够获得更好的体验,Native 端我们使用私有协议接入,目前已在线上大规模运行。

流程协议设计原则

流程协议设计原则有三个:

1、尽量使用标准,包括 WebRTC 相关规范。这个原则意味着我们和标准 WebRTC 互通,会非常方便。

2、当标准和体验发生冲突时,优先保障体验。

3、当需要扩展时,基于标准协议扩展,并且使用标准扩展方式。 我们并没有将 RTP/RTCP 协议全部推翻,使用完全的私有协议,有两个原因:首先是工作量问题,重新设计的工作量会比使用标准协议多很多。其次, RTP/RTCP 协议设计非常精简,久经考验,自己设计不一定能考虑到所有问题。所以我们选择基于标准扩展而非重新设计。

终端接入方案

基于 WebRTC 全模块的接入方案

基于 webrtc 全模块的接入方案,使用 webrtc 的所有模块,通过对部分模块的修改,实现低延迟直播功能。

这个方案的优缺点并存:

优点

经过多年发展,它非常成熟,很稳定,同时提供了完整的解决方案,包括 NACK、jitterbuffer、NetEQ 等可直接用于低延迟直播。

缺点

  • 它的缺点也很很明显。如上图中是 WebRTC 整体架构,它是一个从采集、渲染、编解码到网络传输的完备的端对端方案,对现有推流端和播放端侵入性极大,复杂度极高。
  • RTC 技术栈和直播技术栈存在差异,他不支持 B 帧、265 等特性。在 QOS 策略方面,WebRTC 的原生应用场景是通话,它的基本策略是延迟优于画质,这个策略在直播中不一定成立。
  • 包大小:所有 webrtc 模块全部加入到 APP 中,包大小至少增加 3M。

基于 WebRTC 传输层的接入方案

我们目前终端的整体接入方案如上图,也是基于 WebRTC,但是我们只使用了 WebRTC 几个核心传输相关模块,包括 RTP/RTCP、FEC、NACK、Jitterbuffer、音视频同步、拥塞控制等。

我们在这些基础模块上进行了封装,将他们封装成 FFmpeg 插件注入到 FFmpeg 中。之后播放器可直接调用 FFmpeg 相关方法打开 URL 即可接入我们的私有低延迟直播协议。这样可极大减少播放器和推流端的修改,降低对低延迟直播技术对原有系统的侵入。同时,使用基础模块也极大减少了包大小的占用。

播放器针对低延迟直播的修改

上图是普通播放器的架构。播放器使用 FFmpeg 打开网络连接,读取音视频帧后会放入播放器缓冲,之后会依次对它进行解码、音视频同步及渲染。

接入低延迟直播系统后,整体架构如图下面部分:FFmpeg 增加低延迟直播插件支持我们的私有协议;将播放器的缓冲设置为 0 秒,FFmpeg 输出的音视频帧直接送入解码器进行解码,然后同步,渲染。我们将播放器原先的缓冲区移动到了我们的传输层 SDK 中,使用 jitterbuffer 可以根据网络质量好坏动态的调整缓冲区大大小。

整个方案对播放器的修改很小,基本不影响原有播放器的逻辑。

低延迟直播业务价值

低延迟直播技术目前已在淘宝直播中大规模应用,它的上线降低了淘宝直播的延迟,提升了用户的互动体验,这是最直接的价值。

所有的技术优化都是为了创造业务价值,所有体验的提升应该对业务提升有帮助。我们经过线上验证发现,低延迟直播对电商直播的成交有明显的促进作用,其中 UV 转化率提升 4%,GMV 提升 5%。

同时,低延迟直播技术也可支持更多业务形态,例如拍卖直播,客服直播等。

未来展望

我对低延迟直播技术的未来展望有三点:

1、现在的 WebRTC 开源软件还不能很好支持直播,我希望未来的标准 WebRTC 能很好直播,这样我们可以很方便的在浏览器上做低延迟直播。

2、5G 到来后,网络环境会越来越好,低延迟直播技术会成为直播行业未来的一个技术方向。

3、现在各厂商的低延迟直播协议大都存在私有协议,对用户来说,从一个厂商切换到另一个厂商时成本会很高。低延迟直播协议的统一、标准化对直播行业非常重要。我的一个基本判断是,随着低延迟直播技术的方案和普及,低延迟直播协议在未来一定会走向统一化和标准化。我希望我们国家的技术厂商能够在推动低延迟直播标准化的过程中发出自己的声音,贡献自己的力量。

作者介绍

常高伟,阿里巴巴淘系技术部技术专家。

本文转载自公众号淘系技术(ID:AlibabaMTT)。

原文链接

https://mp.weixin.qq.com/s/_3v4831ATq5baJfCj10fdA

2020 年 4 月 18 日 10:00 2409

评论

发布
暂无评论
发现更多内容

实验室里的AI激情:腾讯优图的升级修炼之路

脑极体

刘华:上云还是不上云,这是一个问题

刘华Kenneth

架构 敏捷

计算机操作系统基础(十七)---进程同步之Unix域套接字

书旅

php laravel 线程 操作系统 进程

架构师必须知道的架构知识

Chank

架构 架构师 Architecture Architect

区块链+高考,让世界再无冒名顶替

CECBC区块链专委会

啃碎并发(八):深入分析wait&notify原理 猿码架构

猿灯塔

SpringBoot入门:01 - 配置数据源

阿亮

Java spring springboot

图解:深度优先搜索与广度优先搜索

淡-蓝色

Java 数据结构 算法

亚马逊:让创新科技成为重启世界的新动能

InfoQ_a5af1d89eb51

Docker基础修炼3--Docker容器及常用命令

黑马腾云

Docker Linux 命令 容器技术

玩转Redis高可用 - 哨兵(Sentinel)模式

Man

高可用 redis高可用 中间件

给 Spring Boot 项目减减肥!18.18M 到 0.18M 是如何做到的?

给你买橘子

Java 程序员 Spring Cloud 编码 SpringBoot 2

【写作群星榜】6.27~7.10 写作平台优秀作者 & 文章排名

InfoQ写作平台

写作平台 排行榜

521我发誓读完本文,再也不会担心Spring配置类问题了

YourBatman

spring springboot @Configuration Spring配置类

肖风:数据要素市场与分布式AI平台

CECBC区块链专委会

16种设计思想 - Design for failure

Man

Java 微服务 设计原则

无价值人生记录.0:浪费1000%时间去做一个用来节省1%时间的“轮子玩具”(上:因缘)

八苦-瞿昙

C# 程序员人生 随笔 随笔杂谈 aop

Java 后端博客系统文章系统——No2

猿灯塔

Git 常用操作汇总-cheat sheet

多选参数

git GitHub gitlab gitee

猿灯塔:spring Boot Starter开发及源码刨析(三)

猿灯塔

Java 猿灯塔

使用 Dockerfile 创建镜像 | Docker 系列

AlwaysBeta

Docker 容器 镜像 Dockerfile 容器技术

DOM 树的构建

法正

html DOM 前端进阶训练营

一个爱不释手的Apifox,让我扔掉 Postman的想法

给你买橘子

Java 编程 程序员 开发 Postman

创业使人成长系列 (2)- 散伙协议

石云升

创业 股权 合伙人 散伙协议

如何基于 BitMap 进行海量数据分析

GrowingIO技术专栏

互联网 数据分析 科技互联网 数据化

微服务架构下分布式事务解决方案

Arthur

终于有人把Elasticsearch架构原理讲明白了,感觉之前看的都是渣

爱嘤嘤嘤斯坦

Java elasticsearch 编程 架构

如果你想写自己的Benchmark框架

程序那些事

JVM 性能调优 GC benchmark

《精益思想》读后感分享

zhongzhq

精益 精益思想 精益生产方式 高效工作方式

redis系列之——Redis为什么这么快?

诸葛小猿

Java redis 程序员

【Java虚拟机】垃圾收集器与内存分配

烫烫烫个喵啊

Java Java虚拟机

淘宝直播低延迟背后的技术探索-InfoQ