在上一篇开发基础上,已经实现了音视频通话。本文是在此基础上继续完成以下内容

  • 关闭/开启音频
  • 开启/关闭视频
  • 屏幕共享

开启/关闭音频

javaScript

/**
* 静音
*/
mute() {
if (!currentSession) {
layer.msg("请先建立视频通话");
return false;
}
var pc = currentSession.sessionDescriptionHandler.peerConnection;
if (pc.getSenders) {
pc.getSenders().forEach(function (sender) {
if (sender.track.kind === 'audio') {
sender.track.enabled = false
layer.msg('您已开启静音');
}
});
} else {
pc.getLocalStreams().forEach(function (stream) {
stream.getAudioTracks().forEach(function (track) {
if (track.kind === 'audio') {
track.enabled = false;
layer.msg('您已开启静音');
}
});
});
}
}
/**
* 解除静音
*/
unmute() {
if (!currentSession) {
layer.msg("请先建立视频通话");
return false;
}
var pc = currentSession.sessionDescriptionHandler.peerConnection;
if (pc.getSenders) {
pc.getSenders().forEach(function (sender) {
if (sender.track.kind === 'audio') {
sender.track.enabled = true
layer.msg('您已解除静音');
}
});
} else {
pc.getLocalStreams().forEach(function (stream) {
stream.getAudioTracks().forEach(function (track) {
if (track.kind === 'audio') {
track.enabled = true
layer.msg('您已解除静音');
}
});
});
}
}

功能截图稍后补充

开启/关闭视频

javaScript

 /**
* 打开视频
*/
openVideo() {
if (!currentSession) {
layer.msg("请先建立视频通话");
return false;
}
var pc = currentSession.sessionDescriptionHandler.peerConnection;
if (pc.getSenders) {
pc.getSenders().forEach(function (sender) {
if (sender.track.kind === 'video') {
sender.track.enabled = true
layer.msg('您已打开视频');
}
});
} else {
pc.getLocalStreams().forEach(function (stream) {
stream.getAudioTracks().forEach(function (track) {
if (track.kind === 'video') {
track.enabled = true
layer.msg('您已打开视频');
}
});
});
}
}
/**
* 关闭视频
*/
closeVideo() {
if (!currentSession) {
layer.msg("请先建立视频通话");
return false;
}
var pc = currentSession.sessionDescriptionHandler.peerConnection;
if (pc.getSenders) {
pc.getSenders().forEach(function (sender) {
if (sender.track.kind === 'video') {
sender.track.enabled = false
layer.msg('您已关闭视频');
}
});
} else {
pc.getLocalStreams().forEach(function (stream) {
stream.getAudioTracks().forEach(function (track) {
if (track.kind === 'video') {
track.enabled = false
layer.msg('您已关闭视频');
}
});
});
}
}

功能截图稍后补充

屏幕共享

javaScript

  /**
* 屏幕流
*/
shareScreenStream() {
if (currentSession == null) {
layer.msg("请先建立视频通话");
return false;
}
var pc = currentSession.sessionDescriptionHandler.peerConnection;
const displayMediaStreamConstraints = {
video: {
cursor: "always"
},
audio: true
};
//获取分享窗口流
if (navigator.mediaDevices.getDisplayMedia) {
navigator.mediaDevices.getDisplayMedia(displayMediaStreamConstraints).then(mediaStream => {
localVideo.srcObject = mediaStream
pc.getSenders().forEach(sender => {
if (sender.track.kind == 'video') {
var res = sender.replaceTrack(mediaStream.getVideoTracks()[0])
console.log(res)
}
});
//监听手动点击“停止分享”
mediaStream.getVideoTracks()[0].onended = () => {
layer.msg("桌面共享已关闭,正在切换为摄像头数据,请稍后...")
SCREENSHARDING.switchCamera(pc)
}
}).catch(error => {
console.log("error", error)
layer.msg("媒体设备获取异常")
});
} else {
console.log("navigator.mediaDevices.getDisplayMedia false");
layer.msg("浏览器不不支持")
}
},
/**
* 切换为摄像头数据
*/
switchCamera(pc) {
var constraints = {
audio: {
autoGainControl: true,
// 噪音消除
noiseSuppression: true,
// 设置降噪
echoCancellation: true
},
video: true
}
navigator.mediaDevices.getUserMedia(constraints).then(stream => {
localVideo.srcObject = stream
pc.getSenders().forEach(sender => {
if (sender.track.kind == 'video') {
sender.replaceTrack(stream.getVideoTracks()[0]) }
});
}).catch(error => {
layer.msg('切换摄像头失败');
console.error('切换摄像头失败,失败原因:', error)
});
}

功能截图稍后补充

