webrtc 视频 demo

webrtc 视频 demo

webrtc网上封装的很多,demo很多都是一个页面里实现的,今天实现了个完整的 , A 发视频给 B

A webrtc.html作为offer 

复制代码
<!DOCTYPE html>
<html id="home" lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scal
able=no"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><style>p { padding: 1em; }li {border-bottom: 1px solid rgb(189, 189, 189);border-left: 1px solid rgb(189, 189, 189);padding: .5em;}</style></head><body><script>var mediaConstraints = {optional: [],mandatory: {OfferToReceiveAudio: false,OfferToReceiveVideo: true}};</script><script>var offerer,answererWinwindow.RTCPeerConnection = window.mozRTCPeerConnection || window.webkit
RTCPeerConnection;window.RTCSessionDescription = window.mozRTCSessionDescription || windo
w.RTCSessionDescription;window.RTCIceCandidate = window.mozRTCIceCandidate || window.RTCIceCand
idate;navigator.getUserMedia = navigator.mozGetUserMedia || navigator.webkitG
etUserMedia;window.URL = window.webkitURL || window.URL;window.iceServers = {iceServers: [{url: 'stun:23.21.150.121'}]};</script><script>/* offerer */function offererPeer(video_stream) {offerer = new RTCPeerConnection(window.iceServers)offerer.addStream(video_stream)offerer.onaddstream = function (event) {// 本地显示video}offerer.onicecandidate = function (event) {if (!event || !event.candidate) returnsendToP2({'action' : 'candidate','candidate' :event.candidate})}offerer.createOffer(function (offer) {offerer.setLocalDescription(offer)sendToP2({'action' : 'create','offer':offer})}, function() {}, mediaConstraints)}</script><script>var video_constraints = {mandatory: {},optional: []}function getUserMedia(callback) {var n = navigatorn.getMedia = n.webkitGetUserMedia || n.mozGetUserMedian.getMedia({audio: false,video: video_constraints}, callback, onerror)function onerror(e) {alert(JSON.stringify(e, null, '\t'))}}</script><script>function sendToP2(data){answererWin.postMessage(JSON.stringify(data) ,
window.location)}function receiveMessage(data){data = JSON.parse(data.data)switch ( data.action) {case 'answer' :offerer.setRemoteDescription(ne
w RTCSessionDescription(data.answer))breakcase "candidate":offerer.addIceCandidate(new RTC
IceCandidate(data.candidate))break}console.log('msg' ,data)}window.addEventListener("message", receiveMessage, fals
e)answererWin = window.open('webrtc2.html' ,'t')getUserMedia(function (video_stream) {offererPeer(video_stream)});</script></body></html>
复制代码

 

B webrtc2.html 作为answer

 

