最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WebRTC媒體權(quán)限申請(qǐng)getUserMedia實(shí)例詳解

 更新時(shí)間:2022年11月15日 09:53:26   作者:時(shí)光足跡  
這篇文章主要為大家介紹了WebRTC媒體權(quán)限申請(qǐng)getUserMedia實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

媒體權(quán)限申請(qǐng)

本文主要介紹了 getUserMedia 媒體權(quán)限申請(qǐng)的通用用法,包含權(quán)限申請(qǐng)配置、成功時(shí)媒體流預(yù)覽及銷毀處理、失敗時(shí)的通用提示處理等等

getUserMedia() 方法是用來申請(qǐng)麥克風(fēng)和攝像頭的使用權(quán)限的。該方法存在兼容性問題,需要單獨(dú)處理,如下是比較通用的處理方式:

// 申請(qǐng)媒體權(quán)限的兼容性寫法
function getUserMedia(constrains, success) {
  if (navigator.mediaDevices === undefined) {
    navigator.mediaDevices = {};
  }
  if (navigator.mediaDevices.getUserMedia === undefined) {
    navigator.mediaDevices.getUserMedia = function (constraints) {
      const getUserMedia =
        navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
      if (!getUserMedia) {
        return Promise.reject(
          new Error("瀏覽器不支持訪問用戶媒體設(shè)備,請(qǐng)升級(jí)或更換瀏覽器")
        );
      }
      return new Promise(function (resolve, reject) {
        getUserMedia.call(navigator, constraints, resolve, reject);
      });
    };
  }
  navigator.mediaDevices
    // 參數(shù)配置
    .getUserMedia(constrains)
    // 成功回調(diào) 暴露出去
    .then(success)
    // 失敗回調(diào) 待通用處理
    .catch(mediaErrorCaptured);
}

媒體流預(yù)覽與停止

getUserMedia()方法的返回是一個(gè) promise 對(duì)象,成功后會(huì) resolve 一個(gè) MediaStream 媒體流對(duì)象,包含了請(qǐng)求的媒體類型的軌道,如視頻軌道、音頻軌道。

一般我們會(huì)將返回的 MediaStream 媒體流賦值到 video 元素上,就可以實(shí)現(xiàn)視頻流的預(yù)覽了。

如下所示,同時(shí)申請(qǐng)了攝像頭和麥克風(fēng)權(quán)限,當(dāng)然,可以更改配置,單獨(dú)申請(qǐng)麥克風(fēng)或者攝像頭權(quán)限

getUserMedia(
  {
    // 需要攝像頭權(quán)限,優(yōu)先使用前置攝像頭 environment-后置攝像頭
    video: { facingMode: "user" },
    // 需要麥克風(fēng)權(quán)限,false則不需要
    audio: true,
  },
  // 成功的回調(diào)處理
  (stream) => {
    // 將流數(shù)據(jù)存起來,之后停止流時(shí)需要
    localStream = stream;
    // 流展示到video標(biāo)簽中
    localVideo.current.srcObject = stream;
    // 觸發(fā)播放:當(dāng)然這個(gè)也是存在兼容性問題的
    // 注意:有時(shí)候因?yàn)闉g覽器的安全限制,是需要與用戶進(jìn)行交互才能自動(dòng)播放的
    localVideo.current.play();
  }
);

如下為 MediaStream 媒體流對(duì)象的打印展示,以及獲取音頻軌道(getAudioTracks)、獲取視頻軌道 getVideoTracks、獲取所有軌道(getTracks)等方法的打印結(jié)果展示。

注意:MediaStreamactivetrue 時(shí),才能正常的預(yù)覽展示;為 false 時(shí)不能正常加載到 video 元素上

一般預(yù)覽成功后,在頁面銷毀之前,需要進(jìn)行關(guān)閉數(shù)據(jù)及清空流的操作

// 方式一:獲取對(duì)應(yīng)的軌道數(shù)據(jù),進(jìn)行清空操作
localStream.getAudioTracks()[0].stop();
localStream.getVideoTracks()[0].stop();
localVideo.current.srcObject = null;
// 方式二:遍歷操作,關(guān)閉媒體軌道
localStream.getTracks().forEach((stream: MediaStreamTrack) => {
  stream.stop();
});

媒體申請(qǐng)拒絕處理

如果用戶拒絕了媒體的使用權(quán)限申請(qǐng),則會(huì) reject 回調(diào)一個(gè)錯(cuò)誤對(duì)象。

因?yàn)殄e(cuò)誤處理是很通用的,所以直接可以通過一個(gè)通用函數(shù)進(jìn)行處理,提高代碼的復(fù)用性。

