RTS 在阿里云视频直播的基础上进行底层技术优化,通过集成阿里云播放器 SDK,支持在千万级并发场景下节点间毫秒级延时直播的能力,弥补了传统直播存在 3~6 秒延时的问题,确保了超低延时、低卡顿、秒开流畅的直播观看体验。本文介绍了基于 RTS 超低延迟直播优化强互动场景体验的最佳实践方案,并以阿里云播放器 Aliplayer 为例,详细介绍 RTS 超低延迟拉流接入、自动降级、排障信息获取等逻辑的实现,助力企业打造互动直播行业的产品竞争力。
该方案适用于对超低延迟直播有诉求的客户,尤其是业务中存在强互动场景直播的场景。强互动场景直播主要是指对主播和观众存在互动,或观众存在更高实时性观看、画面互动需求的情况,常见场景例如:
某在线知识分享产品为核心的技术服务商,客户期望能基于产品的原有普通直播 Paas 能力进行升级,降低终端用户的直播延迟,提供更优质的用户观看体验。推荐客户底层接入 RTS 服务实现超低延迟的平台直播解决方案,最终封装后作为 Saas 产品能力提供给外部用户付费接入使用,通过超低延迟的直播体验打造其 SAAS 产品在市场上的核心竞争力。
本文围绕着升级过程中客户核心诉求进行展开。特别地,会对如何使用 RTS 解决传统 Web 端使用 HLS 播放存在高延迟的场景进行重点介绍。
传统直播升级 RTS 超低延迟直播过程中,仅涉及底层对接变更,无需改造终端用户的功能使用习惯,直播核心功能诉求主要考虑推拉流侧用户场景:
主要场景
推流部分通过 rtmp 直推标准直播或者 webrtc 采集后合流转推标准直播实现;而拉流时,为了满足用户无需安装app即可便捷观看的需求,需要重点考虑移动端的浏览器页面对媒体流的兼容性问题,相较 FLV 和 RTMP 协议在 HTML 5 页面中不甚理想的表现,客户优先考虑使用 HLS 格式进行拉流。
未接入 RTS 时的核心痛点
由于 HLS 协议特性,默认 Web 端观看直播画面延迟在 10s 以上,尽管传统直播中,客户可以在直播延迟中配置 HLS 为低延迟,但此时拉流端的延迟也仍在 3-6s 左右,对存在强互动需求场景的体验并不友好。
除 HLS 协议自身导致的高延迟痛点外,Saas 直播厂商在未接入阿里云标准直播前,还会额外面临以下几个痛点:
当前标准直播方案架构图

当前业务整体架构图

标准直播升级到 RTS 过程中,主要需要改造的部分为
接入RTS后直播方案架构图

准备工作
在正式开始接入前,默认您已经在控制台完成开通直播服务、添加推流域名和播流域名、配置CNAME、关联推流域名和播流域名,并开通了超低延时直播功能等基础准备工作。
在本案例的业务升级流程中,覆盖了常见场景下的推荐步骤及功能说明,其中非必要的改造会在步骤中进行标注,可根据实际业务诉求选择性应用。
步骤一:RTS 推流地址及播放地址构造
构造推拉流地址前,需要准备好直播流的推流域名、播流域名、AppName(应用)、StreamName(直播流)、鉴权串(如有)。以常用的RTMP推流,RTS拉流为例,基础拼接规则如下:
推流地址:rtmp://demo.aliyundoc.com/app/stream?auth_key={鉴权串}
构造规则:推流协议://推流域名/AppName(应用)/StreamName(直播流)? 鉴权串
拉流地址:artc://example.aliyundoc.com/app/stream?auth_key={鉴权串}
构造规则:artc://播流域名/AppName(应用)/StreamName(直播流)? 鉴权串
步骤二:RTS 服务端转码配置
由于原生浏览器对 WebRTC 的限制,在 Web 端播放 RTS 流时存在以下限制:
相对的,在推流时推荐使用
如果无法控制推流内容的编码,或者仅无法支持 OPUS 的音频编码直推,可以配置转码模板来兼容。不同转码配置对延迟影响略有不同,可参考如下配置说明进行选择:
| 模板类型 | 使用场景 | 模板优势 |
| 原画模板 | 仅需要去 B 帧或 OPUS 转码,推流编码不含 B 帧时仅开启 OPUS 转码即可 | 原画仅 OPUS 转码时延迟最优 |
| 窄带高清™模板 | 同等视频质量下,最高节省 20-40%带宽 | 节省带宽,带宽成本最优 |
| 标准转码模板 | 传统转码能力,对压缩比例和延迟无极致需求。 | |
| 纯音频转码模板 | 删除视频只输出 OPUS 音频流 | 自动去视频画面 |
在当前客户案例中,客户优先考虑延迟因素,因此转码模板选择原画模板,仅开启 OPUS 转码,减少视频处理过程中的转码耗时,配置示例如下。