复制代码
<!DOCTYPE html>
<html id="home" lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><link rel="stylesheet" href="https://www.webrtc-experiment.com/style.css"><style>audio, video {-moz-transition: all 1s ease;-ms-transition: all 1s ease;-o-transition: all 1s ease;-webkit-transition: all 1s ease;transition: all 1s ease;vertical-align: top;}p { padding: 1em; }li {border-bottom: 1px solid rgb(189, 189, 189);border-left: 1px solid rgb(189, 189, 189);padding: .5em;}.videos-container {display: inline-block;border: 2px solid black;padding: .1em;border-radius: 0.2em;margin: 2em .2em;background: white;vertical-align: top;}.videos-container h2 {border: 0;border-top: 1px solid black;margin: 0;text-align: center;display:block;}video {width:20em;height: 15em;background: black;}</style><!-- for HTML5 el styling --><script>document.createElement('article');</script></head><body><article><div style="text-align:center;"><div class="videos-container"><video id="peer1-to-peer2" autoplay controls></video><h2>Offerer-to-Answerer</h2></div></div><script>var mediaConstraints = {optional: [],mandatory: {OfferToReceiveAudio: true,OfferToReceiveVideo: true}};</script><script>var offerer, answerer;var offererToAnswerer = document.getElementById('peer1-to-peer2');window.RTCPeerConnection = window.mozRTCPeerConnection || window.webkitRTCPeerConnection;window.RTCSessionDescription = window.mozRTCSessionDescription || window.RTCSessionDescription;window.RTCIceCandidate = window.mozRTCIceCandidate || window.RTCIceCandidate;navigator.getUserMedia = navigator.mozGetUserMedia || navigator.webkitGetUserMedia;window.URL = window.webkitURL || window.URL;window.iceServers = {iceServers: [{url: 'stun:23.21.150.121'}]};</script><script>/* answerer */function answererPeer(offer, video_stream) {answerer = new RTCPeerConnection(window.iceServers);// answerer.addStream(video_stream);answerer.onaddstream = function (event) {offererToAnswerer.src = URL.createObjectURL(event.stream);offererToAnswerer.play();};answerer.onicecandidate = function (event) {if (!event || !event.candidate) return;sendToP1({'action' : 'candidate','candidate' :event.candidate})//offerer.addIceCandidate(event.candidate);};answerer.setRemoteDescription(new RTCSessionDescription(offer));answerer.createAnswer(function (answer) {answerer.setLocalDescription(answer);sendToP1({'action' : 'answer' ,'answer' : answer})//offerer.setRemoteDescription(answer);}, function() {}, mediaConstraints);}function receiveMessage(data){data = JSON.parse(data.data)console.log(data)switch(data.action){case "create":answererPeer(data.offer , data.stream)breakcase "candidate":answerer.addIceCandidate(new RTCIceCandidate(data.candidate))break}}window.addEventListener("message", receiveMessage, false)function sendToP1(data) {opener.postMessage(JSON.stringify(data) , window.location)}</script></article></body></html>
复制代码

 

demo用 postMessage传递数据, 业务使用可以用websocket

A 先 createOffer ,生成的offer 供自己setLocalDescription ,并发给B

B 拿A的offer ,setRemoteDescription(offer) , 然后 createAnswer ,生成的answer 供自己setLocalDescription ,并发给A

A 拿B的answer 设置 setRemoteDescription(answer)

 

 

A onicecandidate 事件被触发 将得到的通道发给B

B addIceCandidate(new RTCIceCandidate(candidate)) 建立通道

B onicecandidate 事件被触发 将得到的通道发给A

A addIceCandidate(new RTCIceCandidate(candidate)) 建立通道

 

通道建立后视频就可以共享了

 

参考网址

http://www.html5rocks.com/en/tutorials/webrtc/basics/?redirect_from_locale=fr
https://github.com/muaz-khan/WebRTC-Experiment/blob/master/demos/client-side.html

转载于:https://www.cnblogs.com/developer-ios/p/6517348.html

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

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

相关文章

[转]阿里开源低代码引擎LowCodeEngine

一、什么是低代码引擎 低代码引擎是具备强大扩展能力的低代码研发框架&#xff0c;使用者只需要基于低代码引擎便可以快速定制符合自己业务需求的低代码平台。同时&#xff0c;低代码引擎还在标准低代码设计器的基础上提供了简单易用的定制扩展能力&#xff0c;能够满足业务独特…

Beyond Istio OSS——Istio服务网格的现状与未来

作者&#xff1a;宋净超&#xff08;Jimmy Song&#xff09;&#xff0c;原文地址&#xff1a;https://jimmysong.io/blog/beyond-istio-oss/本文根据笔者在 GIAC 深圳 2022 年大会上的的演讲《Beyond Istio OSS —— Istio 的现状及未来》[1] 整理而成&#xff0c;演讲幻灯片见…

js多维数组扁平化

数组扁平化&#xff0c;就是将多维数组碾平为一维数组&#xff0c;方便使用。 一&#xff1a;例如&#xff0c;一个二维数组 var arr [a, [b, 2], [c, 3, x]]&#xff0c;将其扁平化&#xff1a; 1. 通过 apply 借用数组的 concat 方法&#xff1a; [].concat.apply([], arr)…

第16讲 用户程序的结构与执行

转载于:https://www.cnblogs.com/atuo/p/5609843.html

两种方法清除Excel保护密码

一、利用VBA脚本直接清除 打Excel&#xff0c;打开脚本编辑器&#xff08;AltF11&#xff09;或者如图&#xff0c;右键sheet名称 输入代码并运行&#xff0c;即可清除密码保护&#xff1a; Sub DeletePW()ActiveSheet.Protect DrawingObjects:True, Contents:True, AllowFil…

jsonp-反向代理-CORS解决JS跨域问题的个人总结

jsonp-反向代理-CORS解决JS跨域问题的个人总结 网上说了很多很多&#xff0c;但是看完之后还是很混乱&#xff0c;所以我自己重新总结一下。解决 js 跨域问题一共有8种方法&#xff0c; jsonp&#xff08;只支持 get&#xff09;反向代理CORSdocument.domain iframe 跨域windo…

EasyNetQ-用于使用 RabbitMQ 的 .NET API开源的工具库

Part1介绍EasyNetQ 的目标是提供一个库&#xff0c;用于在 .NET 中使用 RabbitMQ 尽可能简单。为了做到这一点&#xff0c;它通过强制执行一些简单的约定来以灵活性换取简单性。这些包括&#xff1a;消息应该由 .NET 类型表示。消息应按其 .NET 类型进行路由。这意味着消息是由…

C# 实例解释面向对象编程中的依赖反转原则

在面向对象编程中&#xff0c;SOLID 是五个设计原则的首字母缩写&#xff0c;旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特C马丁(Robert Cecil Martin)提出的许多原则的子集&#xff0c;在他2000年的论文《设计原则与设计模式》中首次提出…

Linux学习笔记之一————什么是Linux及其应用领域

1.1认识Linux 1&#xff09;什么是操作系统 2&#xff09;现实生活中的操作系统 win7 Mac Android iOS 3&#xff09; 操作系统的发展史 &#xff08;1&#xff09;Unix 1965年之前的时候&#xff0c;电脑并不像现在一样普遍&#xff0c;它可不是一般人能碰的起的&#xff0c;…

Lucene详解

一.lucene原理 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包&#xff0c;是一个全文检索引擎的架构&#xff0c;提供了完整的查询引擎和索引引擎&#xff0c;部分文本分析引擎。它不是一个完整的搜索应用程序&#xff0c;而是为你的应用程序提供索引和搜索功能…

.NET 6.0中使用Identity框架实现JWT身份认证与授权

原文作者&#xff1a;Sarathlal Saseendran原文链接&#xff1a;https://www.c-sharpcorner.com/article/jwt-authentication-and-authorization-in-net-6-0-with-identity-framework/翻译&#xff1a;沙漠尽头的狼&#xff08;谷歌翻译加持&#xff09;介绍微软于 2021 年 11 …

adb devices 里面有很多 emulator-XXXX的解决方法

2019独角兽企业重金招聘Python工程师标准>>> adb kill-server 转载于:https://my.oschina.net/sfshine/blog/700354

MQ(Message Queue)简介

一、何为MQ&#xff1f; MQ全称为Message Queue, 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息&#xff08;针对应用程序的数据&#xff09;来通信&#xff0c;而无需专用连接来链接它们。消息传递指的是程序之间通…

Blazor University (39)JavaScript 互操作 —— 更新 document title

原文链接&#xff1a;https://blazor-university.com/javascript-interop/calling-javascript-from-dotnet/updating-the-document-title/更新 document title源代码[1]在创建 Blazor 布局[2]部分中&#xff0c;我们看到了 Blazor 应用程序如何存在于 HTML&#xff08;或 cshtm…

IIS 日志文件位置

IIS 6 Log files location IIS 6中日志文件的位置%windir%\System32\LogFilesIIS 7 Log files location IIS的日志文件的位置%SystemDrive%\inetpub\logs\LogFiles用户每打开一次网页&#xff0c;iis 都会记录用户IP、访问的网页地址、访问时间、访问状态等信息&#xff0c;这些…

APP测试流程和测试点

1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间&#xff0c;一般测试时间为两三周&#xff08;即15个工作日&#xff09;&#xff0c;根据项目情况以及版本质量可适当缩短或延长测试时间。正式测试前先向主管确认项目排期。 1.3测试资源 测…

39所强基计划试点高校已全部公布招生简章

截至目前(4月8日下午) 39所强基计划试点高校 已全部公布招生简章 各高校招生要求是什么&#xff1f; 招生专业有哪些&#xff1f; 什么时候报名&#xff1f; 一起来看 北京大学 招生对象及报名条件 各省&#xff08;区、市&#xff09;符合2022年全国普通高等学校招生统…

【ArcGIS错误异常100问】之001:License服务无法启动权威解决办法

测试环境&#xff1a; 操作系统&#xff1a;Windows10ArcGIS版本&#xff1a;10.X结果&#xff1a;通过测试 文章目录1. 错误提示2. 问题分析3. 解决办法3.1 关闭Windows Defender3.2 关闭系统防火墙3.3 删除迈克菲&#xff08;McAfee&#xff09;杀毒软件3.4 在系统服务中启动…

ASP.NET Core 技术内幕与项目实战读后感

前几天拿到了杨中科老师的新书《ASP.NET Core 技术内幕与项目实战》&#xff0c;迫不及待的“两”口气读完了。用一句话来总结&#xff0c;这是一本写给.NET开发者的非常实用的接地气的好书&#xff0c;感觉有必要自发为这本书宣传一波。杨老师在 .NET 开发者社区中的知名度非常…

avalon2学习教程15指令总结

avalon的指令在上一节已经全部介绍完毕&#xff0c;当然有的语焉不详&#xff0c;如ms-js。本节主要总结我对这方面的思考与探索。 MVVM的成功很大一语分是来自于其指令&#xff0c;或叫绑定。让操作视图的功能交由形形式式的指令来代劳。VM&#xff0c;成了一个大管家。它只一…