亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Electron調(diào)用外接攝像頭并拍照上傳實現(xiàn)詳解

 更新時間:2023年02月24日 12:02:08   作者:轉(zhuǎn)轉(zhuǎn)技術(shù)團隊  
這篇文章主要為大家介紹了Electron調(diào)用外接攝像頭并拍照上傳實例實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

背景

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

需求分析

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

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

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

實現(xiàn)

視頻采集

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

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

MediaDevices.getUserMedia()

代碼如下:

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

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

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

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

<template>
    <div class="video-page">
        <div class="video-content">
            <video ref="video" class="video-item"></video>
        </div>
    </div>
</template>
export default {
   methods: {
       getUserMedia() {
            /* 可同時開啟video(攝像頭)和audio(麥克風) 這里只請求攝像頭,所以只設(shè)置video為true */
            navigator.mediaDevices.getUserMedia({ video: true })
                .then(function(stream) {
                  /* 使用這個 stream 傳遞到成功回調(diào)中 */
                  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標簽內(nèi),如下圖。

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

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

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

得到的設(shè)備列表數(shù)據(jù)格式如下:

kind類型有三種,分別是audioinput、audiooutputvideoinput。分別代表音視頻的輸入和輸出??稍诹斜碇胁檎夷繕嗣襟w是否已經(jīng)接入且可用。

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

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

拍照生成圖片

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

<template>
    <div class="video-page">
        <div class="video-content">
            <video ref="video" class="video-item" v-if="showVideo"></video>
            <canvas ref="canvas" v-else width="500" height="346"></canvas>
        <div class="video-buttons">
            <div @click="capture" class="button-item capture">拍照</div>
            <div @click="submit" class="button-item 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

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

1. 使用HTMLCanvasElement.toBlob()

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

語法

toBlob(callback, type, quality)

參數(shù)

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

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

quality:0-1的數(shù)字,表示圖片質(zhì)量,可選

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

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的結(jié)果如下圖:

2. 使用HTMLCanvasElement.toDataURL()

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

Data URL,即前綴為 data: 協(xié)議的 URL,其允許內(nèi)容創(chuàng)建者向文檔中嵌入小文件。

語法

canvas.toDataURL(type, encoderOptions);

參數(shù)

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

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

返回值

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

<template>
    <div class="video-page">
        <div class="video-content">
            <video ref="video" class="video-item" v-if="showVideo"></video>
            <canvas ref="canvas" v-else width="500" height="346"></canvas>
        <div class="video-buttons">
            <div @click="capture" class="button-item capture">拍照</div>
            <div @click="submit" class="button-item submit">提交</div>
        </div>
    </div>
</template>
export default {
   data: {
       /* 是否展示攝像頭畫面 */
       showVideo: true,
   },
   methods: {
        /* 將base64轉(zhuǎn)為圖片文件 */
        convertBase64UrlToImgFile(urlData, fileType) {
            const imgData = urlData.split('base64,').splice(-1)[0]
            /* 解碼使用 base-64 編碼的字符串 轉(zhuǎn)換為byte */
            const bytes = window.atob(imgData)
            /* 處理異常,將ASCII碼小于0的轉(zhuǎn)換為大于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)
            }
            /* 轉(zhuǎn)換成文件,可以添加文件的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轉(zhuǎn)換圖片文件。和HTMLCanvasElement.toBlob()方法得到的結(jié)果一致。

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

總結(jié)

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

Electron是基于ChromiumNode.js實現(xiàn)的,這就使前端開發(fā)者可以使用JavaScriptHTMLCSS輕松構(gòu)建跨平臺的桌面應用。Electron可以使用幾乎所有的Web前端生態(tài)領(lǐng)域及Node.js生態(tài)領(lǐng)域的組件和技術(shù)方案。

后續(xù)會介紹Electron在智能驗機應用中的實踐方案,更多關(guān)于Electron調(diào)用攝像頭拍照上傳的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Lua表達式和控制結(jié)構(gòu)學習筆記

    Lua表達式和控制結(jié)構(gòu)學習筆記

    這篇文章主要介紹了Lua表達式和控制結(jié)構(gòu)學習筆記,本文講解了算術(shù)操作符、關(guān)系操作符、邏輯操作符、局部變量與作用域、控制結(jié)構(gòu)等內(nèi)容,需要的朋友可以參考下
    2014-12-12
  • koa2使用ejs和nunjucks作為模板引擎的使用

    koa2使用ejs和nunjucks作為模板引擎的使用

    這篇文章主要介紹了koa2使用ejs和nunjucks作為模板引擎的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • npm?install安裝失敗常見問題的解決辦法小結(jié)

    npm?install安裝失敗常見問題的解決辦法小結(jié)

    有時候前端安裝npm install 安裝包總是安裝不上,下面這篇文章主要給大家介紹了關(guān)于npm?install安裝失敗常見問題的解決辦法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Node.js中的流(Stream)介紹

    Node.js中的流(Stream)介紹

    這篇文章主要介紹了Node.js中的流(Stream)介紹,本文講解了什么是流、pipe方法、流的分類、Readable流狀態(tài)的切換等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • node.js連接MongoDB數(shù)據(jù)庫的2種方法教程

    node.js連接MongoDB數(shù)據(jù)庫的2種方法教程

    這幾天一直在學習mongdb的基礎(chǔ)知識,跟著網(wǎng)上大神的腳步(代碼)去模擬連接mongodb數(shù)據(jù)庫,下面這篇文章就給大家總結(jié)介紹了node.js連接MongoDB數(shù)據(jù)庫的2種方法教程,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • 詳解NODEJS的http實現(xiàn)

    詳解NODEJS的http實現(xiàn)

    這篇文章主要介紹了詳解NODEJS的http實現(xiàn)的技術(shù)過程以及詳細分析,需要的朋友學習參考下吧。
    2018-01-01
  • node解析修改nginx配置文件操作實例分析

    node解析修改nginx配置文件操作實例分析

    這篇文章主要介紹了node解析修改nginx配置文件操作,結(jié)合實例形式分析了node.js使用nginx-conf解析修改nginx配置文件的相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • 全面了解Node事件循環(huán)

    全面了解Node事件循環(huán)

    這篇文章主要詳細介紹了Node事件循環(huán),文中的圖片以及文字講解可以幫助大家更好的了解事件循環(huán),感興趣的小伙伴可以看一看,多多參考一下
    2021-08-08
  • 在Node.js中判斷路徑是否絕對的解決方法

    在Node.js中判斷路徑是否絕對的解決方法

    在不同的操作系統(tǒng)中,路徑的表示方式有很大的差異,當編寫跨平臺的 Node.js 應用時,正確判斷路徑的絕對性變得至關(guān)重要,本文提供了path-is-absolute模塊的詳細使用指南,它是一個兼容 Node.js 早期版本且適用于所有操作系統(tǒng)的解決方案,需要的朋友可以參考下
    2024-04-04
  • node-sass常見報錯的問題及解決方法

    node-sass常見報錯的問題及解決方法

    在安裝node-sass時,經(jīng)常會遇到下載慢、版本不匹配或python錯誤等問題,使用淘寶鏡像加速下載、通過nvm管理node版本或指定node-sass版本號安裝,都能有效解決這些問題,若遇到python相關(guān)錯誤,檢查node版本是否合適通常可以解決,感興趣的朋友一起看看本文吧
    2024-09-09

最新評論