mediaDevices-getUserMedia-getDisplayMedia
转载:https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices
enumerateDevices()
获取有关系统上可用的媒体输入和输出设备的一系列信息。
getSupportedConstraints()
返回符合MediaTrackSupportedConstraints指示MediaStreamTrack接口支持哪些可约束属性的对象。见能力和限制在媒体捕获和流API(流媒体),以了解更多关于限制和如何使用它们。
getDisplayMedia()
提示用户选择一个显示或显示的一部分(例如窗口)以作为MediaStream共享或记录目的进行捕获。返回一个解析为 a 的承诺MediaStream。
try {let mediaStream = await navigator.mediaDevices.getDisplayMedia({video:true});videoElement.srcObject = mediaStream;
} catch (e) {console.log('Unable to acquire screen capture: ' + e);
}
getUserMedia()
在用户通过提示许可的情况下,打开系统上的摄像头和/或麦克风,并提供MediaStream包含视频轨道和/或音频轨道的输入。
'use strict';// Put variables in global scope to make them available to the browser console.
var video = document.querySelector('video');
var constraints = window.constraints = {audio: false,video: true
};
var errorElement = document.querySelector('#errorMsg');navigator.mediaDevices.getUserMedia(constraints)
.then(function(stream) {var videoTracks = stream.getVideoTracks();console.log('Got stream with constraints:', constraints);console.log('Using video device: ' + videoTracks[0].label);stream.onremovetrack = function() {console.log('Stream ended');};window.stream = stream; // make variable available to browser consolevideo.srcObject = stream;
})
.catch(function(error) {if (error.name === 'ConstraintNotSatisfiedError') {errorMsg('The resolution ' + constraints.video.width.exact + 'x' +constraints.video.height.exact + ' px is not supported by your device.');} else if (error.name === 'PermissionDeniedError') {errorMsg('Permissions have not been granted to use your camera and ' +'microphone, you need to allow the page access to your devices in ' +'order for the demo to work.');}errorMsg('getUserMedia error: ' + error.name, error);
});function errorMsg(msg, error) {errorElement.innerHTML += '<p>' + msg + '</p>';if (typeof error !== 'undefined') {console.error(error);}
}
if (navigator.mediaDevices) {console.log('getUserMedia supported.');var constraints = { audio: true };var chunks = [];navigator.mediaDevices.getUserMedia(constraints).then(function(stream) {var mediaRecorder = new MediaRecorder(stream);visualize(stream);record.onclick = function() {mediaRecorder.start();console.log(mediaRecorder.state);console.log("recorder started");record.style.background = "red";record.style.color = "black";}stop.onclick = function() {mediaRecorder.stop();console.log(mediaRecorder.state);console.log("recorder stopped");record.style.background = "";record.style.color = "";}mediaRecorder.onstop = function(e) {console.log("data available after MediaRecorder.stop() called.");var clipName = prompt('Enter a name for your sound clip');var clipContainer = document.createElement('article');var clipLabel = document.createElement('p');var audio = document.createElement('audio');var deleteButton = document.createElement('button');clipContainer.classList.add('clip');audio.setAttribute('controls', '');deleteButton.innerHTML = "Delete";clipLabel.innerHTML = clipName;clipContainer.appendChild(audio);clipContainer.appendChild(clipLabel);clipContainer.appendChild(deleteButton);soundClips.appendChild(clipContainer);audio.controls = true;var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });chunks = [];var audioURL = URL.createObjectURL(blob);audio.src = audioURL;console.log("recorder stopped");deleteButton.onclick = function(e) {evtTgt = e.target;evtTgt.parentNode.parentNode.removeChild(evtTgt.parentNode);}}mediaRecorder.ondataavailable = function(e) {chunks.push(e.data);}}).catch(function(err) {console.log('The following error occured: ' + err);})
}
// Prefer camera resolution nearest to 1280x720.
var constraints = { audio: true, video: { width: 1280, height: 720 } };navigator.mediaDevices.getUserMedia(constraints)
.then(function(mediaStream) {var video = document.querySelector('video');video.srcObject = mediaStream;video.onloadedmetadata = function(e) {video.play();};
})
.catch(function(err) { console.log(err.name + ": " + err.message); }); // always check for errors at the end.
selectAudioOutput()
提示用户选择特定的音频输出设备。
getDisplayMedia
let mediaRecorder;
const tracks = []; // 媒体数据function init() {const options = {mimeType: "video/webm; codecs = vp8", // 媒体格式};let constraints = { video: true };// 初始化请求用户授权监控(视频共享)navigator.mediaDevices.getDisplayMedia(constraints).then((stream) => {// 对音视流进行操作// start(stream);live(stream);});// 开始录制方法function start(stream) {// 创建 MediaRecorder 的实例对象,对指定的媒体流进行录制mediaRecorder = new MediaRecorder(stream, options);// 当生成媒体流数据时触发该事件,回调传参 event 指本次生成处理的媒体数据mediaRecorder.ondataavailable = (event) => {if (event.data && event.data.size && event.data.size > 0) {tracks.push(event.data); // 存储媒体数据}};mediaRecorder.start();console.log("************开始录制************");}
}// 结束录制方法
function stop() {mediaRecorder.stop();console.log("************录制结束************");
}
// 定义constraints数据类型
// interface constraints {// audio: boolean | MediaTrackConstraints, // 指定是否请求音轨或者约束轨道属性值的对象
// video: boolean | MediaTrackConstraints, // 指定是否请求视频轨道或者约束轨道属性值的对象
// }
// 直播
function live(stream) {const video = document.getElementById("video");video.srcObject = window.stream || stream;video.controls = true;video.play();
}// 回放录制内容
function replay() {const video1 = document.getElementById("video");const blob = new Blob(tracks, { type: "video/webm" });video1.src = window.URL.createObjectURL(blob);video.srcObject = null;video1.controls = true;video1.play();
}
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'"><meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'"> --><!-- <meta name="description"content="default-src script-src 'self' 'sha256-ThhI8UaSFEbbl6cISiZpnJ4Z44uNSq2tPKgyRTD3LyU='"> --><!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self' data:gap: http://www.visitsingapore.comhttps://ssl.gstatic.com 'unsafe-eval';style-src 'self' 'unsafe-inline';media-src *;script-src 'sha256-V+/U3qbjHKP0SaNQhMwYNm62gfWX4QHwPJ7We1PXokI='
"> --><!-- <meta http-equiv="Content-Security-Policy" content="default-src 'none' data:gap: http://www.visitsingapore.comhttps://ssl.gstatic.com 'unsafe-eval';style-src '*' 'unsafe-inline';media-src *;script-src 'sha256-V+/sha256-ThhI8UaSFEbbl6cISiZpnJ4Z44uNSq2tPKgyRTD3LyU='
"> --><!-- <meta http-equiv="Content-Security-Policy"content="default-src *; connect-src * ws://* wss://*; style-src * 'unsafe-inline' 'unsafe-eval'; media-src * ; img-src * data:; font-src * ; script-src * 'unsafe-inline' 'unsafe-eval';" /><meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'"> --><title>Document</title><style>#video {width: 200px;height: 200px;}</style><script src="./index.js"></script></head><body><!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self';script-src 'self' https://example.com 'sha256-base64 encoded hash'"> --><!-- manifest.json:{"manifest_version": 2,"name": "csp test","version": "1.0.0","minimum_chrome_version": "46","content_security_policy": "script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='","background": {"page": "background.html"}} --><!-- <!DOCTYPE html><html><head><meta http-equiv="Content-Security-Policy"content="script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='"></head><body><script>alert('foo');</script></body></html> --><button id="init">init</button><button id="stop">停止</button><button id="replay">replay</button><button id="live">live</button><video width="300" height="300" id="video"></video><!-- <vodie id="video"></vodie> --><script>document.getElementById('init').onclick = function () {init()};document.getElementById('stop').onclick = function () {stop()};document.getElementById('replay').onclick = function () {replay()};document.getElementById('live').onclick = function () {live()}</script></body></html>
案例
```javascript
const recordBtn = document.querySelector(".record-btn");
const player = document.querySelector(".audio-player");if (navigator.mediaDevices.getUserMedia) {var chunks = [];const constraints = { audio: true };navigator.mediaDevices.getUserMedia(constraints).then(stream => {console.log("授权成功!");const mediaRecorder = new MediaRecorder(stream);recordBtn.onclick = () => {if (mediaRecorder.state === "recording") {mediaRecorder.stop();recordBtn.textContent = "record";console.log("录音结束");} else {mediaRecorder.start();console.log("录音中...");recordBtn.textContent = "stop";}console.log("录音器状态:", mediaRecorder.state);};mediaRecorder.ondataavailable = e => {chunks.push(e.data);};mediaRecorder.onstop = e => {var blob = new Blob(chunks, { type: "audio/ogg; codecs=opus" });chunks = [];var audioURL = window.URL.createObjectURL(blob);player.src = audioURL;};},() => {console.error("授权失败!");});
} else {console.error("浏览器不支持 getUserMedia");
}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>audio record</title>
</head>
<body><div class="app"><button class="record-btn">record</button><audio controls class="audio-player"></audio></div><script src="./recorder.js"></script>
</body>
</html>
mediaDevices-getUserMedia-getDisplayMedia相关推荐
- `MediaDevices.getUserMedia` `undefined` 的问题
通过 MediaDevices.getUserMedia() 获取用户多媒体权限时,需要注意其只工作于以下三种环境: localhost 域 开启了 HTTPS 的域 使用 file:/// 协议打开 ...
- H5通过navigator.mediaDevices.getUserMedia调用手机摄像头
navigator.mediaDevices.getUserMedia 应项目要求,需要实现移动端app嵌入H5页面完成实人认证的功能.打开getUserMedia文档,链接如下: https://d ...
- uniapp调用手机摄像头_HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题...
navigator.mediaDevices.getUserMedia 应项目要求,需要实现移动端app嵌入H5页面完成实人认证的功能.打开getUserMedia文档,链接如下: https://d ...
- MediaDevices html5,HTML5如何通过navigator.mediaDevices.getUserMedia调用手机摄像头
HTML5如何通过navigator.mediaDevices.getUserMedia调用手机摄像头 发布时间:2021-05-23 15:03:11 来源:亿速云 阅读:76 作者:小新 这篇文章 ...
- MediaDevices html5,HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
.kind === 'videoinput') { carema.push(deviceInfos.deviceId) } } deviceInfoId = carema[后置位置]; } var c ...
- Vue 使用 navigator.mediaDevices.getUserMedia 调用本地摄像头实现录像以及拍照功能
目录 前言 API `MediaDevices.getUserMedia()` 拍照功能实例 完整代码 实现效果 录像功能实例 完整代码 实现效果 总结 前言 最近在做开源实例: Vue.js 实战系 ...
- 前端使用navigator.mediaDevices.getUserMedia和window.MediaRecorder实现调用摄像头录制视屏
前端使用navigator.mediaDevices.getUserMedia和window.MediaRecorder实现调用摄像头录制视屏 一.navigator.mediaDevices.get ...
- navigator.mediaDevices.getUserMedia录制桌面视频并保存
如果,需要同时录制麦克风声音以及桌面声音,请看最后 以下代码中有用到electron的desktopCapturer模块(用于PC应用开发),如果你并不需要,可以直接忽略,直接定义你要录制的视频源和音 ...
- H5 MediaDevices方法,调用摄像头、屏幕录像功能
使用浏览器调用电脑得 摄像头功能 这次公司得项目需求,让我完成一个功能,当有电脑摄像头时,就使用,如果没有那么就使用屏幕得录像功能 首先是语法: 可以参考一下MDN 申明,以下代码凡是用到this.变 ...
- android webview getusermedia,如何从Webview中访问摄像头?
通过WebRTC,getUserMedia肯定可行. 设置您的WebView允许的权限,并使用loadURL()加载HTML: WebView myWebView = (WebView) findVi ...
最新文章
- 实战 用户登录、session校验、分布式存储session
- R语言使用ggpubr包的ggbarplot函数可视化分组条形图(grouped bar plot)、并添加误差条(error bar、误差条显示平均值+/-sd)、不添加填充色、添加jitter抖动
- PandasGUI:使用图形用户界面分析 Pandas 数据帧
- [转载] QoS的基本原理
- 超级智能玩具《小小机器人》|全新50种玩法,创造力之源
- android 访问服务器sql_XSS 攻击、CSRF 攻击、SQL 注入、流量劫持(DNS 劫持、HTTP 劫持)—— 浏览器安全
- python第十六课——ascii码
- Python 的类的下划线命名有什么不同?
- adminLTE的介绍
- Ubuntu 网易云音乐 Linux 官方版本下载安装
- 数据分析团队的搭建与思考
- DeepMind AlphaStar星际争霸2首秀:Demo很强大,但现场比赛输了
- summernote富文本编辑器基本使用
- 入门3D游戏建模,是选择角色建模还是场景建模,看完你来选
- 保护手机隐私最关键是提高全民信息安全意识
- BPM 是与非 -- 什么是BPM,如何辨别是否BPM产品,以及如何选择BPM产品
- 怎样用Java求水仙花数和水仙花数的数量
- 小程序为什么如此受欢迎?如何实现小程序互推呢?
- flash player调试
- 多线程5:对象的发布与逸出(线程安全性)
热门文章
- 太经典了!NBA球员超逗的豪言壮语
- 递归全排列 python实现
- 设计模式期末考试复习客观题
- C语言题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
- c语言能运行情书,用C语言写的情书
- 数据库查询语句遇到:Unknown column ‘XXXX‘ in ‘where clause‘解决方法
- 运动规划,路径规划和轨迹规划的关系(补充路径跟踪和轨迹跟踪)
- 物联网资产标记方法介绍
- java 音频转mp3,java实现wavToMP3格式转换
- Java ZipOutputStream 的使用,实现压缩文件