function mediaErrorCaptured(error) {
  console.log("錯(cuò)誤信息name打印", error?.name);
  console.log("錯(cuò)誤信息message打印", error?.message);
  // 媒體權(quán)限失敗處理(通用 詳細(xì))
  const nameMap = {
    AbortError: "操作中止",
    NotAllowedError: "打開設(shè)備權(quán)限不足,原因是用戶拒絕了媒體訪問請(qǐng)求",
    NotFoundError: "找不到滿足條件的設(shè)備",
    NotReadableError:
      "系統(tǒng)上某個(gè)硬件、瀏覽器或網(wǎng)頁層面發(fā)生的錯(cuò)誤導(dǎo)致設(shè)備無法被訪問",
    OverConstrainedError: "指定的要求無法被設(shè)備滿足",
    SecurityError: "安全錯(cuò)誤,使用設(shè)備媒體被禁止",
    TypeError: "類型錯(cuò)誤",
    NotSupportedError: "不支持的操作",
    NetworkError: "網(wǎng)絡(luò)錯(cuò)誤發(fā)生",
    TimeoutError: "操作超時(shí)",
    UnknownError: "因未知的瞬態(tài)的原因使操作失敗)",
    ConstraintError: "條件沒滿足而導(dǎo)致事件失敗的異常操作",
  };
  // 媒體權(quán)限失敗處理(通用 簡單)
  const messageMap = {
    "permission denied": "麥克風(fēng)、攝像頭權(quán)限未開啟,請(qǐng)檢查后重試",
    "requested device not found": "未檢測到攝像頭",
    "could not start video source": "無法訪問到攝像頭",
  };
  let nameErrorMsg = nameMap[error.name];
  if (!nameErrorMsg) {
    nameErrorMsg = messageMap[error.message.toLowerCase() || "未知錯(cuò)誤"];
  }
  // todo
  alert(nameErrorMsg);
}

當(dāng)然,IOSAndroid 的權(quán)限拒絕報(bào)錯(cuò)中 message 可能會(huì)不一樣,但是 name 相同,可以結(jié)合二者進(jìn)行判斷

if (
  error.message.toLowerCase() === "permission denied" ||
  error.name == "NotAllowedError"
) {
  console.log(`麥克風(fēng)、攝像頭權(quán)限未開啟,請(qǐng)檢查權(quán)限`);
}

參考文檔:MediaDevices.getUserMedia()

以上就是WebRTC媒體權(quán)限申請(qǐng)getUserMedia實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于WebRTC getUserMedia的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解JavaScript中var和let的區(qū)別

    詳解JavaScript中var和let的區(qū)別

    在JavaScript中,有3個(gè)關(guān)鍵字可以聲明變量:var、const和let,其中var在ECMAScript的所有版本中都可以使用,而const和let只能在ECMAScript 6及更晚的版本中使用,本文就來說說二者的區(qū)別,感興趣的可以了解一下
    2022-11-11
  • Javascript調(diào)試之console對(duì)象——你不知道的一些小技巧

    Javascript調(diào)試之console對(duì)象——你不知道的一些小技巧

    這篇文章主要總結(jié)了console對(duì)象的一些有用的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-07-07
  • js彈出窗口返回值的簡單實(shí)例

    js彈出窗口返回值的簡單實(shí)例

    下面小編就為大家?guī)硪黄猨s彈出窗口返回值的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • JavaScript函數(shù)的定義和基本使用方法

    JavaScript函數(shù)的定義和基本使用方法

    函數(shù)就是一種封裝,由事件驅(qū)動(dòng)的或者當(dāng)它被調(diào)用時(shí)執(zhí)行的可重復(fù)使用的代碼塊,下面這篇文章主要給大家介紹了關(guān)于JavaScript函數(shù)的定義和基本使用方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • js實(shí)現(xiàn)Tab選項(xiàng)卡切換效果

    js實(shí)現(xiàn)Tab選項(xiàng)卡切換效果

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)Tab選項(xiàng)卡切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • js實(shí)現(xiàn)的日期操作類DateTime函數(shù)代碼

    js實(shí)現(xiàn)的日期操作類DateTime函數(shù)代碼

    感覺js自帶的Date類型對(duì)象用起來不是很方便,照著C#的DateTime做了一個(gè)
    2010-03-03
  • JavaScript防抖動(dòng)與節(jié)流處理

    JavaScript防抖動(dòng)與節(jié)流處理

    這篇文章介紹了JavaScript防抖動(dòng)與節(jié)流處理的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名的示例代碼

    JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名效果,文中的示例代碼簡潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • JS數(shù)組按指定字段轉(zhuǎn)map-list結(jié)構(gòu)(示例詳解)

    JS數(shù)組按指定字段轉(zhuǎn)map-list結(jié)構(gòu)(示例詳解)

    在開發(fā)過程中經(jīng)常會(huì)出現(xiàn)接口返回整個(gè)數(shù)組,我們需要將數(shù)組進(jìn)行二次處理,這篇文章主要介紹了js?數(shù)組按指定字段轉(zhuǎn)map-list結(jié)構(gòu),需要的朋友可以參考下
    2023-11-11
  • 使用bootstrapValidator插件進(jìn)行動(dòng)態(tài)添加表單元素并校驗(yàn)

    使用bootstrapValidator插件進(jìn)行動(dòng)態(tài)添加表單元素并校驗(yàn)

    動(dòng)態(tài)添加表單元素,并調(diào)用bootstrapValidator的方法為表單添加校驗(yàn)規(guī)則,調(diào)用addField()方法實(shí)現(xiàn)功能。下面通過本文看下具體實(shí)現(xiàn)方法吧
    2016-09-09

最新評(píng)論

凤山县| 凌源市| 刚察县| 双牌县| 金平| 织金县| 武穴市| 南陵县| 交城县| 京山县| 四平市| 灵川县| 兴仁县| 韩城市| 讷河市| 莱芜市| 西安市| 东辽县| 肥乡县| 大安市| 余江县| 临高县| 八宿县| 绥阳县| 邛崃市| 南康市| 永昌县| 刚察县| 屏南县| 饶阳县| 玛曲县| 纳雍县| 衢州市| 侯马市| 察隅县| 吴川市| 巴彦淖尔市| 阿坝县| 常山县| 潍坊市| 石楼县|