基于webrtc的前端录屏与直播

广告位招租
扫码页面底部二维码联系

我在腾讯主导了一个用于用户行为监控与回放著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。的项目,其中,通过录制前端DOM的变化,【作者:唐霜】【关注微信公众号:wwwtangshuangnet】实现用户界面的变化。和rrweb不同,我本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net们没有使用MutationObserve【转载请注明来源】【转载请注明来源】r方案进行录制,这个方案需要解决如何获取【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net被移除节点的路径问题,非常复杂,且Mut【原创内容,转载请注明出处】原创内容,盗版必究。ationObserver具有兼容性问题转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net,低版本浏览器不支持,另外由于Mutat【本文受版权保护】【本文首发于唐霜的博客】ionObserver基于微任务进行响应本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net,响应过快,导致一些性能问题,另外还有不原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。可预测的丢帧问题。我们采用了另外一套更加【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】缜密的DOM变化记录方案,但由于内部项目【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。暂时不便公开。在除了web录屏与回放的研转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】究之外,我还关注到滴滴内部开源了一套原生转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。APP的录屏方案。另外,除了基于DOM的原创内容,盗版必究。【版权所有,侵权必究】录屏方案外,我还在寻找另外的更高效的录屏【转载请注明来源】著作权归作者所有,禁止商业用途转载。方案,因为基于js的录屏方案,会带来不可本文版权归作者所有,未经授权不得转载。【本文受版权保护】避免的性能问题,以及丢失数据问题。在一次【本文受版权保护】转载请注明出处:www.tangshuang.net偶然冲浪过程中,我发现谷歌已经通过chr著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.netome开放了录屏接口,也就是getDis【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。playMedia,于是进行了一番研究,【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。并通过本文记录下来。

未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】

什么是WebRTC?【访问 www.tangshuang.net 获取更多精彩内容】

【作者:唐霜】【作者:唐霜】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。

getDisplayMedia是webr【本文受版权保护】【原创内容,转载请注明出处】tc整体标准中的一个接口,要了解webr【本文首发于唐霜的博客】未经授权,禁止复制转载。tc的入门信息,可以移步《WebRTC点对点应用架构研究【本文首发于唐霜的博客】》这篇2018年发表的博文,这篇文章可以【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】作为入门了解webrtc及其基本开发步骤转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。的知识文章。

本文版权归作者所有,未经授权不得转载。【转载请注明来源】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

在上述文章之上,我们再去理解webrtc【转载请注明来源】【版权所有,侵权必究】,可以这么理解:webrtc是一套客户端【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。点对点流式信息传播的技术方案。其中我的新【未经授权禁止转载】转载请注明出处:www.tangshuang.net认识在于“流式信息”这个点,以前,我把重本文作者:唐霜,转载请注明出处。【本文受版权保护】点放在“点对点”上,但逐渐我发现,但凡基未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net于流式信息的传播,都可以在webrtc标【原创内容,转载请注明出处】【未经授权禁止转载】准下去讨论。这里的流式信息,主要是指基于【转载请注明来源】【关注微信公众号:wwwtangshuangnet】音视轨的实时数据流。说白了,就是音频和视本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】频实时数据。

【本文受版权保护】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】

而本文讨论的屏幕录制,就属于这一范畴。因【版权所有,侵权必究】【原创内容,转载请注明出处】此,录屏接口也被放在webrtc整体框架【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】下面。

【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】原创内容,盗版必究。

getDisplayMedia与直播【转载请注明来源】

【原创不易,请尊重版权】【原创不易,请尊重版权】【版权所有,侵权必究】原创内容,盗版必究。

从接口名称可以看出,这是一个获取显示器实本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。施音视频数据的接口。在我最早的文章中并没【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。有介绍这个接口,当时并没有注意到它。我们本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】看下它的兼容性。

未经授权,禁止复制转载。【本文受版权保护】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。

转载请注明出处:www.tangshuang.net【转载请注明来源】本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】

可以看出来,它的兼容性并不好,IE直接p本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】ass,手机端无一支持。但考虑到实际场景未经授权,禁止复制转载。【版权所有,侵权必究】,录屏基本上也只会在PC端有应用场景。

【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。

关于getDisplayMedia这个接著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。口的具体用法,可以参考MDN【作者:唐霜】。它的使用超级简单:【原创不易,请尊重版权】

本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】原创内容,盗版必究。
navigator.mediaDevices.getDisplayMedia(constraints).then((stream) => {
  // ...
})

上面代码会执行webrtc惯用步骤,弹出本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】与用户之间的交互对话框,只有用户允许之后【版权所有,侵权必究】【原创不易,请尊重版权】,才能进行录屏。它返回一个promise著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】,then里面接住一个stream,这个【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。stream就是被录制的屏幕音视流。我们【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。可以把这个流塞到一个video标签上,就【本文受版权保护】著作权归作者所有,禁止商业用途转载。可以看到录制的实时效果了。

本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】未经授权,禁止复制转载。
document.querySelector('video#player').srcObject = stream

这里的stream是一个MediaStr未经授权,禁止复制转载。转载请注明出处:www.tangshuang.neteam类型的流,这种流的特征是,它拥有多转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。个轨,也就是tracks。而在我文章开头本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。的文章里面有代码演示,通过peer.ad【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】dTrack就可以完成节点之间的点对点传【本文首发于唐霜的博客】【作者:唐霜】输的对接工作。也就是说,我们将前文的pe原创内容,盗版必究。【未经授权禁止转载】er相关的知识和这里的知识结合,就可以马原创内容,盗版必究。【作者:唐霜】上做一款录屏直播应用。

