通過瀏覽器獲取麥克風或相機等媒體的使用許可權

来源:https://www.cnblogs.com/gaoguowen/archive/2019/08/13/11349136.html
-Advertisement-
Play Games

概覽 mediaDevices 是 Navigator 對象的只讀屬性,一個單列對象,可以連接訪問相機和麥克風,屏幕共用等媒體輸入設備 方法 enumerateDevices 請求一個可用的媒體輸入和輸出設備列表,如麥克風、相機、耳機等。返回的 完成狀態中是一個帶有 "MediaDeviceInfo ...


概覽

mediaDevices 是 Navigator 對象的只讀屬性,一個單列對象,可以連接訪問相機和麥克風,屏幕共用等媒體輸入設備

方法

enumerateDevices

請求一個可用的媒體輸入和輸出設備列表,如麥克風、相機、耳機等。返回的 Promise完成狀態中是一個帶有 MediaDeviceInfo 的數組

let mediaDevices = navigator.mediaDevices
if(!mediaDevices || !mediaDevices.enumerateDevices) return console.erorr('瀏覽器不支持enumerateDevices API')
navigator.mediaDevices.enumerateDevices()
.then((devices)=>{
    for (let device of devices){
        console.log(device.kind + ': ' +device.lable + ' id = '+ device.deviceId );
    }
})
.catch(err=>{
    console.error(err)
})

/*
audioinput: undefined id = default
audioinput: undefined id = communications
audioinput: undefined id = ac67d348685a08c75e5017f9a449b3d85f08dcb774c88ab95de82bbf2c0fc820
videoinput: undefined id = e41039bcfbc84d926a0b73cdc1d8b1daf3d67d36c62588202191d918fb076426
audiooutput: undefined id = default
audiooutput: undefined id = communications
audiooutput: undefined id = 015d73652e57bffb21679b937675d32c4d4a43862aba3774aaf0b5f1e983151f
*/

相容性

getSupportedConstraints

返回一個 MediaTrackSupportedConstraints 對象,其屬性都是客戶端所支持約束的屬性,值為 Boolean 類型

let supportedConstraints = navigator.mediaDevices.getSupportedConstraints()
for (let constraint of Object.keys(supportedConstraints)){
    console.log(constraint)
}
/*
aspectRatio
autoGainControl
brightness
channelCount
colorTemperature
contrast
deviceId
echoCancellation
exposureCompensation
exposureMode
exposureTime
facingMode
focusDistance
focusMode
frameRate
groupId
height
iso
latency
noiseSuppression
pointsOfInterest
resizeMode
sampleRate
sampleSize
saturation
sharpness
torch
volume
whiteBalanceMode
width
zoom
*/

相容性

getDisplayMedia

提示用戶選擇和授予許可權來捕獲顯示或部分的內容,(如分屏共用時分享哪一屏的內容)然後使用 medieaStream Recording API 記錄生成的 stream,或作為 webRTC 會話的一部分進行傳輸。

可以傳遞一個MediaStreamConstraints 對象指定返回要求的 mediaStream

async function startCapture(displayMediaOptions) {
  let captureStream = null;

  try {
    captureStream = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
  } catch(err) {
    console.error("Error: " + err);
  }
  return captureStream;
}

相容性

getUserMedia

提示用戶給予使用媒體輸入的許可(如麥克風,攝像機),當媒體輸入時產生一個 mediaStream包含所請求的媒體類型的軌道。該流可以包括視頻軌道(攝像機,視頻記錄設備,共屏等硬體或虛擬視頻流源)、音頻軌道(來自麥克風、A/D轉換器等硬體或虛擬音頻源),也可能是其它軌道類型

該方法返回一個Promise對象,成功時 resolve 回調函數帶有mediaStream對象。如果用戶拒絕授予使用許可權,或是媒體源不可用,則返回 reject回調

Promise 可能既不會 resolve 也不會reject,因為用戶不必做出選擇,可能只是忽略請求

// 想要獲取一個最接近 1280x720 的相機解析度
let constraints = { audio: true, video: { width: 1280, height: 720 } };

navigator.mediaDevices.getUserMedia(constraints)
.then(function(mediaStream) {
  let video = document.querySelector('video');
  video.srcObject = mediaStream;
  video.onloadedmetadata = function(e) {
    video.play();
  };
})
.catch(function(err) { console.log(err.name + ": " + err.message); });

參數 constraints

一個mediaStreamConstraints對象指定請求的媒體類型和相對應參數,該對象包含 videoaudio 兩個屬性,必須一個或兩個同時被指定,如果無法找到指定的媒體類型或無法滿足對於的參數要求,Promise將返回 rejected

參數配置

配置 1
 {audio:true,video:true}

屬性設置為 Truthy 則生成的stream 必須具有該類型的軌道,否則調用 getUserMedia會拋出錯誤

配置 2
{
  audio: true,
  video: { width: 1280, height: 720 }
}

表示video的解析度應為 1280x720 瀏覽器將試著滿足這個請求參數,如果無法滿足要求或選擇覆蓋,則可能返回其它的解析度

配置 3
{
  audio: true,
  video: {
    width: { min: 1280 },
    height: { min: 720 }
  }
}

此配置要求了最低解析度,如果達不到要求,promise 將返回 reject;還可配置 max、exact(min == max),而且用戶將不會得到要求授權的提示

