超低延时直播技术的前世今生

news2024/11/24 14:59:18

作者:李晨光、匡建鑫、陈鉴平

卷首语:

据中国互联网络信息中心发布的《中国互联网络发展状况统计报告》显示,截止到 2022 年 6 月我国网络直播用户规模达到了 7.16 亿,占网民整体的 68.1% 。最主要原因是 2020 年度疫情期间导致居家办公和休闲娱乐的人数呈现激增,新媒体互动直播成为了广大网民最重要的休闲娱乐方式之一。

随着直播产业链的不断扩展完备升级,相关产业链各个环节分工逐渐明确且各环节参与人数逐步增多;为了满足不同的就业需求,引发相关就业人数提升,通过直播形式赋能传统产业升级转型,并与高新技术融合创新,优化传统行业商业模式,如直播带货、新媒体广告传媒转型等。

丰富的传统文化、新闻、竞技体育、法律、知识共享等内容,通过移动端互动直播的形式得以更加高效的展现传播,既让优质的直播内容可以实现爆发式传播扩散,又可以让用户有更多的机会感受,学习甚至主动参与直播互动,实现内容供给侧和需求传播的多方共赢。

可以说,超低延时直播技术正在走上一条全新的发展之路。InfoQ将联合火山引擎视频直播团队推出《超低延时直播技术演进之路》系列,带您探索超低延时直播技术的演进历程,揭示背后的挑战和突破,以及对未来直播行业的影响。

今天这篇文章我们来讲一下超低延时直播技术的前世今生~

网络基础设施升级、音视频传输技术迭代、WebRTC 开源等因素,驱动音视频服务时延逐渐降低, 使超低延时直播技术成为炙手可热的研究方向。实时音视频业务在消费互联网领域蓬勃发展, 并逐渐向产业互联网领域加速渗透。经历了行业第一轮的红利爆发期,我国实时音视频行业的场景效能逐渐深化,步入到理性增长阶段。

延时的指标选择很大程度上取决于用户与内容制作方的交互耦合程度,场景丰富多样。

0f366549af3434a87828dd12f86568de.png

在这些极端场景下,延时在用户侧希望越小越好,接近于实时通信的低延迟模式可以最大化地激发用户的参与感,无缝地与内容生产方产生互动效应,调动用户所见即所得的积极性。比如在主播秀场的PK、送礼、工会冲榜、打赏的活动关键环节,竞争双方的储值大户都希望实时地观察到自身主播在礼物刷榜后的反应,为后台运营决策团队或者后续活动策略提供第一时间的信息反馈。

下图体现了从技术/产品/运营的三方角度来综合思考低延时直播技术的作用;从外部-内部综合因素考虑技术的变迁对整个生态正向循环的影响。

7ca7c70cc8277c0b88a349a492385117.png

(一)传统标准直播技术的局限性

1. RTMP 协议的延迟问题

RTMP 协议是最传统的直播协议,主播端采用 RTMP 协议推送 H.264/5 和 AAC 编码的视音频数据到云厂商 CDN 服务器进行转封装分发,端到端延迟一般控制在 3 到 7 秒。问题是 RTMP 的可扩展性存在缺陷,同时对于延迟的进一步下探存在一定的技术困难。RTMP 协议情况下:为了满足延时降低必然压缩播放器的下载缓冲区,这样会引发显著的卡顿问题,使得播放的观感产生不舒适的感受(延时下探至 2 秒以下)。

762d84c1ec642dcd47b3a1152791a0fa.png

2. 传统直播技术在实时互动场景中的不足

  • 视频延时和弹幕交互的延时存在显著差异,问题聊天内容互动与视频传输图像节奏不匹配;

118f966f00ed6720071111089fbb2ef8.png
  • 观众与主播互动形式单一,是单向内容传导无法做到双向(在 RTC 技术引入之前无法显著解决)。

  • 单向传导的局限第一个方面表现在:观众端拉流传输无法做到根据网络情况自适应调节。用户只能以固定的码率进行流媒体传输无法做到动态感知,在网络情况实时变化的场景(比如弱网,移动基站切换等)固定单向码率传输有较大概率造成丢帧卡顿等因素影响观播体验;另一方面在网络条件更好时,固定码率传输无法动态提升视频传输码率(更高的画质带来更加舒适的体验)

  • 在直播和连麦场景共存的互动直播场景下,主播采用传统RTMP推流在遇到连麦PK场景时,会产生推流/本地连麦合流/服务器连麦合流的切换问题,这种场景变换的切换会使得观众端产生瞬间的卡顿问题;如果采用基于webRTC直播技术的超低延时直播方案,这种推流--连麦逻辑的合流切换问题可以得到比较友好的解决(只需要改变服务器转发-订阅流通道的分发逻辑,不涉及推流媒体数据流的旁路调度切换)。