【版权所有,侵权必究】未经授权,禁止复制转载。【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net
stream.getTracks().forEach((track) => {
  peer.addTrack(track, stream)
})

这一切看上去都非常简单不是吗?【本文受版权保护】

【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net

用户行为监控【访问 www.tangshuang.net 获取更多精彩内容】

未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

由于webrtc在启动能力前,会有原生的【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】chrome窗口弹出来询问用户,且在开启著作权归作者所有,禁止商业用途转载。【本文受版权保护】getDisplayMedia之后会有一【关注微信公众号:wwwtangshuangnet】【本文受版权保护】个状态条,所以在整个的操作中会有一些生硬著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。,用户有明显的知道自己的屏幕正在被录制。【转载请注明来源】原创内容,盗版必究。因此,利用webrtc进行录屏,是一种有【转载请注明来源】【原创不易,请尊重版权】感录制,和我之前一直在做的无感录屏稍有不【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】同。

【本文受版权保护】【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】

因此,此类用户行为监控更适合用在测试场景【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。下,或者明确授权情况下。我们来看下具体的本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】实现过程。

【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。原创内容,盗版必究。

在通过getDisplayMedia获得【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】stream之后,我们需要通过Media本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。Recorder对stream进行录制。转载请注明出处:www.tangshuang.net原创内容,盗版必究。MediaRecorder也是webrt未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。c的接口,你可以通过MDN本文作者:唐霜,转载请注明出处。了解它的具体用法。它可以对一个strea【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。m进行录制,并生成blob格式的目标数据【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】。但凡webrtc相关的stream,都【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】可以被MediaRecorder录制出来转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】。一旦理解了stream的本质,那么对录【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。制也会理解不少:录制就是在流上创建截面序原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net列,也就是采集音视频的过程,因此,我们需本文作者:唐霜,转载请注明出处。原创内容,盗版必究。要配置一些采样信息,通过配置不同的采样信【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net息,就可以得到不同画质、音质、流畅度的结【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。果。

本文版权归作者所有,未经授权不得转载。【作者:唐霜】【本文受版权保护】【未经授权禁止转载】
recorder = new MediaRecorder(stream, { mimeType: "video/webm; codecs=vp9" })
recorder.ondataavailable = handleRecord
recorder.onerror = e => console.log(e)
recorder.start()

其中,ondataavailable是一【版权所有,侵权必究】【未经授权禁止转载】个回调,当需要产生一个视频数据时,它的回【版权所有,侵权必究】【转载请注明来源】调函数会接受一个BlobEvent事件,原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】而该事件中有一个data属性,内容为一个【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】Blob。什么时候会触发这个事件呢?有两【原创内容,转载请注明出处】【作者:唐霜】种情况,一种是调用recorder.re【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】questData()方法,那么这个回调未经授权,禁止复制转载。【原创不易,请尊重版权】就被触发一次,此时会产生一个blob。另著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。一种是调用recorder.stop()本文版权归作者所有,未经授权不得转载。【转载请注明来源】时,也会产生一个blob。每次产生的bl本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.netob都是从上一次产生到当前这一时刻之间的未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net录制片段,因此,如果中途不调用reque未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。stData方法,那么当你调用stop方转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。法的时候,全部过程就会被记录下来。

【原创内容,转载请注明出处】【作者:唐霜】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。
function handleRecord(e) {
    if (event.data.size <= 0) {
        return
    }

    chunks.push(event.data)
}

但作为用户行为监控的一个部分,很显然,我【版权所有,侵权必究】转载请注明出处:www.tangshuang.net们更希望当用户的某个操作产生了错误的时候【版权所有,侵权必究】【转载请注明来源】,才上报对应的录制视频。因此,我可能更倾【本文受版权保护】本文作者:唐霜,转载请注明出处。向按照一定的策略来生成一段一段的视频,在原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。需要的时候,通过前后端的交互,完成视频传【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net输。

【未经授权禁止转载】【未经授权禁止转载】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。
blob = new Blob(chunks, {
    type: "video/webm"
})

由于我们拥有indexedDB这个利器,转载请注明出处:www.tangshuang.net【未经授权禁止转载】可以将blob存在本地,在需要的时候,通【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。过webrtc点对点传输的特质,直接将视【原创内容,转载请注明出处】原创内容,盗版必究。频传输给运维人员观看。这样可以解决服务端转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net存储占用过多的问题。另外,ffmpeg已经出了webassembl著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。y版本,这让我们可以在前端浏览器中,对视频进行【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】转化、裁剪、截图、修改、压缩等。

转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】

结语原创内容,盗版必究。

原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net

Webrtc是web标准中关于流式数据实【原创内容,转载请注明出处】【本文受版权保护】时传输的重要标准,而录屏能力,在直播、网【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。课、用户行为监控等方面,都给我提供了一定【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。的想象空间。我在最新一期的《Robust》【转载请注明来源】中提到音视频应用、5G等基础设施层面、消【本文受版权保护】【原创不易,请尊重版权】费层面的相关逻辑,新的一年在webrtc著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】这个点上,会给我们带来更多想象空间。如果【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】你也对相关领域感兴趣,不妨一起来试试。

原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】【未经授权禁止转载】

2021-01-10 7394 ,

为价值买单,打赏一杯咖啡

本文价值73.94RMB