WebTransport 开播的应用实践之路

news2024/11/20 20:28:53

动手点关注

99e894a8247b5ea57e340d90a414ad43.gif

干货不迷路

Web开播的业务挑战

无论是本地软件推流还是Web推流,都需要解决推流抖动、画面高糊、音频卡顿等问题。在现有的Web技术环境下,如何稳定地把高质量的音视频流呈现给更多用户,是我们技术团队攻克的重点。从技术角度来解读一下这里的几个关键词:

  • 稳定性: 传输协议本身的稳定性是需要保障的,优先会选择使用可靠传输,防止网损带来的花屏、杂音等问题,更重要的是,在服务链路不可用的情况下能够迅速切换服务线路。因此在推流场景下需要提供多线路备份的能力。

  • 高质量:在一些场景下,比如医疗医美营销的场景、带货的场景,要对商品细节做展示,这就要求技术方案在带宽允许的前提下,尽可能选用对画面细节损失更少的编码方案

  • 大规模用户:要分发给更多用户,那技术方案设计肯定会引入直播CDN服务,但是推流协议是不是能够被直播CDN支持,这就是一个考量的点,也是做私有协议无法满足的点。

WebTransport 的技术原理

首先我们简单来了解一下WebTransport这个传输协议基本的技术原理。WebTransport是基于HTTP3的应用层传输协议,HTTP3的底层又基于quic协议,quic协议是基于UDP协议实现的一套传输协议,支持可靠与非可靠传输两种形式。

d29de443335bf2e4d2cb4830b7dbf2d6.png

WebTransport 的技术优势

WebTransport对于Web应用的意义并不止于一个更好的传输协议,它更多的还是带来了一个更加丰富的技术栈,能够根据实际场景,结合WebCodecs、WebAssembly和WebNN等能力实现更好的应用体验。相较于WebRTC相对中心化的技术栈,这种方式显然是更加灵活的,易于做出更多灵活的技术组合。

0ca51ab9f68fb17393f0bdcc15a7983b.png

另一个明显的优势在于WebTransport可以发挥页面多线程的优势,使用WebRTC协议,大量的逻辑只能放在主线程执行,而使用WebTransport就可以将整个音视频的处理流程放在WebWorker中,降低对主线程的占用,提升页面流畅度。同时使用多线程能够提升应用的扩展性,在面对更多的音视频任务时可以用线程来进行抽象和隔离。

206863a59c0a83ee55b3c8e18d08ea45.png

充分利用多线程机制降低主线程负担

a5e6357d49cdb879db4802a2c31125a9.png

利用多线程机制提升应用的可拓展性

从传输协议的特性上来说,它的建联速度更快,首次建联只需要1个RTT,相比之下,TCP则需要2~3个RTT。针对已经建立过的连接,超时时间内再次建联可以实现0RTT。在网络拥塞的情况下,减少RTT次数对速度的优化是非常明显的。可以到几十ms。最后一个特性是连接迁移,在直播过程中如果WIFI网络不好。切到手机热点也可以实现0RTT,相比之下,TCP、RTC都需要重新建立连接,恢复的速度会慢很多。

1d332b7ea11a01360c46858ffb778136.png

首次连接比TCP快1~2RTT 

2edb5d0789529e4763cf14d7a35c0da4.png

对有缓存的连接支持0RTT

基于这些优势,火山引擎直播团队选择使用WebTransport优化直播推流。设计的方案是基于单向流的稳定传输,从传输格式上对标RTMP,这样直播CDN的支持成本会相对较小,比较好复用目前的RTMP收流逻辑。由于这个技术栈较新也需要解决过程中的一些问题:虽然W3C定义了AAC的编码能力,但是Chrome没有提供AAC编码的实现,可以将libFaaC编译成wasm库来实现,另外浏览器没有针对flv容器的封装,需要额外支持该部分能力。那么相比于WebRTC推流,WebTransport推流的实际应用效果如何呢?

a172b900cb70b444ff894e7fde2d4329.png

WebTransport 推流 WebRTC 推流效果对比

为什么 WebTransport 能够比 WebRTC 推流获得更好的效果:

网络传输(画质与稳定性):

WebRTC是面向实时通信的传输协议,对网络延时的变化敏感。使用WebRTC协议推流时,它受到网络抖动的影响较大,当网络延时的抖动发生时,RTC的带宽估计模块会认为当前网络处于拥塞状态,需要降低发送码率以避免拥塞,码率的降低对视频画质的影响是非常大的,直观感受就会出现局部的马赛克。当使用WebTransport基于Quic可靠传输时,其拥塞控制算法对网络抖动的敏感度相对较低,可以通过牺牲一定的延迟保证发送可靠性,因此不容易出现大幅降低发送带宽的行为,画质相对有保障。

编码优化(画质):