模板配置完成后,转码流的播放地址需要在原播放地址的基础上进行修改。如下图所示,创建模板 ID 中填写 example 时,结尾会自动补全后缀-RTS ,即此时模板ID全名为 example-RTS 。
注意:配置转码后,转码流的播放地址对应为
转码流地址:artc://example.aliyundoc.com/app/stream_example-RTS?auth_key={鉴权串}
构造规则:artc://播流域名/AppName(应用)/StreamName(直播流)_转码模板ID? 鉴权串
特别提醒:如播放域名配置鉴权,鉴权串需要针对已拼接转码模板ID的地址进行签算生成。
步骤三:RTS Web播放器对接
RTS超低延时直播以WebRTC信令交互方式为基础,需要 HTML5 播放器播放时完成信令交互及媒体信息的编解码,RTS拉流播放时有三种选择:
当前案例中,客户使用阿里云播放器 Aliplayer 完成 RTS 拉流接入、拉流自动降级、排障信息获取等逻辑的实现。阿里云播放器已经集成了 Web RTS SDK,可以直接用于播放 RTS 流,并且内置了 RTS 自动降级逻辑,只需要提供一个降级地址即可使用,能够实现快速业务上线。
当用户播放时使用的浏览器不支持 WebRTC ,或者用户端通过 RTS 拉流失败时,为了保证业务的可用性,播放页面可以选择降级至 HLS、FLV 播放,目前主要支持的降级场景包括:
以下为阿里云播放器 Aliplayer 示例代码,实现了基础播放的逻辑(含降级),示例代码中的关键字段说明:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="IE=edge" >
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/>
<title>Aliplayer Rts Demo</title>
<link rel="stylesheet" href="https://g.alicdn.com/de/prismplayer/2.9.23/skins/default/aliplayer-min.css" />
<script type="text/javascript" charset="utf-8" src="https://g.alicdn.com/de/prismplayer/2.9.23/aliplayer-min.js"></script>
</head>
<body>
<div class="prism-player" id="player-con"></div>
<script>
/**
* 播放器默认播放 source 提供的 rts 拉流地址,如果失败,则会自动降级至 rtsFallbackSource 提供的拉流地址(如 HLS 地址)。
* 可能的降级场景包括:
* 1. 浏览器不支持 RTS,直接降级
* 2. RTS 信令请求失败(拉流地址无效、https配置无效、RTS配置无效等),直接降级
* 3. RTS 起播超时或中途断流,按自定义策略重试失败后降级
**/
// 更多播放器配置请参考 https://player.alicdn.com/aliplayer/index.html
var options = {
"id": "player-con",
"source": "RTS播放地址",
"rtsFallbackSource": "降级地址,如HLS",
"width": "100%",
"height": "500px",
"autoplay": true,
"isLive": true,
"playsinline": true,
"skipRtsSupportCheck": false, // 对于不在 https://help.aliyun.com/document_detail/397569.html 中的浏览器,可以传 true 跳过检查,强制使用 RTS(有风险,需要自测保证)
/**
* RTS 拉流超时会默认重试
* 以下两个参数用来控制降级之前的重试策略,比如 3000 毫秒超时,重试一次,如果再拉不到流就降级,那么总共等待 6000 毫秒降级
**/
// RTS 多久拉不到流会重试,默认 3000 ms
// rtsLoadDataTimeout: 2000,
// RTS 拉不到流重试的次数,默认 5,此参数建议设为 1,即重试 1 次后降级,可以减少降级等待时间
liveRetry: 1,
};
var player = new Aliplayer(options, function () {/* player ready */});
// 降级时会触发此事件
player.on('rtsFallback', function(event) {
console.log('[EVENT]rtsFallback', event.paramData);
// event.paramData.reason 降级的原因
// event.paramData.fallbackUrl 降级到的地址
})
player.on('error', function(event) {
console.log('[EVENT]error', event.paramData);
})
</script>
</body>
步骤四:低延迟推流配置
通过 RTMP 协议推流时,需要控制推流数据的关键帧间隔(GOP),GOP值越大,拉流延迟越高,推荐 GOP 设置为 1s。
以 OBS 软件推流为例,需要在推流软件的输出设置中,设置以下视频编码参数值。

输出参数配置完成后,推流地址正确填写即可开始推流。

