日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Electron調用外接攝像頭并拍照上傳實現詳解

瀏覽:241日期:2022-06-01 17:05:12
目錄
  • 背景
  • 需求分析
  • 實現
    • 視頻采集
    • MediaDevices.getUserMedia()
    • 拍照生成圖片
  • 上傳圖片至CDN
    • 1. 使用HTMLCanvasElement.toBlob()
    • 語法
    • 參數
    • 2. 使用HTMLCanvasElement.toDataURL()
      • 語法
      • 參數
      • 返回值
  • 總結

    背景

    基于Electron實現的pc端智能驗機應用,近期迭代了一個新的功能,需求是通過電腦外接攝像頭對手機屏幕進行拍照,拍照后需將照片上傳至服務端進行屏幕信息比對,確定被檢測屏幕是否為原廠屏。

    需求分析

    根據上面的需求,分析大概要以下幾個步驟。

    • 先實現將攝像頭的畫面實時展示在頁面視頻采集區域中;
    • 將攝像頭中的視頻畫面采集一幀成圖片并回顯;
    • 將生成的圖片上傳至CDN拿到圖片鏈接;
    • 將圖片鏈接上傳到后端接口 做處理;

    確定了需要以上四個步驟后,接下來一步一步實現。

    實現

    視頻采集

    由于 Electron 內置了 Chromium 瀏覽器,該瀏覽器對各項前端標準都支持得非常好,所以基于 Electron 開發應用不會遇到瀏覽器兼容性問題。幾乎可以在 Electron 中使用所有 HTML5CSS3ES6 標準中定義的 API

    所以基于WebRTC提供的API即可獲取到攝像頭的視頻流。

    MediaDevices.getUserMedia()

    代碼如下:

    methods: {    getUserMedia() {/* 可同時開啟video(攝像頭)和audio(麥克風) 這里只請求攝像頭,所以只設置video為true */navigator.mediaDevices.getUserMedia({ video: true })    .then(function(stream) {      /* 使用這個 stream 傳遞到成功回調中 */      this.success(stream)    })    .catch(function(err) {      /* 處理 error 信息 */      this.error(error)    });    }}

    MediaDevices.getUserMedia() 會提示用戶給予使用媒體輸入的許可,媒體輸入會產生一個MediaStream,里面包含了請求的媒體類型的軌道。此流可以包含一個視頻軌道(來自硬件或者虛擬視頻源,比如相機、視頻采集設備和屏幕共享服務等等)、一個音頻軌道(同樣來自硬件或虛擬音頻源,比如麥克風、A/D 轉換器等等),也可能是其它軌道類型。

    它返回一個 Promise 對象,成功后會resolve回調一個 MediaStream 對象。若找不到滿足請求參數的媒體類型,promisereject回調一個NotFoundError

    現在已經成功獲取到視頻流,接下來就是將視頻流回顯到頁面。 這里使用video標簽完成,代碼如下:

    <template>    <div><div>    <video ref="video"></video></div>    </div></template>export default {   methods: {       getUserMedia() {    /* 可同時開啟video(攝像頭)和audio(麥克風) 這里只請求攝像頭,所以只設置video為true */    navigator.mediaDevices.getUserMedia({ video: true }).then(function(stream) {  /* 使用這個 stream 傳遞到成功回調中 */  this.success(stream)}).catch(function(err) {  /* 處理 error 信息 */  this.error(error)});},       success(stream) {   console.log("成功", stream);   /* 將stream 分配給video標簽 */   this.$refs.video.srcObject = stream;   this.$refs.video.play();}    }}

    這時,攝像頭中的畫面就可以顯示在頁面video標簽內,如下圖。

    為了用戶體驗,在進入頁面之前添加了判斷攝像頭是否已經接入并可用的邏輯,避免用戶的攝像頭未接入或者啟動,造成應用不可用的錯覺。

    使用MediaDevices.enumerateDevices()來獲取可用媒體輸入和輸出設備的列表,例如攝像頭、麥克風、耳機等。

    navigator.mediaDevices.enumerateDevices().then(devicesList => {    console.log("------devicesList", deviceList)})

    得到的設備列表數據格式如下:

    kind類型有三種,分別是audioinputaudiooutputvideoinput。分別代表音視頻的輸入和輸出。可在列表中查找目標媒體是否已經接入且可用。

    若有選擇切換設備需求,可根據kind類型進行媒體設備分類,選擇目標deviceId,傳入navigator.mediaDevices.getUserMedia,完成來源切換。

     navigator.mediaDevices.getUserMedia({ video: { deviceId: xxxx } })

    拍照生成圖片

    拍照其實就是截取視頻中的某一幀,這里使用canvas來實現截取。getContext() 方法可返回一個對象,該對象提供了用于在畫布上繪圖的方法和屬性。其中drawImage()方法用來向畫布上繪制圖像、畫布或視頻。

    <template>    <div><div>    <video ref="video" v-if="showVideo"></video>    <canvas ref="canvas" v-else width="500" height="346"></canvas><div>    <div @click="capture">拍照</div>    <div @click="submit"}">提交</div></div>    </div></template>export default {   data: {       showVideo: true, // 是否展示攝像頭畫面   },   methods: {/* 拍照按鈕點擊 */capture() {  this.showVideo = false  var context = this.$refs.canvas.getContext("2d");  /* 要跟video的寬高一致 */  context.drawImage(this.$refs.video, 0, 0, 1000, 692, 0, 0, 500, 346);}    }}

    拍照的圖片回顯至canvas標簽。

    上傳圖片至CDN

    上個步驟已經完成了拍照,接下來就需要將圖片上傳至CDN,拿到圖片鏈接。 這里有兩種方式可以實現獲取圖片數據。

    1. 使用HTMLCanvasElement.toBlob()

    HTMLCanvasElement.toBlob() 方法生成 Blob 對象,用以展示 canvas 上的圖片。因為直接可以拿到圖片文件,所以無需再使用方法2中的函數來轉化base64,直接可以獲取到圖片文件用來上傳。

    語法

    toBlob(callback, type, quality)

    參數

    callback:回調函數,參數為Blob對象(目標圖片文件)。

    type:圖片格式,默認為image/png 可選

    quality:0-1的數字,表示圖片質量,可選

    點擊提交按鈕按鈕時,先獲取圖片文件,為上傳做準備。

    methods: {    /* 提交按鈕點擊 */    submit() {const base64Url = this.$refs.canvas.toBlob(blob => {    console.log("===blob", blob)    const data = new FormData()    data.append("file", blob)    request.post("https://XXXXX/upload", data)}, "image/jpeg", 0.95)    }}

    console的結果如下圖:

    2. 使用HTMLCanvasElement.toDataURL()

    HTMLCanvasElement.toDataURL()方法返回一個包含圖片展示的Data URL。

    Data URL,即前綴為 data: 協議的 URL,其允許內容創建者向文檔中嵌入小文件。

    語法

    canvas.toDataURL(type, encoderOptions);

    參數

    type 圖片格式,默認為image/png

    encoderOptions 0到1之間的值,用來選定圖片質量,默認值是0.92,超出范圍會使用默認值。

    返回值

    base64組成的圖片源數據,上傳前需轉為圖片文件。這里封裝了一個convertBase64UrlToImgFile函數用來轉換。代碼如下:

    <template>    <div><div>    <video ref="video" v-if="showVideo"></video>    <canvas ref="canvas" v-else width="500" height="346"></canvas><div>    <div @click="capture">拍照</div>    <div @click="submit">提交</div></div>    </div></template>export default {   data: {       /* 是否展示攝像頭畫面 */       showVideo: true,   },   methods: {/* 將base64轉為圖片文件 */convertBase64UrlToImgFile(urlData, fileType) {    const imgData = urlData.split("base64,").splice(-1)[0]    /* 解碼使用 base-64 編碼的字符串 轉換為byte */    const bytes = window.atob(imgData)    /* 處理異常,將ASCII碼小于0的轉換為大于0 */    const ab = new ArrayBuffer(bytes.length)    const ia = new Int8Array(ab)    for (let i = 0; i < bytes.length; i++) {ia[i] = bytes.charCodeAt(i)    }    /* 轉換成文件,可以添加文件的type,lastModifiedDate屬性 */    const blob = new Blob([ab], { type: fileType })    blob.lastModifiedDate = new Date()    return blob},/* 提交按鈕點擊 */async submit() {    const base64Url = this.$refs.canvas.toDataURL()    const imgFile = this.convertBase64UrlToImgFile(base64Url, "image/jpg")    console.log("====imgFile", imgFile)    const data = new FormData()    data.append("file", imgFile)    /* 上傳 */    request.post("https://XXXXX/upload", data)},    }}

    convertBase64UrlToImgFile可用于在使用canvas外的場景進行base64轉換圖片文件。和HTMLCanvasElement.toBlob()方法得到的結果一致。

    以上兩種方法都可以完成圖片上傳,最終拿到CDN圖片鏈接后可傳給后端進行處理。獲取屏幕信息。

    總結

    通過以上四個步驟就完成了Electron應用中通過外接攝像頭拍照并上傳的功能。這里基本用不到Electron的能力,和在web端的實現方式并無區別,Electron在這里起到的作用就是獲取攝像頭媒體流不需要獲取用戶權限。

    Electron是基于ChromiumNode.js實現的,這就使前端開發者可以使用JavaScriptHTMLCSS輕松構建跨平臺的桌面應用。Electron可以使用幾乎所有的Web前端生態領域及Node.js生態領域的組件和技術方案。

    后續會介紹Electron在智能驗機應用中的實踐方案,更多關于Electron調用攝像頭拍照上傳的資料請關注其它相關文章!

    標簽: JavaScript
    日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
    另类亚洲自拍| 欧美一级网址| 欧美在线亚洲综合一区| 久久99伊人| 91成人小视频| 日韩美女一区二区三区在线观看| 婷婷色综合网| 视频一区视频二区在线观看| 日本a级不卡| 国产中文字幕一区二区三区| 免费不卡中文字幕在线| 日本va欧美va欧美va精品| 卡一卡二国产精品| 亚洲一级二级| 91成人在线| 亚洲成人一区在线观看| 综合欧美精品| 久久影院午夜精品| 视频一区视频二区在线观看| 欧美经典一区| 黑丝一区二区| 国产精品tv| 欧美高清不卡| 国产精品一区二区精品| 亚洲特色特黄| 国产欧美日韩在线一区二区 | 亚洲深夜视频| 蜜桃视频一区二区| 国产videos久久| 日韩精品一二三| 国产伊人久久| 亚洲色图综合| 日本综合字幕| 91精品国产自产在线丝袜啪| 国产v日韩v欧美v| 亚洲一级淫片| 欧美特黄一级大片| 国产极品嫩模在线观看91精品| 欧美日韩在线网站| 国产精品欧美大片| 国产精品毛片一区二区三区| 精品国产美女a久久9999| 国产免费成人| 亚洲风情在线资源| 欧美精品国产白浆久久久久| 91成人精品视频| 美女精品视频在线| 亚洲精品黄色| 亚洲欧洲一区| 国产精品成久久久久| 日韩在线视频一区二区三区| 午夜影院欧美| 中文字幕人成乱码在线观看 | 一二三区精品| 国产一区清纯| 国产精品黑丝在线播放| 国产午夜久久av| 老司机精品久久| 香蕉人人精品| 高清av不卡| 国产日产精品_国产精品毛片 | 日本免费在线视频不卡一不卡二| 国产综合视频| 日韩成人综合| 久久不见久久见国语| 婷婷亚洲精品| 日韩制服丝袜先锋影音| 欧美日韩国产欧| 日韩三区免费| 91欧美在线| 精品视频一区二区三区四区五区| 日本午夜精品久久久| 免费精品视频| 欧洲激情综合| 婷婷成人在线| 久久久噜噜噜| 肉色欧美久久久久久久免费看| 久久一区精品| 久久中文在线| 欧美91在线|欧美| 久久不卡日韩美女| 国产日韩欧美一区二区三区在线观看| 亚洲五月综合| 免费高清在线一区| 男人天堂欧美日韩| 国产午夜久久| 国产精品三上| 一区二区国产在线| 中文字幕日韩亚洲| 日韩视频1区| 日韩av一区二| 国产精品久久久一区二区| 欧美视频久久| 久久av资源| 国产在线不卡一区二区三区| 国产69精品久久| 岛国av在线播放| 欧美三区四区| 久久国产精品成人免费观看的软件| av综合电影网站| 99久久精品费精品国产| 伊人成人在线视频| 伊人久久婷婷| 在线免费观看亚洲| 日韩一区二区三区四区五区| 日本不卡高清| 国产精品亚洲人成在99www| 麻豆国产欧美日韩综合精品二区| 精品色999| 99精品在线| 羞羞答答国产精品www一本| 中文字幕av一区二区三区人| 日韩av一区二区在线影视| 日本午夜免费一区二区| 欧美亚洲色图校园春色| 久久99久久久精品欧美| av资源中文在线| 精品在线91| 亚洲人成精品久久久| 欧美亚洲色图校园春色| 精品72久久久久中文字幕| 伊人久久大香线蕉av不卡| 亚洲一区观看| 日本精品一区二区三区在线观看视频| 国产乱人伦丫前精品视频| 欧美国产美女| 好吊日精品视频| 日本不卡一区二区三区| 国产精品久久久久久久免费软件| 福利一区二区| 最新日韩欧美| 国产欧美一区二区色老头| 成人在线视频免费看| 欧美日韩四区| 91麻豆精品| 国产白浆在线免费观看| 午夜精品婷婷| 国产精品一区2区3区| 色老板在线视频一区二区| 石原莉奈在线亚洲三区| 麻豆免费精品视频| 怡红院精品视频在线观看极品| 青草综合视频| 久久精品国语| 亚洲另类av| 国产一区二区三区四区五区传媒| 精品一区欧美| 久久国产麻豆精品| 91精品啪在线观看国产18| 日韩有吗在线观看| 欧美日韩精品免费观看视完整| 一级欧美视频| 国产在线看片免费视频在线观看| 久久福利影视| 国内精品麻豆美女在线播放视频| 亚洲精华国产欧美| 久久av影视| 中文欧美日韩| 成人亚洲精品| 免费国产亚洲视频| 日韩大片在线| 日本免费新一区视频| 欧美色图一区| 国产精品欧美大片| 亚洲一区日韩在线| 都市激情国产精品| 日韩不卡免费视频| 亚洲天堂成人| 欧美激情久久久久久久久久久| 女人天堂亚洲aⅴ在线观看| 六月丁香综合在线视频| 鲁大师影院一区二区三区| 高清日韩中文字幕| 日韩av影院| 欧美成人午夜| 精品国产aⅴ| 亚洲欧美网站在线观看| 久久精品免费一区二区三区| 国产精品成人国产| 亚洲一级大片| 天堂网在线观看国产精品| 麻豆国产91在线播放| 亚洲在线一区| 日韩成人综合| 麻豆国产一区| 婷婷精品在线| 怡红院精品视频在线观看极品| 日本一区二区免费高清| 国产日韩欧美在线播放不卡| 91成人精品| 亚洲午夜天堂| 国产高清亚洲| 亚洲久久视频| 影音先锋久久| 久久精品卡一| 国产一区二区三区四区二区| 欧美一区二区三区久久| 亚洲欧美高清| 欧美.日韩.国产.一区.二区| av资源中文在线天堂|