WebTransport在Web规范中提供了网络传输的能力,并且可以与现有的Web端多媒体能力进行深度集成,例如WebCodecs、WebGPU等。给应用的优化提供了更多编码格式、参数选择方面的空间。

易于集成到直播 CDN (大规模分发):

WebTransport基于已经定稿的HTTP3规范,易于被直播CDN集成支持,应用复杂度相较于WebRTC更低,同时省去了RTC推流建连过程中的信令环节,可以加快首帧推送的速度,方便部署到更多的直播CDN

首先在网络抖动的场景下,同样加入100ms延迟抖动,WebTransport推流的画面会明显比RTC推流要清晰。在网络抢占的场景下,固定一个较低的带宽,使用GCC拥塞控制算法的数据流,面对使用TCP协议的数据传输,它能够分到的带宽资源是非常小的。

23ec8b41ddbe085c265ebef473e741f7.png

WebTransport推流+100ms延迟抖动

acde28659dad8033e30db4a81cc5ac3c.png

 WebRTC推流+100ms延迟抖动

另外,在固定3Mbps上行带宽的网络下,同时使用WebTransport和RTC推流,设定的目标码率都是1.5M,过程中RTC推流的码率会受到严重的影响,码率大幅下降,不能保证画质。WebTransport推流在不同网络状态下的流畅度表现,除了大量丢包的情况下,其余的场景都能够达到与RTC推流基本持平。

caf8b821d25c37099627ecab5b7e9828.png

WebTransport推流

bc28a78c404556c6ef1b6a70d2ba1d6e.png

 WebRTC推流

总结与展望

不同的推流协议之间各有优缺点,目前没有一个完美的解决方案,需要根据实际的场景来做选择,比如连麦场景一般需要用WebRTC转推,更适合低延迟互动的场景,WebTransport方案则更适合高画质需求的场景。总的来说,WebTransport推流的方案在解决“如何稳定地将高质量的音视频传递给大量的用户”的问题上,即实现了可靠的传输,连接稳定性有保障,并且在遭遇网损的场景,可以通过牺牲部分延迟保障音视频质量,给出了一份令人较为满意的答卷。如果想要体验WebTransport的开播效果,可进入火山引擎控制台进行在线demo体验。

f73bae2dcd29c18a796cc2807e7c46de.png

16e39f79376e2d98a27b224d8f331e11.png 点击「阅读原文」立即体验!

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

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

相关文章

lua编程——air724二次开发之串口通信教程

有了上一章文章《lua编程——air724二次开发之点亮led教程》的基础,接下来将介绍如何使用lua语言进行串口通信。 一、硬件连接 根据银尔达硬件资料的介绍,如下图: 直接将usb转ttl工具和4G模块进行连接,接收和发送线需要交叉连接。…

【IMX6ULL驱动开发学习】07.cdev注册驱动设备_设置次设备号范围

一、register_chrdev 在之前的hello驱动中,注册驱动设备的方式如下 /*初始化设备方法1:自动分配设备号,占用所有次设备号*/ major register_chrdev(0,"hello_drv",&hello_fops);使用 register_chrdev 分配设备号的方式比较…

从玩具到工具|社畜程序员用AI提效的神仙操作

👉腾小云导读 随着 AI 技术的日益发展,前端开发模式和提效工具也在不断地变化。作为一名前端工程师,如何应对 AI 带来的挑战和机遇?在这篇文章中,作者将介绍什么是 AIGC,并深入探讨 AI 在低代码平台的应用。…

【数据结构】顺序表及其实现

目录 1.线性表 2.顺序表 2.1顺序表的概念及结构 2.2顺序表的实现 1.线性表 线性表:是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队…

Parallels Desktop 18 18.3.1激活攻略

如果说虚拟机领域有一位王者,非Parallels不能领袖群伦,毕竟大厂背书,功能满格,美中不足之处就是价格略高,但这也并非是Parallels的错,因为市场上没有任何一款虚拟机产品在产品力层面能和Parallels抗衡&…

使用Typora+PicGo+阿里云搭建图床

1.为什么要使用图床 不知道大家有没有遇到过这样的问题? 在使用Typora的时候,我们传到typora上面的图片,在转到其他地方时,总是加载不出来,造成图片丢失现象或者是在将markdown笔记上传到博客时,总是需要一…

华为OD机试真题 JavaScript 实现【静态代码扫描服务】【2023Q1 100分】

一、题目描述 静态扫描快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出: 文件扫描的成本和文件大小相关,如果文件大小为N,则扫描成本为N个金币;扫描报告的缓存成本和文件大小无关,每缓存一个报告…

(二)安装 Kafka

文章目录 1.选择操作系统2.配置 Java 环境3.安装 ZooKeeper4.安装 broker(1)安装 broker(2)验证是否安装正确 5.配置 broker(1)常规配置(2)主题的默认配置 6.配置 Kafka 集群&#x…