配置 4
{
  audio: true,
  video: {
    width: { min: 1024, ideal: 1280, max: 1920 },
    height: { min: 776, ideal: 720, max: 1080 }
  }
}

如果使用ideal,瀏覽器將嘗試找到(如果相機有多個的話)最接近指定值的理想值的設備或相機
意味著上方的第一個解析度例子可簡寫為:

{
  audio: true,
  video: {
    width: { ideal: 1280 },
    height: { ideal: 720 }
  }
}
配置 5

並不是所有的 constraint 都說數字,如在移動設備上優先使用前置相機

{ audio: true, video: { facingMode: "user" } }

強制使用後置相機

{ audio: true,
 video: {
  facingMode: { exact: "environment" }
   }
}

APP許可權配置

"permissions": {
  "audio-capture": {
    "description": "Required to capture audio using getUserMedia()"
  },
  "video-capture": {
    "description": "Required to capture video using getUserMedia()"
  }
}

作為可能涉及重大隱私問題的API,getUserMedia()規範規定了瀏覽器有義務滿足的各種隱私和安全要求。

getUserMedia()是一個強大的功能,只能在安全的環境中使用; 在不安全的情境中,navigator.mediaDevices 是undefined,阻止訪問getUserMedia()
簡而言之,安全上下文是使用HTTPSfile:///URL 方案載入的頁面,或者是從中載入的頁面localhost

在舊的瀏覽器中使用新的API

推薦使用處理了約束的 adapter.jspolyfill 來替代。



// 老的瀏覽器可能根本沒有實現 mediaDevices,所以我們可以先設置一個空的對象
let mediaDevices = navigator.mediaDevices
if (mediaDevices === undefined) {
  mediaDevices = {};
}
// 一些瀏覽器部分支持 mediaDevices。我們不能直接給對象設置 getUserMedia
// 因為這樣可能會覆蓋已有的屬性。這裡我們只會在沒有getUserMedia屬性的時候添加它。
if (mediaDevices.getUserMedia === undefined) {
  mediaDevices.getUserMedia = function(constraints) {

    // 首先,如果有getUserMedia的話,就獲得它
    var getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia;

    // 一些瀏覽器根本沒實現它 - 那麼就返回一個error到promise的reject來保持一個統一的介面
    if (!getUserMedia) {
      return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
    }

    // 否則,為老的navigator.getUserMedia方法包裹一個Promise
    return new Promise(function(resolve, reject) {
      getUserMedia.call(navigator, constraints, resolve, reject);
    });
  }
}
mediaDevices.getUserMedia({ audio: true, video: true })
.then(function(stream) {
  var video = document.querySelector('video');
  // 舊的瀏覽器可能沒有srcObject
  if ("srcObject" in video) {
    video.srcObject = stream;
  } else {
    // 防止在新的瀏覽器里使用它,應為它已經不再支持了
    video.src = window.URL.createObjectURL(stream);
  }
  video.onloadedmetadata = function(e) {
    video.play();
  };
})
.catch(function(err) {
  console.log(err.name + ": " + err.message);
});

相容性

Owen 的個人博客
博客園


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 1 大數據概述大數據特性:4v volume velocity variety value 即大量化、快速化、多樣化、價值密度低 數據量大:大數據摩爾定律 快速化:從數據的生成到消耗,時間視窗小,可用於生成決策的時間非常少;1秒定律,這和傳統的數據挖掘技術有著本質區別(谷歌的dremel可以在1秒內... ...
  • 前面配置了ACFS用於ogg目錄。 上傳軟體並解壓安裝: unzip 123014_fbo_ggs_Linux_x64_shiphome.zip cd fbo_ggs_Linux_x64_shiphome/cd Disk1/./runInstaller 添加環境變數 su - oracle cat ...
  • [學習筆記] collect: 收集一個彈性分散式數據集的所有元素到一個數組中,這樣便於我們觀察,畢竟分散式數據集比較抽象。Spark的collect方法,是Action類型的一個運算元,會從遠程集群拉取數據到driver端。最後,將大量數據 彙集到一個driver節點上,將數據用數組存放,占用了jv ...
  • 前言 開心一刻 一個中國小孩參加國外的脫口秀節目,因為語言不通,於是找了一個翻譯。 主持人問:“Who is your favorite singer ?” 翻譯:”你最喜歡哪個歌手啊 ?” 小孩興奮地回答:”Michael Jackson” 翻譯轉身對主持人說:”邁克爾-傑克遜” 主持人看著翻譯: ...
  • 今天給大家講一下MaterialApp應用組件及routes路由詳解,我會著重說一下routes路由的使用及解釋,因為會經常用到,前面我寫的一些demo所涉及到的組件,都是遵循著Material Design設計風格,所謂的Material Design是由Goodle推出的全新的設計語言,這種設計... ...
  • 在smobiler中可以通過相對佈局或者絕對佈局實現自適應不同手機解析度。例如實現下圖中的佈局,圖中的佈局實際可以分成3個部分,部分1可以使用Title控制項,部分2可以使用Panel(在Panel中加入IconMenuView可以實現圖中效果,本文不具體說明),部分3 使用ToolBar控制項,具體見... ...
  • 還有一種簡單的扁平化實現方法,但不太推薦: 這樣就實現了該功能,有沒有其他方法也能實現該功能? 該方法是查閱得到,通過遞歸使數組扁平化,無需擔心瀏覽器不支持flat的使用,結尾的方法調用個人非常喜歡 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...