3. 超低延时直播与标准直播的区别

  • 超低延时直播是近年来新兴起的一类应用。如电商直播、赛事直播等场景,兼具高并发与低延时的特性,传统直播 3-20s 的时延难以满足其需求,但对实时互动的要求又不及视频会议等典型的实时音视频应用,无需将时延降低至 400ms 以下。为此,超低延时直播融合了传统直播与实时音视频的技术架构,通过取长补短的方式实现了介于二者之间的端到端时延。尽管针对超低延时直播厂商尚无一套标准的技术路径,但大体可以归纳为拉流协议、网络架构和推流协议三个方面的改造, 在实际应用过程中,厂商会平衡成本及性能指标等因素,在不同的协议和网络架构之间进行选择。

  • 传输层协议的****差异 (基于 UDP 协议的可靠性优化,为弱网对抗策略提供依据)

    • 传统直播 FLV/RTMP 等采用的是 TCP 协议(或者 QUIC 协议)TCP 是牺牲传输实时性来换取数据完整性的可靠传输协议。弱网环境下,其在数据传输前的“三次 握手”连接会带来较大延时。而 UDP 作为不可靠的传输协议,其最大的优点为高实时性,但不保证数据的到达和排序。实时音视频 产品(如 RTM ****超低延时直播 )往往采用 UDP 协议,并在此之上进行协议层与算法层的优化,来提高传输的可靠性与逻辑性。

  • UDP 协议的优化:

    • UDP 协议往往和 RTP/RTCP 协议一起在实际应用中出现。RTP 负责数据传输,其协议头中的序列号、 端口类型、时间戳等字段,可为数据包的分组、组装、排序提供逻辑依据;RTCP 作为 RTP 的控制协议,负责对 RTP 的传输质量进行统计反馈,并为弱网对抗策略提供控制参数。

    • 8525653d43d44f22ce8f9f31c32d953f.png