步骤五:页面播放测试及延迟观测
完成推流和播放器对接后,可以在页面播放器中手动输入播放地址,或从业务后端接口获取 RTS 播放地址进行播放。
延迟效果演示
https://v.youku.com/v_show/id_XNTg4ODEyNDYwNA==.html?spm=a1z3jc.11711052.0.0&isextonly=1
步骤六:H5 页面播放时获取 TraceID
在传统直播中遇到延迟高、卡顿或其他问题需要提交售后排障工单时,往往需要用户协助采集多种客户端信息,排障效率较低,而在 RTS 接入直播时,我们只需捕获信令交互阶段中的traceid信息,即可提供给工程师结合问题现象进行问题分析。
该步骤为可选步骤,为了线上业务在排障场景中的便捷性和信息精准度,推荐作为接入改造步骤之一。以阿里云播放器 Aliplayer / 其他播放器集成 RTS SDK 接入两种场景为例,提供了排障信息 TraceID 的获取 Demo。
1.通过阿里云播放器 Aliplayer 播放
需要通过 player._rts.traceid 主动获取,用户可以在出现卡顿时选择上报信息。
示例代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="IE=edge" >
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/>
<title>Aliplayer Online Settings</title>
<link rel="stylesheet" href="https://g.alicdn.com/de/prismplayer/2.9.23/skins/default/aliplayer-min.css" />
<script type="text/javascript" charset="utf-8" src="https://g.alicdn.com/de/prismplayer/2.9.23/aliplayer-min.js"></script>
</head>
<body>
<div class="prism-player" id="player-con"></div>
<button id="trace">获取TraceId</button>
<script>
var btn = document.getElementById('trace');
var player = new Aliplayer({
"id": "player-con",
"source": "RTS拉流地址",
"width": "100%",
"height": "500px",
"autoplay": true,
}, function (player) {
console.log("The player is created");
}
);
btn.addEventListener('click', function() {
// 获取 traceId,请使用 aliplayer 2.9.22 及以上版本
var traceId = player._rts.traceid;
console.log('traceId', traceId)
})
</script>
</body>
2.通过其他播放器集成RTS SDK接入
RTS SDK 可以通过注册 customReporter 函数获取所有消息,当 msgid 为126即订阅成功时,可以获取 TraceID 。
示例代码:
AliRTS.createClient({
customReporter: (params) => {
const msgIds = [126/* 订阅成功 */, 220/* 推流成功 */];
if (msgIds.includes(Number(params.msgid))) {
const args = JSON.parse(params.args);
const traceId = args.tcid;
console.log('traceId', traceId);
}
}
})
优势一:自助接入便捷
无论直接接入阿里云 RTS ,或是基于阿里云标准直播升级为 RTS ,技术对接流程均支持自助化的极简操作,1周可完成业务的接入到上线。
优势二:超低延迟的多平台支持
端到端延时从10秒以上降低至百毫秒,且支持大部分主流平台播放。
Native端:兼容 iOS、Andriod、Mac、Windows 平台。
Web端:终端兼容率大于94%,开放 WebRTC 信令自研接入规范。
优势三:抗弱网能力
从 TCP 协议升级至 UDP 协议,叠加媒体特性,消除窗口阻塞和延时应答,并获得更强的抗卡顿能力,在丢包30%的情况下可以流畅播放。
优势四:提供高可用、灵活降级方案
服务端具备完善的推拉流全链路监控及告警能力,客户端支持 RTS 拉流失败或个别浏览器无法兼容时自动降级,从客户端和服务端双重对业务高可用性进行保障。
优势五:海量节点提供高并发支持
超低延时直播复用 CDN 节点架构,通过全球2800+节点提供服务。经过实践检验的千万级高并发视频云直播技术,有效提升私域流量的商业转化。
优势六:强大转码能力
直播服务端转码配置极简,触发便捷,满足对多码率、不同分辨率、不同编码的用户需求。阿里云独有的窄带高清™ 特性,保证画质的同时降低码率,整体上帮助用户降低成本,同等视频质量下最高可节省20%~40%带宽。
优势七:丰富API可对接管理
提供 137 个丰富灵活的API接口支持,满足业务全面诉求。客户支持 StreamID 流维度用量统计,结合 RTS 及普通直播的域名用量统计,可以精确统计各流的用量数据,便于用户统计下行业务具体用量。
如何解决部分安卓手机QQ浏览器无法推拉流?
部分安卓手机(如 vivo iQOO)安装QQ浏览器后首次打开可能无法拉起X5内核,导致WebRTC兼容问题推拉流失败(报错:Failed to execute 'setRemoteDescription' on 'RTCPeerConnection’)。如果遇到该场景请按照以下操作确保X5内核初始化:
为什么部分浏览器不支持Web RTS SDK?
对于Web RTS SDK暂不支持的浏览器,主要有以下原因:
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n
我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:
西安华为OD面试体验开始投简历技术面试进展工作进展开始投简历去年一整年一直在考研和工作之间纠结,感觉自己的状态好像当时的疫情一样差劲。之前刚毕业的时候投了个大厂的简历,结果一面写算法的时候太拉跨了,虽然知道时dfs但是代码熟练度不够,放在平时给足时间自己可以调试通过,但是熟练度不够那面试当时就写不出来被刷了。说真的算法学到后期我感觉最重要的是熟练度和背板子(对于我这种普通玩家来说),面试题如果一上来短时间内想不出思路就完蛋了。然后由于当时找的工作不是很理想就又想考研了。但是考研是有风险的,我自我感觉自己可能冲不上那个学校,而找工作一个没成可以继续找嘛。本着抱着试试看的态度在boss上投了简历,
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3