以前在微博看到了@HeeroLaw的文章《经过WebRTC获取摄像头影像》,了解到了getUserMedia这个API,以为挺有意思的,因而亲自试验了一番,作了俩简单的小DEMO。javascript
在@HeeroLaw的文章中,介绍的是navigator.getUserMedia这个API,然而我在MDN上查到的是这个API已经被废弃了,取而代之的是MediaDevices.getUserMedia。html
mediaDevices也是挂在navigator对象下面的,调用方法以下:java
navigator.mediaDevices.getUserMedia(myConstraints).then(function(mediaStream) { /* use the stream */ }).catch(function(err) { /* handle the error */ });
其中myConstraints参数是一个对象,能够指定须要调用的外部媒体设备,目前只有摄像头和麦克风:git
// 同时启用麦克风和摄像头 var myConstraints = { audio: true, video: true }
更为详细的参数介绍,例如视频尺寸以及摄像头和帧率等,请参见MediaDevices.getUserMedia()参数github
须要注意的是,getUserMedia不支持在非安全的页面内调用,须要https支持,在开发阶段则须要使用localhost域来,分别访问百度和新浪微博而后打开控制台输入下面的代码进行测试:web
navigator.mediaDevices.getUserMedia({video:true}).then((stream) => console.log(Object.prototype.toString.call(stream))).catch(error => {console.error(error)})
另外同一域名下首次调用此API须要征求用户赞成。canvas
建立一个video标签安全
<video id="video"></video>
调用getUserMedia将数据显示到video标签ide
var video = document.querySelector('#video') var myConstraints = { video: { facingMode: 'user' // 优先调用前置摄像头 } } navigator.mediaDevices.getUserMedia(myConstraints).then((stream) => { // createObjectURL是个很是有用的API,诸位能够多研究研究 video.src = window.URL.createObjectURL(stream) video.play() }, (error) => { console.error(error.name || error) })
查看在线DEMO测试
由于纯粹用一个audio标签来播放麦克风拾取到的声音显得太没特点了,因而我用到了之前写的一个音频可视化库Vudio.js,代码以下:
建立一个canvas来显示音频波形图
<canvas id="canvas"></canvas>
经过Vudio.js和getUserMedia来显示麦克风拾取到的音频的波形
var canvas = document.querySelector('#canvas') navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => { // 调用Vudio var vudio = new Vudio(stream, canvas, { accuracy: 256, width: 1024, height: 200, waveform: { fadeSide: false, maxHeight: 200, verticalAlign: 'middle', horizontalAlign: 'center', color: '#2980b9' } }) vudio.dance() }).catch((error) => { console.error(error.name || error) })