Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >技术解码 | 深入解析Web OBS的实现

技术解码 | 深入解析Web OBS的实现

作者头像
腾讯云音视频
修改于 2022-05-06 03:33:15
修改于 2022-05-06 03:33:15
2K0
举报
文章被收录于专栏:音视频咖音视频咖

Web 上实现直播推流的方式主要有两种,一种是通过 Flash 推流,一种是通过 WebRTC 推流。目前主流浏览器已经放弃了对 Flash 的支持,Chrome 从 88 版本开始彻底禁用了 Flash。因此,使用 WebRTC 进行直播推流成为了 Web 上最好的选择。

通过 WebRTC 可以让网站在不借助中间媒介的情况下,建立浏览器和浏览器、浏览器和服务器之间的点对点连接,实现视频流和音频流或者其他任意数据的传输。

用在直播的场景下,通过 WebRTC 推流,用户不需要借助 OBS 等推流软件,打开网页就可以发起直播。

推流原理

WebRTC 的底层实现十分复杂,但是 Web 上面的使用很简单,只需要很少的代码就可以实现对等连接和数据传输。浏览器将复杂的 WebRTC 功能抽象为三个主要的 API

  1. MediaStream,用来获取音视频流;
  2. RTCPeerConnection,建立对等连接,用来传输音视频数据;
  3. RTCDataChannel,用来传输任意应用数据;

发起直播推流只需要用到前面两个 API ,首先获取表示音视频流的 MediaStream 对象,然后建立点对点连接 RTCPeerConnection,通过 RTCPeerConnection 将 MediaStream 推送到直播服务器即可。 

直播流的采集

直播流的采集取决于如何获取 MediaStream 对象,WebRTC 已经为我们准备了相应的接口。

最常用的接口是 navigator.mediaDevices.getUserMedia ,打开麦克风和摄像头设备来采集音视频流,其次是 navigator.mediaDevices.getDisplayMedia ,通过共享屏幕窗口(比如桌面窗口、应用窗口、浏览器标签页)获取音视频流。

这两个接口都只能在安全上下文环境(比如 HTTPS 协议或者 localhost 本地开发环境)中使用,否则 navigator.mediaDevices 会返回 undefined 。另外需要注意的是 iOS 14.3 及以上版本才支持在 WKWebView 中使用 getUserMedia 接口以及移动端不支持 getDisplayMedia 接口。

以上两个接口获取的流比较固定,推流能提供的内容比较局限。所幸的是WebRTC 提供了 captureStream 接口,这个接口极大的扩充了 MediaStream 的来源,使得推流的内容丰富万变不再单一。

调用 HTMLMediaElement 和 HTMLCanvasElement 的方法 captureStream 可以将当前元素正在渲染的内容进行捕获并生成实时流 MediaStream 对象。简单来说,我们用 video 或者 canvas 播放渲染的内容都可以转化成直播流进行推送,因此视频、音乐、图片或者自己绘制的画面都可以作为 MediaStream 的来源。

然而在实际使用 video.captureStream 的过程中,我们踩了一堆坑,发现在不同的浏览器都存在问题:

  1. Chrome浏览器,从 88 版本开始,通过 video.captureStream 获取的视频流通过 WebRTC 发送之后,接收方无法正常播放视频流。目前为止,chrome 浏览器还没有彻底修复这个问题。唯一的解决办法是关掉浏览器设置中的硬件编码选项,但是对于用户来说不太友好。
  2. Firefox浏览器,captureStream 方法必须加上前缀 moz ,即 mozCaptureStream 。 
  3. Safari浏览器,video 元素直接不支持 captureStream 方法。

最终我们放弃了使用 video.captureStream 方法,各种自定义流都转为用 canvas.captureStream 来生成。

Web OBS的实现

如果只是通过 canvas 采集视频和图片转化为实时流,那么只能生成来源单一的视频流。进一步思考,我们完全可以在生成实时流之前通过 canvas 对采集到的画面内容先进行混合和预处理,除此以外,通过 Web Audio 的接口对采集到的声音也能进行同样的混合和预处理。这样一来,我们就可以把 OBS 大部分功能搬到 Web 上面来实现了,无需下载和安装 OBS 软件,只需要打开网页,就可以得到和 OBS 差不多的推流体验。

有了 canvas 和 Web Audio 这两个强大的帮手,Web OBS 就有了切实可行的实现方案。下面介绍一下我们设计和实现 Web OBS 的基本思路。

首先实现最基本的混流功能,可以将采集的多路流的画面和声音混合到一起,并且自定义每一路画面的大小位置以及每一路声音的音量大小。如下图所示:

然后再实现对于每一路画面单独的预处理效果,比如镜像翻转和滤镜效果,如下图所示:

