通过WebRTC简单实现媒体共享

媒体协商

  1. 在设置本地描述符(offer/answer)前,我们总是需要将媒体添加到连接中,只有这样在描述符中才能包含需要共享的媒体信息,除非你不需要共享媒体。
  2. 在实际应用中,我们通常没办法让两个客户端直接通信,进行媒体协商。因此我们通常需要一个双方都可以访问的中间服务器交换彼此的属性描述符这个服务器称之为信令服务器。建议使用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候选
})
}

更详细信息可参考一下文档

  1. 信令与视频通话
  2. RTCPeerConnection

通过WebRTC简单实现媒体共享的更多相关文章

  1. Win7共享文件夹简单?这个共享问题可以难倒90%的人

    信息化社会,没有哪个公司不用电脑办公了.一个办公室里面的同事相互之间利用系统的共享功能,共享一些文件和软件已经是司空见惯的了,这个不需要多么复杂的操作.我们使用最多的windows7操作系统就能很方便 ...

  2. 简单解决XP共享连接数10限制(转)

    1.建立一个txt文件,在里面输入以下文字:net session /delete /y,并将其保存为clear session.bat文件.net session用于查看本机共享的会话详细情况,可以 ...

  3. 一个简单的C共享库的创建及Python调用此库的方法

    /********************************************************************* * Author  : Samson * Date    ...

  4. nginx+tomcat9+redisson+redis+jdk1.8简单实现session共享

    一.环境安装 由于资源限制,在虚拟机中模拟测试,一台虚拟机,所有软件均安装到该虚拟机内 安装系统:CentOS Linux release 7.4.1708 (Core) CentOS安装选择版本:B ...

  5. 简单使用媒体查询@media

    @media 可以针对不同的屏幕尺寸设置不同的样式,特别是如果你需要设置设计响应式的页面,@media 是非常有用的. 那媒体查询该如何使用呢? 一.铺垫 1.首先我们在使用 @media 的时候需要 ...

  6. samba 最简单配置 共享

    [root@GitLab ~]# cat /etc/samba/smb.conf [global] workgroup = WORKGROUP server string = David Samba ...

  7. 简单的session共享的封装

    目的 session存储在缓存服务器上(各种缓存服务器上均可,本文以memcached为例),但对开发者来说,他不用关注,只需要调用request.getSession()方法即可获取到session ...

  8. 实例——简单的Samba共享

    服务端配置 # 临时停止iptables service iptables stop # 临时禁用SELinux setenforce 0 # 禁止iptables开机自动启动 chkconfig i ...

  9. WebRTC介绍及简单应用

    WebRTC介绍及简单应用 WebRTC,即Web Real-Time Communication,web实时通信技术.简单地说就是在web浏览器里面引入实时通信,包括音视频通话等. WebRTC实时 ...

  10. 快速构建Windows 8风格应用21-构建简单媒体播放器

    原文:快速构建Windows 8风格应用21-构建简单媒体播放器 本篇博文主要介绍如何构建一个简单的媒体播放器. <快速构建Windows 8风格应用20-MediaElement>博文中 ...

随机推荐

  1. 什么是XR扩展现实,XR云串流平台有哪些

    什么是云XR (AR/VR/MR/SR) 虚拟现实(VR),传统的实现方式是通过计算机模拟虚拟环境,从而给人一种环境沉浸感.与传统视频相比,VR带来了前所未有的沉浸式体验. 增强现实(AR)是一种无缝 ...

  2. drf(Book序列化练习、user表练习)

    一. APIView版本 1. models.py from django.db import models # Create your models here. class CommonField( ...

  3. 记录--JavaScript 用简约的代码实现一些日常功能

    这里给大家分享我在网上总结出来的一些JavaScript 知识,希望对大家有所帮助 一.日期处理 1. 检查日期是否有效 该方法用于检测给出的日期是否有效: const isDateValid = ( ...

  4. clickhouse在各大厂商的应用

    案例-ClickHouse在头条的技术演进

  5. KingbaseES中不同user之间的权限关系

    1.概念 1.schema是每个database中特有的. schema概念有点像命名空间,这个逻辑空间包含若干表对象. 在DB里面,有了schema才可以创建对象,对象需要依赖于schema,默认为 ...

  6. 字符串 Hash 的一些应用

    字符串 Hash 可以快速的解决一类需要字符串匹配的问题.同时还可以以较小的思维量和代码量通过一些难题. P3809 [模板]后缀排序,这题的正解显然是 $\mathcal{O}(n\log n)$ ...

  7. hadoop集群查看所有主机的jps进程情况脚本文件

    jpsall代码 #!/bin/bash for host in hadoop102 hadoop103 hadoop104 do echo =============== $host ======= ...

  8. 链表栈(LinkedListStack)

      链式栈:就是一种操作受限的单向链表,每次入栈一个元素,向链表中添加一个节点,出栈一个元素,释放一个节点.因为栈具有"后进先出"的特点,如果每次在链表的尾部进行插入和删除,就要遍 ...

  9. 从0开始学杂项 第四期:隐写分析(3) GIF 图片隐写

    Misc 学习(四) - 隐写分析:GIF 图片隐写 在上一期,我主要讲了讲自己对于隐写分析中的 PNG 图片隐写的一些浅薄理解,这一期我们继续对隐写分析的学习,学习的是图片隐写中的 GIF 图片隐写 ...

  10. Avalonia的UI组件

    Avalonia是一个强大的跨平台UI框架,允许开发者构建丰富的桌面应用程序. 它提供了众多UI组件.灵活的布局系统.可定制的样式以及事件处理机制. 在这篇博客中,我们将详细解析Avalonia的UI ...