(二)超低延时直播技术的演进历程

  • 基于业务场景发展的直播技术演进过程(延迟主线

  • RTM 协议本身的演进历程

    • a=extmap:18 "http://www.webrtc.org/experiments/rtp-hdrext/decoding-timestamp"
      a=extmap:19 "uri:webrtc:rtc:rtp-hdrext:video:CompositionTime"
      a=extmap:21 "uri:webrtc:rtc:rtp-hdrext:video:frame-seq-range"
      a=extmap:22 "uri:webrtc:rtc:rtp-hdrext:video:frame-type"
      a=extmap:23 "uri:webrtc:rtc:rtp-hdrext:video:reference-frame-timestamp"
      a=extmap:27 "uri:webrtc:rtc:rtp-hdrext:audio:aac-config"
    • a=extmap:18 "http://www.webrtc.org/experiments/rtp-hdrext/decoding-timestamp"

    • a=extmap:19 "uri:webrtc:rtc:rtp-hdrext:video:CompositionTime"

    • a=extmap:21 uri:webrtc:rtc:rtp-hdrext:video:frame-seq-range

    • a=extmap:22 uri:webrtc:rtc:rtp-hdrext:video:frame-type

    • a=extmap:23 uri:webrtc:rtc:rtp-hdrext:video:reference-frame-timestamp

    • a=extmap:27 uri:webrtc:rtc:rtp-hdrext:audio:aac-config

    • RTP 使用 RTP 私有扩展头携带 DTS/CTS 值,每一帧 RTP 数据包通过 RFC5285-Header-Extension 扩展头携带该帧的 DTS 值,每一帧首个 RTP 包和 VPS/SPS/PPS 包通过 RFC5285-Header-Extension 扩展头携带该帧的 CTS 值,通过 PTS = DTS + CTS 计算当前帧的时间戳。用于启播快速音画同步和播放器播控逻辑精准音画同步

    • 扩展头携带帧的起始/结束序号:如果首帧的前几个包丢失,那么可根据起始序号快速发起重传加快首帧;如果当前帧的后几个包丢失,那么可根据该帧的结束序号快速发起重传,降低延时,减少卡顿

    • 扩展头携带帧的类型:如果携带并解析了正确的帧类型,客户端可以不用解析 metadata ;同时在弱网情形,客户端可以跳过 B 帧直接解码 P 帧,加速出帧并减少潜在卡顿

    • 扩展头携带 P 帧的参考帧信息:如果发生弱网情形,那么客户端可以依照扩展头指定的参考帧关系及其对应时间戳,跳过 B 帧****解码 ,减少卡顿发生

    • 为了加速信令交互的速度,CDN 可以在某些条件下不去查询媒体信息,直接向客户端返回支持的音视频能力;此时 SDP 的媒体描述中将不包含有具体的音视频配置详细信息。在音频层面,此时AnswerSDP 中不包含 aac 解码所需的头信息;此时我们需要采取 RTP 扩展头模式携带 AAC-Config 供客户端在 RTP 收包时刻自行解析处理完成解码动作,作用是减少信令交互时间,提升拉流成功率

    • miniSDP 信令标准实现部分(抖音)

    • CDN 信令异步回源

    • RTP 携带扩展头组成部分

1. WebRTC 协议在直播播放器的移植

  • RTM 低延时直播基于 WebRTC 技术衍生,基于 WebRTC 标准构建点到点传输一般有如下几个步骤:

    • 通信双方要进行媒体协商,会话详细规范即 SDP(Session Description Protocol) 交互;

    • 随后进行交互式网络地址协商(查询对端真实 IP 地址)准备构建媒体传输通道;

    • 当上述条件准备完毕即进入最终的 Peer to Peer 点对点媒体数据传输。

43fe1b6b95e71b1b394bba7bd2edebf6.png
  • 信令部分客户端-服务器单独开发,利用了 SDP 标准报文模式;媒体传输部分采用开源的 WebRTC 框架和字节自研的实时音视频媒体引擎进行媒体传输。

2. RTC ****信令 协议的改造升级( MiniSDP 压缩 协议)

https://github.com/zhzane/mini_sdp

5c0406c7d09c9c144014970003db2a31.png
  • 标准 SDP 比较冗长( 5-10KB 左右),不利于快速高效传输。在直播场景下,会尤其影响首帧时间。MiniSDP 对标准 SDP 文本协议进行高效能压缩,将原生 SDP 转换成更小的二进制格式,使其能够通过一个 UDP 包来传输。

  • 降低信令交互时间,提高网络传输效能,降低直播拉流首帧渲染时间,提高拉流秒开率/成功率等 QoS 统计指标。

播放协议RTM-HTTP信令RTM-MiniSDP信令FLV
首帧时间(预览)600ms510ms350ms
拉流成功率(预览)97.50%98.00%98.70%

3. CDN RTM ****信令 异步 回源优化

  • 降低 RTM 信令交互时间,降低 RTM 拉流首帧渲染时间。

  • 原来的流程在服务端缓存不命中时需要等待回源拿到数据,才能返回带有 AacConfig 信息的 AnswerSDP。客户端收到 AnswerSDP 后发送 STUN,而服务端只能在收到 STUN 才能开始下发数据。(如下图左);当异步回源情况下:服务端不再等待回源结果直接返回 AnswerSDP,之后回源和WebRTC 建连流程同步进行。等到 WebRTC 建连成功且回源拿到数据立即下发 RTP 数据。(如下图右)

216cb9daea39bbd4a650fdc31a0b1fca.jpeg

4. 视频渲染卡顿的优化(百秒卡顿平均降低4秒)

  • 改善人均看播时长,改变 RTC 引擎的组帧/解码策略;禁止 RTC 在低延时模式下的丢帧,改善直播的视频渲染卡顿。

实验组视频渲染百秒卡顿(直播间场景)
RTM默认JitterBuffer策略8.3s
RTM改进的JitterBuffer非丢帧策略3.6s
  • 传统的 RTC 场景优先保时延,全链路会触发各种丢帧(包括但不限于解码模块,网络模块),FLV 直播场景会优先保证观播体验(不丢帧,良好的音画同步效果)。RTM 要想减少卡顿,取得 qoe 的收益,播控策略需进行定制化, 定制逻辑修改点:

    • 确保不会由于软解的解码耗时或者硬解的 dequeuinputbuffer 等其它 api 操作阻塞 jitterbuffer ,内核层有一层强制的音画同步逻辑,可以确保音视频的播放体验;

    • 同时上层在监控网络模块和解码模块的缓存长度,有相应的兜底逻辑:

  1. 判断硬解确实解不过来,dec_cache_frames 过多,上报错误,会降级到软解;

  2. jitterbuffer 异常,缓存的 frame_list 过多,触发播放器异常逻辑,上报错误,重新拉流。

b1f3810cead6ca977544143f0c088c6b.png

5. RTM 播控逻辑的优化

  • 改善移动端看播渗透,RTC 统一内核方案天生存在缺陷( MediaCodec 硬件解码器初始化耗时久);将 RTM 视频解码模块从 RTC 内核中迁移至 TTMP 播放内核,复用了 FLV 的视频解码模块( MediaCodec 避免重新初始化);显著的降低了安卓平台的首帧渲染时间,提升了拉流的成功率。

  • RTC 内核通用逻辑

1663a17f34275a5863c2ce42ea67d69a.png
  • 改进的 RTM 内核播控逻辑

e0e5bd3d814ec74157c5e1f4cd8b6698.png

以上为超低延时直播技术演进之路《进化篇》的所有内容,第二篇《实战篇》我们将聚焦于超低延时直播技术如何大规模落地实践,请大家持续关注~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/857175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门(小白篇2-标识符定义-关键词-变量类型)

前言 在上一节课中,我们学习到C软件的安装,也知道C运行的各种软件,以及运行第一个程序 今天我们来学习一下 1、C中标识符(变量)的命名规则 2、认识C中的关键词 3、认识C中的数据类型 每天学一点,不要太多不然脑子装不下&#xff0…

vscode终端背景颜色修改以及报错信息颜色修改

引言 刚从pycharm转到vscode上时,很不喜欢vscode终端信息一片白色,于是想尽办法去修改vscode终端风格 这里提供vscode终端背景颜色的修改和vscode终端报错提示信息颜色的修改方法 (1)vscode终端背景颜色优化 步骤一,ctrlshiftp打开设置搜索…

【python 深度学习】解决遇到的问题

目录 一、RuntimeError: module compiled against API version 0xc but this version of numpy is 0xb 二、AttributeError: module ‘tensorflow’ has no attribute ‘flags’ 三、conda 更新 Please update conda by running 四、to search for alternate channels that…

项目启动会为什么很重要? 要确定哪些事宜?

项目启动会议及事项安排 1、领导致辞 2、项目目标 3、项目范围及关键交付物 4、项目里程碑 5、项目组织架构及人员工作安排 6、项目管理机制 7、联系人列表 8、Q&A 进主页获取更多资料

JVM—编译器、类加载的过程、双亲委派机制这些你还记得吗?

背景介绍 这两天在对JVM的知识进行回顾,顺便来分享分享,接下来也会有系列文章,欢迎大家一起讨论。 过程 为什么叫JVM? Java Virtual Machine,java虚拟机。可以理解成一个以字节码为机器指令的CPU 有哪些特点呢&#…

python性能分析,logging性能,print性能,文件写入性能对比

先说结论,没想到的是print性能比logging性能好,输出到控制台会极大降低程序性能,以下是我的性能对比结果: 运行情况是python后台运行并输出到日志,命令是 python3 test.py > /opt/testtime.log 2>&1 &

【css】添加待小三角的提示框

如需创建在工具提示的指定侧面显示的箭头&#xff0c;在工具提示后添加“空的”内容&#xff0c;并使用伪元素类 ::after 和 content 属性。箭头本身是使用边框创建的。这会使工具提示看起来像气泡。 代码&#xff1a; <style> .tooltip {position: relative;display: …

通过signtool进行数字签名和验证签名

&#xff08;一&#xff09;如何签名 SignTool.exe (Sign Tool) - .NET Framework | Microsoft Learn Using SignTool to Sign a File - Win32 apps | Microsoft Learn 签名命令行&#xff1a; signtool.exe sign /f xxx.pfx /t http://timestamp.digicert.com yyy.dll xx…

C++ 学习系列 1 -- 左值、右值与万能引用

1. 何为左值&#xff1f;何为右值&#xff1f; 简单的说&#xff0c;左值可以放在等号的左边&#xff0c;右值可以放在等号的右边。 左值可以取地址&#xff0c;右值不能取地址。 1.1 左值举例&#xff1a; 变量、函数或数据成员返回左值引用的表达式 如 x、x 1、cout <…

Keystone Automotive EDI 需求分析

Keystone Automotive 是一家知名的汽车零部件销售卖场&#xff0c;自创立以来&#xff0c;在汽车行业取得了卓越的成就。作为一家专业的汽车零部件供应商&#xff0c;Keystone Automotive 致力于为客户提供优质的产品和卓越的服务。公司的经营范围涵盖广泛&#xff0c;涉及多个…

ubuntu python虚拟环境venv搭配systemd服务实战

文章目录 参考文章目录结构步骤安装venv查看python版本创建虚拟环境激活虚拟环境运行我们程序看缺少哪些依赖库&#xff0c;依次安装它们接下来我们配置python程序启动脚本&#xff0c;脚本中启动python程序前需先激活虚拟环境配置.service文件然后执行部署脚本&#xff0c;成功…

unity vscode 代码关联 跳转 BUG

一早打开电脑发现代码关联失效了&#xff0c;目测可能跟昨天一些插件更新有关 结论 就这货&#xff0c;开了就没法提示代码关联&#xff0c;估计预览版全是BUG。 另一个坑 同期有个unity插件也是预览版&#xff0c;“非常好使”&#xff0c;当场去世。评论点开有好几个人说用…

cadence virtuoso worning

cadence virtuoso 添加工艺库报错如下&#xff1a; Warning: ddUpdateLibList: It appears that you are trying to run an OA executable on CDB data. Library smic13mmrf_1233 contains file /home/IC/Tech/PDK_13mmrf_1P6M_30k/smic13mmrf_1233/prop.xx which is CDB data.…

Taro React组件使用(11) —— RuiNoticebar 公告栏

1. 需求分析 用于循环播放展示一组消息通知&#xff1b;通知消息渲染完成&#xff0c;获取消息的长度和盒子的长度&#xff1b;使用【taro react】---- 获取元素的位置和宽高等信息异步获取内容和盒子的宽高信息&#xff1b;通过 CSS3 的 animation 实现内容的移动&#xff1b…

Flume拦截器

实现 Interceptor接口 方法1 是初始化: 方法2和3重载 拦截: 方法3 是关闭: 但是flume是通过内部类创建对象的

一、Kubernetes介绍与集群架构

Kubernetes介绍与集群架构 一、认识容器编排工具 docker machine 主要用于准备docker host现已弃用建议使用docker desktop docker compose Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose&#xff0c;您可以使用 YAML 文件来配置应用程序的服务。…

c语言--浮点数(float)与0值比较

我们定义一个float类型的数据a&#xff0c;赋值为123456789并输出&#xff1a; int main() {float a;a 123456789;printf("%f\n",a);return 0; }输出结果为&#xff1a; 由此可以看出&#xff0c;程序输出的结果并不是其被赋予的值。即说明了浮点数存在一定的误差。…

MD-MTSP:星雀优化算法NOA求解多仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、星雀优化算法NOA 星雀优化算法(Nutcracker optimizer algorithm,NOA)由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模拟星雀的两种行为&#xff0c;即&#xff1a;在夏秋季节收集并储存食物&#xff0c;在春冬季节搜索食物的存储位置。星雀优化算法(Nutcrack…

Optional 使用方法详解

Optional的作用是什么&#xff1f;他都有哪些方法&#xff1f;阿里规范点名说尽量用Optional来避免空指针&#xff0c;那么什么场景用Optional&#xff1f;本篇文章围绕这三点来进行讲解。 一、Optional类的来源 到目前为止&#xff0c;臭名昭著的空指针异常是导致Java应用程…

Go For Web:踏入Web大门的第一步——Web 的工作方式

Web 的工作方式 了解当你访问一个网页时&#xff0c;背后是如何运作的&#xff0c;发生了一些什么&#xff1f; 其实当你输入网址&#xff08;URL&#xff09;并按下回车之后&#xff0c;你的浏览器相当于扮演了 客户端 的角色&#xff0c;首先你的浏览器会去请求 DNS 服务器进…