最后再实现添加水印、文本等附加内容到画面中,就差不多实现了 Web OBS 的所有基本功能了,整体的效果可以参考下图:

利用 canvas 进行画面渲染时,我们使用了 WebGL 来提升渲染性能,利用 GPU 加速渲染速度,并且使用 WebGL Shader 来实现更加丰富的画面特效处理,充分发挥浏览器本身的功能。同时底层设计并实现了一套合成协议,支持mediaStream、HTMLVideoElement、HTMLAudioElement等作为输入源输入,按规则定义视频流和音频流的处理任务,通过数据变化来驱动画面和声音的处理,整个处理过程中可以随时修改合成协议内容,实时输出最新处理结果。这种设计使得后期具备了更好的扩展性,可以方便快速的加入各种新的效果处理,提升了开发效率。

在实现 Web OBS 的过程中也遇到了很多问题和挑战,这里对最常见的几个问题进行一下总结说明。

  1. 对于 canvas 的渲染一般都是使用的 requestAnimationFrame 来进行画面重绘,使用 requestAnimationFrame 的好处很多,比如提升性能、节约资源等。但是当页面处于未激活状态(隐藏或者最小化)时,requestAnimationFrame 的执行会暂停,这个时候 canvas 的画面内容会静止保持不变,如果正在推流过程中,观众端看到的直播画面就是暂停的,帧数为 0 。因此对于直播的场景来说,requestAnimationFrame 并不太适合。我们采取的办法是监听浏览器的 visibilitychange 事件,如果当前页面是可见状态(document.hidden 属性为 false)就使用 requestAnimationFrame 进行画面绘制,如果当前页面是不可见状态(document.hidden 属性为 true)就改用 setInterval 来进行画面绘制。
  2. 类似于视频自动播放阻止策略,在用户没有和当前页面进行交互的情况下,WebAudio 创建的 AudioContext 对象默认状态是 suspended,此时对 AudioContext 进行的操作都是无效的。需要在用户和浏览器的交互中,激活 AudioContext,状态变成 running 之后再进行操作。
  3. WebAudio 创建的 AudioContext 对象使用 createMediaElementSource 方法提取 HTMLVideoElement 和 HTMLAudioElement 中的声音时,每一个 element 只能被提取一次,第二次调用就会报错,我们需要保存第一次生成的结果。

WebRTC推流SDK

上面简单介绍了 Web 推流的原理,直播流的采集方式以及 Web OBS 的实现过程,基于以上内容和实践经验,我们将这些功能都整合到一起,重点解决浏览器兼容性问题和性能问题,开发了 WebRTC 推流 SDK,力求让用户很轻松就能实现自己的 Web OBS 应用。

通过 WebRTC 推流 SDK,可以进行各种直播流的采集,然后对这些流进行本地混流和预处理,比如画中画布局、添加镜像和滤镜效果、添加水印和文本等,再将处理之后的音视频流推到腾讯云的直播后台,打通了 Web 端采集、处理和推流的全链路。

值得一提的是,对于画面和声音的效果处理,在推流过程中也可以进行,不需要断流就可以调整画面和声音内容,从而达到类似于本地导播的效果。

使用WebRTC 推流 SDK前需要先开通腾讯云直播服务,通过直播控制台地址生成器页面获取 WebRTC 推流地址。由于本地混流和预处理功能对浏览器有一定的性能开销,推流 SDK 默认不启用这些功能,需要调用接口手动开启。开启之前,只能采集一路视频流和一路音频流,开启之后可以采集多路视频流和音频流并进行混合处理。

用户可以根据实际情况选择是否开启该功能,如果只是简单的采集并推流则无需开启,如果是老师上课或者主播直播的场景,需要同时采集多个画面或者调整画面效果,则打开该功能并进行设置。

想要深入了解 WebRTC 推流 SDK 的话,可以点击文末「阅读原文」查看相关产品文档,获取快速接入教程,即刻享受不一样的 Web 推流体验。

进阶玩法

