通过WebRTC简单实现媒体共享
通过WebRTC简单实现媒体共享
媒体协商

- 在设置本地描述符(offer/answer)前,我们总是需要将媒体添加到连接中,只有这样在描述符中才能包含需要共享的媒体信息,除非你不需要共享媒体。
- 在实际应用中,我们通常没办法让两个客户端直接通信,进行媒体协商。因此我们通常需要一个双方都可以访问的中间服务器交换彼此的属性描述符这个服务器称之为信令服务器。建议使用websocket。
//以下代码并没用实现如何接收和发送描述符,这里只展示了接收到对应信息后应该如何设置。接收和发送属性描述符应该由具体业务决定
const pc = new RTCPeerConnection();
//这里是共享屏幕的方法
function screenSharing(){
navigator.mediaDevices.getDisplayMedia({
video: true,
audio: true
}).then((stream) => {
//将本地流添加到连接器中
stream.getTracks().forEach((track) => {
pc.addTrack(track, stream);
});
//createOffer
pc.createOffer()
.then(async (desc) => {
//设置本地描述
await this.pc.setLocalDescription(desc);
//发送offer
//发送offer代码省略,你可以使用如何方式将offer发送到另一个客户端
}).catch((err) => {
//这里是错误处理
});
}).catch((err) => {
//这里是错误处理
});
}
//接送到远程的answer后调用
function setRemoteAnswer(Answer){
pc.setRemoteDescription(new RTCSessionDescription(Answer));
}
//接收到远程的offer后调用
function setRemoteOffer(Offer) {
pc.setRemoteDescription(new RTCSessionDescription(data.desc))
.then(() => {
pc.createAnswer().then((desc) => {
pc.setLocalDescription(desc)
.then(() => {
//这里是发送answer应答
//发送answer代码省略,你可以使用如何方式将answer发送回offer发送的客户端
})
})
})
}
//创建pc的实例后调用
function setRemoteMedia(){
pc.ontrack = (e) => {
//这里是处理接收的远程媒体。这个示例表示将媒体流在id为remoteVideo 的video元素中播放
//在用户没有和页面有互操作前,可能无法直接播放
let video = document.getElementById("remoteVideo") as HTMLVideoElement;
video.srcObject = e.streams[0];
video.onloadedmetadata = (e) => {
video.play();
}
}
}
//创建pc的实例后调用
function setRemoteMedia(){
pc.onicecandidate = (e: RTCPeerConnectionIceEvent) => {
//这里会在协商完成后发送ice候选
//发送ice代码省略
}
}
//收到ice候选后的调用
function SetRemoteIce(candidate){
pc.addIceCandidate(new RTCIceCandidate(candidate))
.then(() => {
//这里成功设置了ice候选
})
}
更详细信息可参考一下文档
通过WebRTC简单实现媒体共享的更多相关文章
- Win7共享文件夹简单?这个共享问题可以难倒90%的人
信息化社会,没有哪个公司不用电脑办公了.一个办公室里面的同事相互之间利用系统的共享功能,共享一些文件和软件已经是司空见惯的了,这个不需要多么复杂的操作.我们使用最多的windows7操作系统就能很方便 ...
- 简单解决XP共享连接数10限制(转)
1.建立一个txt文件,在里面输入以下文字:net session /delete /y,并将其保存为clear session.bat文件.net session用于查看本机共享的会话详细情况,可以 ...
- 一个简单的C共享库的创建及Python调用此库的方法
/********************************************************************* * Author : Samson * Date ...
- nginx+tomcat9+redisson+redis+jdk1.8简单实现session共享
一.环境安装 由于资源限制,在虚拟机中模拟测试,一台虚拟机,所有软件均安装到该虚拟机内 安装系统:CentOS Linux release 7.4.1708 (Core) CentOS安装选择版本:B ...
- 简单使用媒体查询@media
@media 可以针对不同的屏幕尺寸设置不同的样式,特别是如果你需要设置设计响应式的页面,@media 是非常有用的. 那媒体查询该如何使用呢? 一.铺垫 1.首先我们在使用 @media 的时候需要 ...
- samba 最简单配置 共享
[root@GitLab ~]# cat /etc/samba/smb.conf [global] workgroup = WORKGROUP server string = David Samba ...
- 简单的session共享的封装
目的 session存储在缓存服务器上(各种缓存服务器上均可,本文以memcached为例),但对开发者来说,他不用关注,只需要调用request.getSession()方法即可获取到session ...
- 实例——简单的Samba共享
服务端配置 # 临时停止iptables service iptables stop # 临时禁用SELinux setenforce 0 # 禁止iptables开机自动启动 chkconfig i ...
- WebRTC介绍及简单应用
WebRTC介绍及简单应用 WebRTC,即Web Real-Time Communication,web实时通信技术.简单地说就是在web浏览器里面引入实时通信,包括音视频通话等. WebRTC实时 ...
- 快速构建Windows 8风格应用21-构建简单媒体播放器
原文:快速构建Windows 8风格应用21-构建简单媒体播放器 本篇博文主要介绍如何构建一个简单的媒体播放器. <快速构建Windows 8风格应用20-MediaElement>博文中 ...
随机推荐
- Rust Rocket简单入门
目录 简介 hello world 常用功能 动态路径 多个片段(segments) 静态文件服务器 简单WebAPI示例 添加依赖 实现接口 接口测试 参考链接 简介 Rust中最知名的两个web框 ...
- golang 依赖控制反转(IoC) 改进版
最近在开发基于golang下的cqrs框架 https://github.com/berkaroad/squat (陆续开发中,最近断了半年,懒了...).这个框架依赖ioc框架,因为之前写了一个io ...
- Dialog源码分析
目录介绍 1.简单用法 2.AlertDialog源码分析 2.1 AlertDialog.Builder的构造方法 2.2 通过AlertDialog.Builder对象设置属性 2.3 build ...
- Redis数据库安装与使用总结
Redis语句总结 一.基本概念 Redis 全称: Remote Dictionary Server(远程字典服务器)的缩写,以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容. 使用 ...
- 记录--通过Promise实现分批处理接口请求
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 如何通过 Promise 实现百条接口请求? 实际项目中遇到需要批量发起上百条接口请求怎么办? 最新案例代码在此!点击看看 前言 不知你项 ...
- 一键生成项目 SpringBoot+MyBatis代码生成器 支持Oracle MySQL PostgreSQL
下载地址 https://github.com/lxw112190/lxw_Helper 如果觉得github下载慢的,可以加我QQ(819069052)我发给你,或者加QQ交流群:758616458 ...
- BlockQNN:NASNet同期,商汤提出block-wise版的MetaQNN | CVPR 2018
作为NASNet的同期论文,BlockQNN同样地将目光从整体网络转换到了block-wise,整体思路大概是MetaQNN的block版,增加了一些细节地小修改.配合Early Stop Strat ...
- python打包Windows.exe程序(pyinstaller)
python打包Windows.exe程序(pyinstaller) 基础命令 pip install pyinstaller 使用pip命令来安装pyinstaller模块. -F: pyinsta ...
- #离线,倒序,线段树#Comet OJ - Contest #15 E 栈的数据结构题
题目 初始时有 \(N\) 个空的栈,编号为 \(1 \sim N\),有以下三种类型的指令: push \(L\) \(R\) \(v\):把编号 \(L \sim R\) 这连续 \(R-L+1\ ...
- #RMQ,动态开点线段树#CF803G Periodic RMQ Problem
题目 给定\(n\)个数,将这个数列复制\(k\)次得到数列\(a\), 对\(a\)满足区间赋值操作和区间最小值询问 \(n\leq 10^5,q\leq 10^5,k\leq 10^4即|a|\l ...