收藏
回答

h5 getUserMedia 获取视频流 ios无法获取?

在开发时需要用到getUserMedia获取视频流的功能,安卓能打开,ios用自带的浏览器也可以打开,但是用微信打开链接不行,想问下官方,是不是ios不支持getUserMedia获取视频流呢?

回答关注问题邀请回答
收藏

7 个回答

  • 邓子初
    邓子初
    2022-02-25

    ios14以下微信内置浏览器就不支持getUserMedia获取视屏流,可以去看下can i use以及微信内置浏览器版本

    2022-02-25
    有用 1
    回复
  • Chopin
    Chopin
    2021-12-14

    最近遇到同样的问题,ios微信端video播放getUserMedia的视频流直接白屏,也没报错,后来试了,只有第一次getUserMedia的stream不能播放,下一次就能播放了,代码如下:

    const sleep = (time = 0) => new Promise((res) => { setTimeout(res, time); });
    const checkIsWechat = (() => {
      const agentInfo = navigator.userAgent.toLowerCase();
      const isWechatEnv = ['micromessenger', 'wechat', 'weixin'].some((sign) => agentInfo.includes(sign));
      return () => isWechatEnv;
    })();
    
    
    const cameraVideoInit = async (video) => {
      // 以后置摄像头为例
      const options = { audio: false, video: { facingMode: 'environment' } };
      if (checkIsWechat()) {
        const tapStream = await navigator.mediaDevices.getUserMedia(options);
        const tapVideoTracks = tapStream.getVideoTracks()?.[0] ?? null;
        // 第一次不延迟关闭摄像头还是没办法播放视频
        await sleep(1000);
        tapVideoTracks?.stop?.();
        // 保险起见再延迟100ms
        await sleep(100);
      }
      try {
        const stream = await navigator.mediaDevices.getUserMedia(options);
        if (this._hasStop) return;
        video.srcObject = stream;
        document.body.append(video);
        const loadedHandler = (evt) => {
          if (evt) {
            video.onloadeddata = null;
          }
          // video.play()在部分机型上会报错:play()can only be initiated by a user gesture
          // 此处将play放在点击事件中,报错了就向外抛出事件,外部实际的交互去触发play
          video.click();
          video.play();
        };
        video.onloadeddata = loadedHandler;
        video.onclick = () => {
          video.play().catch(() => {
            window.dispatchEvent('manual-play', new CustomEvent({
              detail: {
                callback: () => video.play()
              }
            }));
          });
        };
        // ios的微信浏览器必须先手动触发一次play,loadeddata事件才能执行
        if (checkIsWechat()) {
          sleep(3000).then(() => {
            if (video.onloadeddata) {
              loadedHandler();
            }
          });
        }
        window.dispatchEvent(new CustomEvent('camera-init'));
      } catch (err) {
        window.dispatchEvent(new CustomEvent('camera-error', { detail: err }));
      }
    };
    
    
    export default cameraVideoInit;
    
    
    2021-12-14
    有用 1
    回复 3
    • 胡萝卜糊了
      胡萝卜糊了
      2022-10-18
      同样问题,果然第二才能播放
      2022-10-18
      回复
    • 💫· THFOREVER
      💫· THFOREVER
      2023-04-10
      请问解决了吗?同样的问题
      2023-04-10
      回复
    • 💫· THFOREVER
      💫· THFOREVER
      2023-04-10回复胡萝卜糊了
      请问解决了吗?同样的问题
      2023-04-10
      回复
  • Cjiang
    Cjiang
    2021-06-15

    你好,麻烦提供出现问题的具体机型、微信版本号、系统版本号,以及能复现的链接,并详细描述下复现流程

    2021-06-15
    有用 1
    回复 3
    • 剑齿留痕
      剑齿留痕
      2021-08-20
      我这边iPhone7,微信版本8.0.11,系统ios11
      2021-08-20
      回复
    • 狗蛋
      狗蛋
      2021-12-01
      我也碰到了这个问题,我这边的情况是,只有机型为iphone11且系统是ios15.0以下的版本(ios15.1正常时用)在使用getUserMedia获取视频流的时候出现了获取不到的情况(任意微信版本)。Safari浏览器以机型为iphone11为例的任意ios版本都可以正常使用。期望官方尽快给予解决方案吧!
      2021-12-01
      回复
    • 黄珂
      黄珂
      2023-02-06回复狗蛋
      你好,请问这个问题后来解决了吗,某些版本ios调动navigator.getUserMedia为undeifined没有视频流的问题
      2023-02-06
      回复
  • Sunny🌞
    Sunny🌞
    06-15

    同样的问题 解决了么 楼主

    06-15
    有用
    回复
  • 野狼先生
    野狼先生
    发表于移动端
    02-02
    有解决方案了么,搞死人
    02-02
    有用
    回复
  • x
    x
    2021-08-27

    请问楼主解决了吗?

    2021-08-27
    有用
    回复
  • 剑齿留痕
    剑齿留痕
    2021-08-20

    遇到了同样的问题,请问你这边解决了吗?

    2021-08-20
    有用
    回复
登录 后发表内容