MediaDevices.getUserMedia()的部分坑和解决方案

按照文档设置了后置参数,却还是显示前置摄像头

解决方案:将文件配置在https环境下就能正常运行

用户第一次误点拒绝授权以后,再次进入页面无法正常唤醒摄像头

解决方案:关闭页面后清除页面cookies,再次进入就能重新授权

部分手机打开摄像头以后是黑屏,但是拍照仍然可以成像

解决方案:做了很多处理都没用,最后发现只要把参数中的分辨率(width,height)删除掉,就解决了黑屏问题

前置摄像头调用后镜像问题

解决方案:
1.可以给video标签直接设置transfrom:rotate(180deg);
2.通过给API参数中设置ID,唤醒自己手机的前置摄像头(前置默认都是’default’)

video: {
       deviceId: 'default',
       facingMode:'user',
}

在谷歌浏览器中显示正常,在QQ浏览器就不能正常显示

解决方案:代码执行前先处理兼容性,如果放置app中,也可以给web-view添加类似X5内核,使网页在同一环境下运行

 if (navigator.mediaDevices.getUserMedia === undefined) {
     navigator.mediaDevices.getUserMedia = function (constraints) {
          var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia || navigator.oGetUserMedia;
          if (!getUserMedia) {
              return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
          }
	          return new Promise(function (resolve, reject) {
	           		getUserMedia.call(navigator, constraints, resolve, reject);
	           });
          }
 }

调用完前置后,后置摄像头调用无效

这个问题特别无助…测试中发现很多机型后置都是不能被唤醒,我自己的p30 pro 调用后默认居然是50倍变焦…吐血…
解决方案:
1.可以通过获取设备id,然后参数中通过id唤醒,这在上一篇博客中提到过。
2.使用Input唤醒(推荐)

<input class="card_input" v-on:change="appCapture" type="file" accept="image/*" capture="camera" />

使用input唤醒相机放在web-view里面,第一次正常,退出重新进入再执行img.onload时候没有反应

解决方案:app内部设置了退出清除了缓存,把“清除缓存”摘除掉以后就恢复了正常

### 解决局域网中 `navigator.mediaDevices.getUserMedia` 不可用的问题 为了使 `navigator.mediaDevices.getUserMedia` 方法在局域网环境中正常工作,需遵循特定条件配置。该方法受限于浏览器安全策略,在非 HTTPS 或 localhost 域名环境下无法调用成功[^3]。 #### 使用 HTTPS 协议部署应用 最直接的方法是在 HTTPS 下运行应用程序。对于开发环境而言,可以创建自签名证书来启用本地 HTTPS 服务。这可以通过多种方式实现: - **Node.js 开发服务器**:利用 Node.js 的内置模块如 `https` `fs` 来启动带有 SSL/TLS 支持的服务器。 ```javascript const https = require('https'); const fs = require('fs'); const options = { key: fs.readFileSync('/path/to/server-key.pem'), cert: fs.readFileSync('/path/to/server-cert.pem') }; https.createServer(options, (req, res) => { // 处理请求... }).listen(8000); ``` - **Nginx 反向代理**:如果已有一个 HTTP 服务器正在监听端口,则可通过 Nginx 设置反向代理并提供 HTTPS 连接给客户端访问。 #### 配置开发者工具绕过限制(仅限测试) 某些情况下,允许通过修改 Chrome 浏览器命令行参数的方式临时忽略此限制用于调试目的。请注意这种方法不适合生产环境使用,并且可能带来安全隐患。 打开终端执行如下命令启动带特殊标志位的 Chromium/Chrome 实例: ```bash chrome --unsafely-treat-insecure-origin-as-secure="http://your-local-ip-address" ``` 上述操作会将指定 IP 地址视为可信源从而解除对 `getUserMedia()` API 调用的阻止行为。 #### 替代方案考虑 当确实难以满足 HTTPS 环境需求时,可探索其他替代技术路径完成多媒体采集功能,比如借助 WebRTC 数据通道特性传输媒体流数据至远程主机再做进一步处理;或是采用第三方 SDK 提供跨平台兼容性的音视频捕获能力。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值