基于canvas+webrtc 实现流式渲染 1

摘要:
webrtc是点对点的服务,主要表现webrtc的通信原理,在本创建两个通信实例,实时操作canvas,同步到video上知识点:媒体流https://developer.mozilla.org/zh-CN/docs/Web/API/MediaStreamMSE:媒体源扩展API提供了实现无插件且基于Web的流媒体的功能。canvaswebrtc1.peer-to-peer点对点的步骤:1.pc2监听webrtc,vedio监听组件传入mediastreamconstvideo=document.getElementById;functiongotRemoteStream{if(video.srcObject!==e.streams[0]){video.srcObject=e.streams[0];console.log;}}video.addEventListener;2.pc1canvans捕捉画布,通过webrtc发送blob//webrtc官方文档https://developer.mozilla.org/zh-CN/docs/Web/API/RTCPeerConnection/createOfferconstcanvas=document.getElementById;conststream=canvas.captureStream();console.log;//创建一个新建的RTCPeerConnection实例,它代表了本地端机器与远端机器的一条连接。

官方文档webrtc:https://developer.mozilla.org/zh-CN/docs/Web/API/RTCPeerConnection

流式渲染最经典的场景是来自于steam 游戏, 可以通过云服务做gpu的计算,最后将视频流到客户端上(看上去很黑科技,其实不好用...)。 作为技术思路 前端方面也可以做类似的尝试。

webrtc 是点对点的服务,主要表现webrtc的通信原理,在本创建两个通信实例,实时操作canvas,同步到video上

知识点 :

媒体流(MediaStream)

https://developer.mozilla.org/zh-CN/docs/Web/API/MediaStream

MSE(Media Source Extensions):

媒体源扩展 API(MSE) 提供了实现无插件且基于 Web 的流媒体的功能。使用 MSE,媒体串流能够通过 JavaScript 创建,并且能通过使用<audio><video>元素进行播放。(图片视频直播都是流)

场景:基于mse的能力,可以通过blob url 向vedio标签中灌入二进制流(fpm4格式流), 或者通过canvas组件实现直播。

canvas(fabric.js)

webrtc(adapter.js)

1.peer-to-peer 点对点的

步骤:

1. pc2 监听webrtc , vedio监听组件传入mediastream

const video = document.getElementById('video');

function gotRemoteStream(e) {
  if (video.srcObject !== e.streams[0]) {
    video.srcObject = e.streams[0];
    console.log('pc2 received remote stream');
  }
}

video.addEventListener('loadedmetadata', function() {
  console.log(`Remote video videoWidth: ${this.videoWidth}px,  videoHeight: ${this.videoHeight}px`);
});


2.pc1 canvans 捕捉画布,通过webrtc 发送blob

//webrtc 官方文档  https://developer.mozilla.org/zh-CN/docs/Web/API/RTCPeerConnection/createOffer

const canvas = document.getElementById('canvas');

const stream = canvas.captureStream();
console.log('Got stream from canvas');


//创建一个新建的  RTCPeerConnection实例,它代表了本地端机器与远端机器的一条连接。
let pc1 = new RTCPeerConnection(servers);
pc1.onicecandidate = e => onIceCandidate(pc1, e);
pc1.oniceconnectionstatechange = e => onIceStateChange(pc1, e);
stream.getTracks().forEach(
    track => {
        pc1.addTrack(
            track,
            stream
        );
    }
);
// pc1 端通过 createOffer 动创建一个SDP offer,启动一个新的WebRTC去连接远程端点
pc1.createOffer(onCreateOfferSuccess, ()=>{}, offerOptions);

function onCreateOfferSuccess(desc) {

    //setlocaldescription( ) 设置本地的描述信息

    pc1.setLocalDescription(desc, () => {}, ()=>{});

    // setRemoteDescription,设置远端的描述信息。

    pc2.setRemoteDescription(desc, () => {}, ()=>{});

    // pc2端 通过createAnswer 创建出自己的 SDP 描述
    pc2.createAnswer(onCreateAnswerSuccess, ()=>{});
}

function onCreateAnswerSuccess(desc) {

    pc2.setLocalDescription(desc, () => {}, onSetSessionDescriptionError);

    pc1.setRemoteDescription(desc, () => {}, onSetSessionDescriptionError);
}

免责声明:文章转载自《基于canvas+webrtc 实现流式渲染 1》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows访问Linux下的共享目录的配置方法定时任务、间隔执行任务实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

当微信小程序遇到AR(二)

当微信小程序遇到AR,会擦出怎么样的火花?期待与激动......通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习。注册地址=˃注册成功之后,需要下载微信小程序开发工具。下载地址=˃目前笔者的开发环境是:Windows10下载的微信小程序版本为:RCv1.0.2.1909111 打开,微信开发者工具之后,会看到如下的页面。...

java.net.URISyntaxException的解决办法

直接采用Stringurl=“http:count=1”;HttpGethttpget=新的HttpGet(url);HttpResponseresponse=client.execute(httpget);例如,“|”&amp;因此,不能直接使用String而不是URI来访问。然后我们可以使用URL生成URI的方法来解决这个问题。代码如下:URLu...

libffi

Thisislibffi.info,由libffi.texi生产的bymakeinfo版本5.1。本手册适用于libffi,一个可移植的外国函数接口库。版权所有(C)200820102011redhat,股份有限公司。许可授予复制、分发...

ZFS文件系统及Freenas介绍

作为OpenSolaris开源计划的一部分,ZFS于2005年11月发布。它被Sun称为终极文件系统,已经积极开发了10年。ZFS的最大优点之一是,当将其他磁盘添加到池中时,现有文件系统可以自动增长。ZFS使用快照来跟踪文件系统中的更改。5.数据完整性验证和自动修复当新数据写入ZFS时,将创建数据的校验和,从而允许文件系统分叉到新数据集中。...

SkyWalking 服务端配置

在安装基于Docker的ElasticSearch时,在为什么需要链接跟踪一章中,我们介绍了几种SkyWalking存储解决方案。官方推荐的解决方案是ElasticSearch,因此我们需要首先安装Elastic搜索。...

Redis的安装和简单使用

Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。Redis安装1、要安装Redis,首先要获取安装包。这是访问Redis时所需的密码,一般测试情况下可以不用设定密码。再在右侧找到Redis名称的服务,查看...