Web网页音视频通话之基于sipjs功能扩展的更多相关文章

  1. 基于 Web SDK 实现视频通话场景 | 声网 SDK 教程

    声网视频 SDK 被广泛应用于多种实时互动场景中,例如视频会议.视频通话.音视频社交.在线教育等.为了让刚刚接触声网 SDK 的开发者,可以更顺畅地实现基础的视频通话功能,我们基于声网 Web SDK ...

  2. JS实现Web网页打印功能(IE)

    问题描述:     JS实现Web网页打印功能 问题解决:     这里主要使用WebBrowser控件的ExeWB在IE中打印功能的实现 WebBrowser介绍:         WebBrows ...

  3. charles功能(五)屏蔽web网页的抓包信息(proxy)

    应用场景:屏蔽web网页的抓包信息 proxy-->windows proxy(前面没有对勾,就不会抓到 PC浏览器的包) proxy-->macOS proxy(mac电脑) 最终效果

  4. iOS下WebRTC音视频通话(一)

    在iOS下做IM功能时,难免都会涉及到音频通话和视频通话.QQ中的QQ电话和视频通话效果就非常好,但是如果你没有非常深厚的技术,也没有那么大的团队,很难做到QQ那么快速和稳定的通话效果. 但是利用We ...

  5. 一、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-项目引言

    项目文章索引 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入框扩展面板的 ...

  6. web网页中使用vlc插件播放相机rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 使用vlc播放器播放rtsp视频 使用vlc进行二次开发做自己的播放器 vlc功能还是很强大的,有很多的现成的二次开发接口,不需配置太多即可轻松做客户端播放 ...

  7. 免费的在线Web文件管理器:Net2FTP,Pydio,eXtplorer,KodExplorer–功能强大

    https://www.freehao123.com/web-ftp/ 经常有朋友在使用一些没有带文件管理器的空间时,苦于没有办法来解压上传的文件压缩包,而如果不先上传压缩包,直接上传文件夹的话耗费的 ...

  8. iOS下WebRTC音视频通话(二)-局域网内音视频通话

    这里是iOS 下WebRTC音视频通话开发的第二篇,在这一篇会利用一个局域网内音视频通话的例子介绍WebRTC中常用的API. 如果你下载并编译完成之后,会看到一个iOS 版的WebRTC Demo. ...

  9. web网页练习

    一. HTML部分 1. XHTML和HTML有什么区别 HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同: XHTML 元素必须被正确地嵌套. XHTML 元 ...

  10. TI IPNC Web网页之网页修改教程

    web网页程序修改 打开gStudio之后,点击菜单栏中Help->Contents.先把这个诡异的编程语言看一遍吧.这里搬一些东西出来. GoDB简介 从第一副图片中,我们可以看出,从源文件到 ...

随机推荐

  1. Redis 数据类型 String

    Redis 数据类型 String Redis主要支持的数据类型有5种:String ,Hash ,List ,Set ,和 Sorted Set Redis 常用命令,思维导图 >>&g ...

  2. Spring @Profile注解使用和源码解析

    介绍 在之前的文章中,写了一篇使用Spring @Profile实现开发环境,测试环境,生产环境的切换,之前的文章是使用SpringBoot项目搭建,实现了不同环境数据源的切换,在我们实际开发中,会分 ...

  3. android studio 做登陆界面

    先来一个最简单的     AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> &l ...

  4. Golang一日一库之logrus

    前言 之前一篇文章介绍了 日志库zap https://www.cnblogs.com/zichliang/p/17311480.html 毋庸置疑,zap库无论是Golang在项目中 还是生产中都极 ...

  5. 30-externals(拒绝某些包被打包进来)

    const { resolve } = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module. ...

  6. mysql+proxysql+replication-manager的主从半同步复制+高可用+读写分离

    环境: AlmaLinux release 9.1 MySQL Community Server Ver 8.0.33 Replication Manager v2.2.40 for MariaDB ...

  7. 笔记:linux必备网络基础概念和以太网技术基础

    笔记:linux必备网络基础概念和以太网技术基础 由于后面可能需要对交换机进行一些配置,所以也是临时学习一下iptables的相关配置,以及一些基本的网络知识,下面就是我看到一些资料做的一些总结,希望 ...

  8. .Net8的快速JIT,分层编译,R2R的设置

    前言 本篇通过一些简单的JIT设置,比如快速JIT,适用于循环的快速 JIT,分层编译,R2R等核心内容设置,快速进入.Net8核心区域. 概括 1.快速JIT 什么是快速JIT,顾名思义,被Rosy ...

  9. abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之上(六十三)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  10. 流计算中kafka的OffsetReset策略

    朋友的公司做的是西南某边境省份网红新能源车的数据处理,由于新能源车的火爆,从年初从现在,数据量已经翻番.但与此同时,服务器却没有多少增加.无奈之下,只能暂时将kafka的数据存储时间由之前的1天改为6 ...