在 Web 推流的场景下,我们有时候还需要对流进行进一步处理,例如美颜,美妆以及目前流行的 AR 特效(如下图)。腾讯云目前提供的WebAR SDK可以结合 WebRTC 推流 SDK一起使用,丰富推流的流处理能力。(相关最佳实践文档:https://cloud.tencent.com/document/product/616/71373)

腾讯云音视频在音视频领域已有超过21年的技术积累,持续支持国内90%的音视频客户实现云上创新,独家具备 RT-ONE™ 全球网络,在此基础上,构建了业界最完整的 PaaS 产品家族,并通过腾讯云视立方 RT-Cube™ 提供All in One 的终端SDK,助力客户一键获取众多腾讯云音视频能力。腾讯云音视频为全真互联时代,提供坚实的数字化助力。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云音视频 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WebRTC实现一个网页在线录制视频
电脑录制视频几乎不会用到,当有需要的时候就各种找软件找工具,并且都会找免费的。现在市场上肯定有很多符合需求,只是那么偶尔的情况下,而且使用场景不是那么多要求的情况下,一个网页在线直接录屏是不是非常nice。
wade
2022/12/02
2.1K0
WebRTC实现一个网页在线录制视频
WebRTC 之媒体流与轨道
媒体流指的是访问设备后产生的数据流,轨道指的是 WebRTC 中的基本媒体单元。
前端小鑫同学
2022/12/26
1.3K0
音视频通信加餐 —— WebRTC一肝到底
最近需要搭建一个在线课堂的直播平台,考虑到清晰度和延迟性,我们一致认为使用 WebRTC 最合适。
杨成功
2022/09/22
1.2K0
音视频通信加餐 —— WebRTC一肝到底
ClubHouse 上线支持Replay功能;WebOBS直播推流工具要流行起来了 |W
作为最火的音频直播产品ClobHouse依旧保持比较快的迭代能力, 最近支持 Replay能力, 说的通俗一点就是支持直播的回放能力。ClobHouse在回放的能力之上又做了一些创新,可以让房间创建者在直播结束之后看到谁在听一个房间的回放,还可以让他们与其他没有实时收听的用户联系。回放能力虽然已经被应用的很多,但我比较好奇的是如果支持了回放能力就跟以前的博客有什么区别呢?这个问题可以延伸到直播和短视频的对比上,直播的创作成本很低,短视频的创作成本较高,但单位时间内信息密度明显直播小于短视频很多,目前短视频的消耗时长也明显高于直播。
刘连响
2021/11/17
1.1K0
WebRTC | 原理、架构、框架目录、运行机制、核心类、PeerConnection调用过程等详解
架构 整理分为两层: 应用层、核心层 绿色部分是核心部分, 是WebRTC提供的核心功能; 紫色部分是浏览器提供的JS的API层; 即 浏览器对WebRTC核心层的C++ API 做了一层封装
凌川江雪
2020/08/11
5.9K0
WebRTC | 原理、架构、框架目录、运行机制、核心类、PeerConnection调用过程等详解
JavaScript 是如何工作的:WebRTC 和对等网络的机制!
WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API。
前端小智@大迁世界
2019/03/15
2.6K0
JavaScript 是如何工作的:WebRTC 和对等网络的机制!
TRTC学习之旅(五)-- 自定义视频采集
在有些开发场景下,我可能在视频的时候不需要播放摄像头的内容,我需要播放页面上某一块区域的内容(动画、视频等)。这个时候就需要使用到自定义视频采集的方式去实现了。
黑眼圈云豆
2020/07/12
1.6K0
web多媒体技术在视频编辑场景的应用
大家上午好,很高兴来到咱们腾讯LIVE开发者大会。我今天分享的web多媒体技术在视频编辑场景的应用是个非常有意思的主题,希望大家能有所收获。 首先介绍下自己,我是袁运辉,2010年就加入了腾讯,目前主要在腾讯云视频中心负责web团队。 视频云的web团队是一个偏多媒体前端技术的团队,致力于为客户提供更多创新的场景化云服务,近期我们在视频制作领域中有一些实践经验,我觉得和前端技术以及大会的主题都比较契合,所以非常有意愿来这与大家做一次分享。 我的分享主要分为四部分:第一部分介绍下业务背景;第二部分介绍
腾讯技术工程官方号
2020/09/09
4.4K1
看似简单一套语音直播APP源码开发需要哪些技术支持?
语音直播,简单来说就是实时声音播放的意思。语音直播区别与视频直播,它没有主播的画面,仅以主播的声音为载体实时播出,但大家一样可以使用文字互动。
布谷安妮
2020/04/20
1.1K0
看似简单一套语音直播APP源码开发需要哪些技术支持?
Web前端WebRTC攻略(一) 基础介绍
随着互联网高速发展,以及即将到来的5G时代,WebRTC作为前端互动直播和实时音视频的利器,也是将前端开发者们不可错过的学习领域。如果你现在只是听过而已,那你可能要好好学习一番。 01  什么是WebRTC? WebRTC 全称是(Web browsers with Real-Time Communications (RTC) 大概2011年,谷歌收购了 GIPS,它是一个为 RTC 开发出许多组件的公司,例如编解码和回声消除技术。Google 开源了 GIPS 开发的技术,并希望将其打造为行业标准。 收
用户1097444
2022/06/29
2.8K0
Web前端WebRTC攻略(一) 基础介绍
WebRTC 点对点直播
作者:villainthr WebRTC 全称为:Web Real-Time Communication。它是为了解决 Web 端无法捕获音视频的能力,并且提供了 peer-to-peer(就是浏览器
腾讯IVWEB团队
2017/03/13
10.5K0
浏览器指纹追踪技术了解一下?
我们常说的指纹,都是指人们手指上的指纹,因具有唯一性,所以可以被用来标识一个人的唯一身份。而浏览器指纹是指仅通过浏览器的各种信息,如CPU核心数、显卡信息、系统字体、屏幕分辨率、浏览器插件等组合成的一个字符串,就能近乎绝对定位一个用户,就算使用浏览器的隐私窗口模式,也无法避免。
@超人
2021/04/26
2.2K0
Web前端WebRTC攻略(二) 音视频设备及数据采集
2021年1月26日,W3C 和 IETF 同时宣布 WebRTC(Web Real-Time Communications,Web 实时通信)现发布为正式标准,标志着 WebRTC正式走进舞台。尽管如此,WebRTC 早已在视频会议和直播中得到了广泛的应用,成为了线上通信及协作服务的基石。IMWeb 团队是国内最早研究 WebRTC 的团队之一,在腾讯课堂、企鹅辅导等应用中都有实践。这是 WebRTC 系列的第二篇,希望可以帮助你更好的了解音视频。 一、音视频采集基本概念 在讲浏览器提供的用 JS 采集音
用户1097444
2022/06/29
3.8K0
Web前端WebRTC攻略(二) 音视频设备及数据采集
面向未来的直播技术-WebRTC
这里,我们先来看一些直播技术的基础知识。我们在web,客户端看到的音视频画面,是怎么从数据流到呈现出画面,播放出声音的呢?具体过程可以看下面流程。
LiveVideoStack
2021/09/02
7200
面向未来的直播技术-WebRTC
实时音视频 TRTC 常见问题汇总---WebRTC篇
TRTC Web SDK 对浏览器的详细支持度,您可以查看 TRTC Web SDK 对浏览器支持情况。
腾讯视频云-Zachary
2019/11/15
23.3K3
实时音视频 TRTC 常见问题汇总---WebRTC篇
新知 | 直播架构方案解析及趋势探讨
‍‍ 腾讯云音视频的直播最早是基于QQ音视频能力开发出来的产品,至今深耕音视频领域超过20多年,积累了丰富的音视频和海量服务技术。今天的新知系列课,我们邀请到了腾讯云音视频的技术导师 —— 兰玉龙,为大家由浅入深的介绍一下音视频直播的基础概念以及技术趋势,同时和大家分享一些直播相关的技术以及行业应用,以便大家理解和更加方便地使用直播能力。 接下来的几周,每周四晚上7:30,我们都会在腾讯云音视频视频号、开源中国、InfoQ、51CTO、云+社区等多个平台进行课程直播,大家千万不要错过哦~ - 云直
腾讯云音视频
2021/11/26
1.7K0
实时音视频入门学习:开源工程WebRTC的技术原理和使用浅析
本文由ELab技术团队分享,原题“浅谈WebRTC技术原理与应用”,有修订和改动。
JackJiang
2022/01/10
1.9K0
实时音视频入门学习:开源工程WebRTC的技术原理和使用浅析
低延时高并发视频直播技术WebRTC,在安防视频监控中的应用实践
Web Real-Time Communication(Web实时通信,WebRTC)由一组标准、协议和JavaScript API组成,用于实现浏览器之间(端到端)的音频、视频及数据共享。WebRTC使得实时通信变成一种标准功能,任何Web应用都无需借助第三方插件和专有软件,而是通过简单地JavaScript API即可完成。
TSINGSEE青犀视频
2021/12/23
1.9K0
实时音视频开发学习8 - 云端混流转码
云端混流主要用于CND直播观看和云端录制回放等场景中,需要将TRTC房间里的多路音视频流混合成一路。混流方式为MCU混流转码集群,其能将多路音视频流进行混合,并将最终生成的视频流分发给直播CDN和云端录制系统。
金林学音视频
2020/08/25
2.1K0
实时音视频开发学习8 - 云端混流转码
腾讯云音视频的创新技术、多元场景以及出海洞察
近年来,腾讯云音视频在音视频技术领域不断突破创新,从采集、编码、传输加速、云端媒体处理、分发到解码,不断探索前沿技术,并将其广泛应用于多元化的场景中。与此同时,在海外市场的实践中,腾讯云音视频积累了丰富的经验和对市场的深刻洞察。
腾讯云音视频
2024/01/01
9060
腾讯云音视频的创新技术、多元场景以及出海洞察
推荐阅读
相关推荐
WebRTC实现一个网页在线录制视频
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档