起因是之前刷到一篇文章 扫脸登录网站:这可能是你能找到的最详细的 WebAuthn 中文文章(和 wordpress 插件),想起之前做的搜图库感觉可以应用到这个登录技术上。
于是随手写了个调用摄像头的demo:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 
 | <!DOCTYPE html><html lang="en">
 <head>
 <meta charset="UTF-8">
 <title>Demo</title>
 </head>
 <body>
 <div class="face-scan-box">
 <video id="face-stream" autoplay="autoplay"></video>
 </div>
 <a href="javascript:void(0)" id="scanBtn" class="btn btn-normal btn-primary">扫描</a>
 <script>
 let faceStream = document.querySelector('video')
 document.getElementById('scanBtn').addEventListener('click', function () {
 scanFace()
 })
 
 function scanFace() {
 let constraints = {
 video: true,
 audio: false
 };
 let promise = window.navigator.mediaDevices.getUserMedia(constraints);
 promise.then(function (MediaStream) {
 faceStream.srcObject = MediaStream;
 faceStream.onloadedmetadata = function(e) {
 faceStream.play();
 };
 }).catch(function (PermissionDeniedError) {
 if(PermissionDeniedError.toString() === 'NotFoundError: Requested device not found'){
 console.log('找不到摄像头')
 } else {
 console.log(PermissionDeniedError.toString());
 }
 })
 }
 </script>
 </body>
 </html>
 
 | 
开跑,欸。怎么图出不来?
![]()
看一下console的错误:
NotReadableError Could not start audio source。
是代码的问题吗?
最初的想法是这份代码是不是太旧了,在79到80的版本中chrome放弃兼容了?
查了一下MDN发现这个方法是最新的,navigator.getUserMedia()才是不建议使用的那个。
又莫非最新的方法chrome还没更新进去? 换一份老接口的代码跑一下试试
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 
 | <!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>Jello</title>
 <style>
 video{
 width: 30%;
 height: auto;
 }
 </style>
 </head>
 <body>
 <video autoplay controls></video>
 <button>Open Cam</button>
 <script>
 function getCam(){
 window.navigator.mediaDevices.getUserMedia({video:true}).then((stream)=>{
 document.querySelector("video").srcObject = stream;
 }).catch(err=> console.log(err.name))
 }
 
 document.querySelector("button").addEventListener("click", getCam);
 </script>
 </body>
 </html>
 
 | 
运行之后发现,还是不行。
是chrome浏览器的问题?
于是我打开了Edge尝试运行代码,嗯?居然成功了?
![]()
难道真的会是chrome么?想着就打开了win10虚拟机,里面也装着一个相同版本号(80.0.3987.149)的谷歌浏览器。
于是尝试在虚拟机中跑:(虚拟机可以通过 状态栏-虚拟机-可移动设备 挂载使用本机的摄像头)
![]()
虚拟机中的chrome是能正常使用摄像头的啊,奇怪了。
![]()
是系统升级之后导致的问题?
两者只有win10的版本号有差:虚拟机中的是1903而本机是1909。但要直接重装系统这是万万不行的啊。
找到问题了
后来在google上刷到一篇名为chrome 摄像头打不开的文章,其中有人提到了麦克风也有隐私设置。
之后发现果然不知道啥时候把麦克风的权限关闭了,打开之后一切正常。
![]()