WebRTC打開本地攝像頭

      網友投稿 815 2022-05-30

      本文使用WebRTC的功能,打開電腦上的攝像頭,并且把攝像頭預覽到的圖像顯示出來。

      純網頁實現,能支持除IE外的多數瀏覽器。手機瀏覽器也可用。

      引入依賴

      我們需要引入adapter-latest.js

      WebRTC打開本地攝像頭

      這個WebRTC adapter曾是WebRTC中的一部分,但現在被移出來了。

      我們會用到它提供的功能。

      html

      我們在界面上先擺放一些控件。

      顯示攝像頭預覽的內容,網頁上由元素video來呈現。

      點擊打開攝像頭按鈕后,瀏覽器會詢問是否允許,請點擊“允許”。

      video 用來顯示預覽的視頻

      兩個button用來控制開啟和關閉

      再放幾個顯示信息的地方

      js

      先設置一下,我們只使用視頻

      const constraints = window.constraints = { audio: false, video: true };

      在網頁上顯示一些信息,便于調試。

      function showErrMsg(msg, error) { const errorElement = document.querySelector('#errorMsg'); errorElement.innerHTML += `

      ${msg}

      `; if (typeof error !== 'undefined') { console.error(error); } } function showMsg(msg) { const msgEle = document.querySelector('#tipMsg'); msgEle.innerHTML += `

      -> ${msg}

      `; console.log(msg); }

      完整代碼在main.js中。css可自行定義。

      打開攝像頭

      要打開攝像頭,使用MediaDevices.getUserMedia()方法

      async function openCamera(e) { try { showMsg('正在打開攝像頭'); const stream = await navigator.mediaDevices.getUserMedia(constraints); showMsg('獲取到了stream'); gotStream(stream); e.target.disabled = true; } catch (err) { onErr(err); }

      MediaDevices.getUserMedia()方法在用戶允許后,按照請求,拿到stream。

      stream可以包含視頻或音頻。前面的設定里,我們只使用視頻。

      如果用戶拒絕了使用攝像頭申請,或者申請的媒體不可用,即表現為被拒絕。

      用戶拒絕會報NotAllowedError,找不到符合要求的設備會報NotFoundError DOMException。

      方法的文檔MediaDevices.getUserMedia()

      顯示視頻

      獲取到stream后,讓video顯示視頻

      function gotStream(stream) { const videoEle = document.querySelector('video'); const videoTracks = stream.getVideoTracks(); showMsg(`正在使用的設備: ${videoTracks[0].label}`); window.stream = stream; videoEle.srcObject = stream; }

      document.querySelector('video')直接獲取html上的video控件。

      把stream直接交給videoEle.srcObject。

      停止視頻流

      要停止視頻,我們可以從video元素入手,拿到stream,然后把里面的track停掉。

      function stopVideo(e) { showMsg("停止視頻"); const videoElem = document.querySelector('video'); const stream = videoElem.srcObject; document.querySelector('#showVideo').disabled = false; // 允許開啟 if(stream == null) { return; } const tracks = stream.getTracks(); tracks.forEach(function(track) { track.stop(); }); videoElem.srcObject = null; }

      stream.getTracks()方法拿到所有的軌道(track),遍歷一遍全部關掉。

      最后,把videoElem.srcObject設置為null,它與前面的stream解除關聯,方便將它釋放。

      參考 MediaStreamTrack-stop

      小結

      示例使用的WebRTC的功能。顯示的是本地攝像頭的視頻,不涉及傳輸。拿到視頻流后交給video來顯示。

      getUserMedia是示例中最關鍵的方法。以后的示例都會用到它。

      參考

      webrtc-adapter github

      效果預覽

      完整的效果請參考 open-camera

      http://an.rustfisher.com/webrtc/web-samples/getUserMedia-open-camera/open-camera.html

      web前端

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:(更新時間)2021年4月1日 Django框架 命令行創建項目
      下一篇:【愚公系列】2021年12月 Python教學課程 32-Django框架之命令行創建項目
      相關文章
      久久久青草青青亚洲国产免观| 国产精品亚洲一区二区三区| 综合亚洲伊人午夜网 | 亚洲成av人在线视| 亚洲国产人成精品| 亚洲av无码专区在线观看素人| 亚洲aⅴ天堂av天堂无码麻豆| 亚洲色偷偷综合亚洲av78 | 久久亚洲国产精品123区| 亚洲一区二区三区在线视频| 亚洲成a人片在线观看老师| 国产成人人综合亚洲欧美丁香花| 亚洲av无码专区在线电影| 亚洲国产av玩弄放荡人妇| 久久精品国产亚洲av天美18| 亚洲AⅤ男人的天堂在线观看| mm1313亚洲国产精品无码试看| 亚洲av无码专区在线观看亚| 国产精品亚洲天堂| 亚洲精品tv久久久久| 久久精品夜色噜噜亚洲A∨| 亚洲中文字幕日产乱码高清app| 国产亚洲精品久久久久秋霞 | 国产婷婷综合丁香亚洲欧洲| 亚洲sss综合天堂久久久| 亚洲一卡2卡3卡4卡5卡6卡| 亚洲风情亚Aⅴ在线发布| 男人的天堂亚洲一区二区三区| 亚洲av无码一区二区三区人妖 | 亚洲а∨天堂久久精品| 亚洲性日韩精品一区二区三区| 国产午夜亚洲精品午夜鲁丝片| 亚洲精品成人无码中文毛片不卡| 亚洲AV无码国产丝袜在线观看| 久久精品国产亚洲AV大全| 亚洲性69影院在线观看| 亚洲色偷偷色噜噜狠狠99网| 老牛精品亚洲成av人片| 最新国产AV无码专区亚洲 | 亚洲福利在线视频| 亚洲va精品中文字幕|