Netty之协议设计

目录 为什么需要协议 redis协议示例 http协议举例 自定义协议 要素 编解码器 测试 为什么需要协议 TCP/IP 中消息传输基于流的方式,没有边界。 协议的目的就是划定消息的边界,制定通信双方要共同遵守的通信规则 例如:在网络上传输 …

c++11 标准模板(STL)(std::ios_base)(三)

定义于头文件 <ios> class ios_base; 类 ios_base 是作为所有 I/O 流类的基类工作的多用途类。它维护数种数据&#xff1a; 1) 状态信息&#xff1a;流状态标志&#xff1b; 2) 控制信息&#xff1a;控制输入和输出序列格式化和感染的本地环境的标志&#xff1b; 3)…

(一)Flask简介和快速使用

关于Python三大Web框架浅谈一嘴&#xff1a; Django、Flask和Tornado三个框架都是Python Web应用的开发框架&#xff0c;虽然它们都能够开发Web应用&#xff0c;但在使用方式、适用领域和处理方式上还是有很多不同的。 Django Django是一个高层次&#xff08;大而全&#xff0…

Flutter自定义系列之折线波动图,心率图,价格走势图

随着前两篇文章的学习&#xff0c;我今天继续给大家演示下简单的自定义之折线波动图&#xff0c;心率图&#xff0c;价格走势图。 这里&#xff0c;我们创建一个自定义的StatefulWidget&#xff0c;用于显示动态的价格线。 我们将使用CustomPaint和CustomPainter来绘制价格线…

chatgpt赋能python:Python中如何截断字符串

Python中如何截断字符串 Python是一种简单易学、高效的编程语言&#xff0c;旨在让开发人员更快、更方便地完成任务。然而&#xff0c;在实际开发过程中&#xff0c;我们常常需要对字符串进行截断操作。那么&#xff0c;Python中怎么截断字符串呢&#xff1f;接下来就让我们来…

如何最大限度地利用ChatGPT、Bard和其他聊天机器人

作者&#xff1a;Hayden Field 译者&#xff1a;明明如月 当下&#xff0c;随着生成式人工智能的发展&#xff0c;面向消费者的聊天机器人能够处理不同领域的需求&#xff0c;并提供相应的帮助和建议&#xff0c;如制定商业战略、设计数学学习指南、提供薪资谈判建议&#xff…

chatgpt赋能python:Python字符串截断-解决方式及实现方法

Python字符串截断-解决方式及实现方法 在Python编程中&#xff0c;处理字符串是一个非常常见的任务。其中&#xff0c;字符串截断也是在许多场景下必不可少的功能之一。Python不仅提供了许多内置函数来处理字符串&#xff0c;而且还有许多方法来截断字符串。 什么是字符串截断…

chatgpt赋能python:Python怎么截图速度快?

Python怎么截图速度快&#xff1f; 在现在这个数字时代&#xff0c;我们所有人都需要进行屏幕截图。无论是用于记录重要笔记&#xff0c;制作教程&#xff0c;或是用于软件质量控制&#xff0c;高速、高质量、高效的屏幕截图工具都非常必要。 在Python编程领域中&#xff0c;…

S3C2440A的ARM工作模式以及寄存器种类

文章目录 前言一、ARM的工作模式二、寄存器的种类&#xff08;注意特殊寄存器的使用&#xff09;总结 前言 本期和大家主要分享的是ARM工作模式以及寄存器种类&#xff0c;不同系列的ARM的工作模式以及寄存器的种类大同小异&#xff0c;所以针对于S3C2440A&#xff0c;一定得通…

【题目解析】第六届字节后端青训营结营小测试全解析

前言 &#x1f44f; Hi! 我是 Yumuing&#xff0c;一个技术的敲钟人 &#x1f468;‍&#x1f4bb; 每天分享技术文章&#xff0c;永远做技术的朝拜者 &#x1f4da; 欢迎关注我的博客&#xff1a;Yumuing’s blog 由于官方答案没有出来&#xff0c;所以&#xff0c;这部分都是…

03.填充中断向量表IDT,使用中断

填充中断描述符表IDT&#xff0c;使用中断 通过初始化中断控制芯片&#xff0c;编码中断函数&#xff0c;实现BIOS中断 操作系统的中断是一种异步事件&#xff0c;用于通知 CPU 某个事件已经发生&#xff0c;例如硬件设备完成数据传输、发生错误或用户发起的系统调用。当操作系…

栈和队列(栈的应用)[二]

文章目录 栈的应用一、栈在系统中的应用简化路径(leetcode. 71) 二、扩号匹配问题有效的括号(leetcode. 20) 三、字符串去重删除字符串中的所有相邻重复项(leetcode. 1047) 四、逆波兰表达式问题逆波兰表达式求值(leetcode. 150) 总结 栈的应用 递归的实现是栈&#xff1a;每一…