精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Electron應用中實現調用外接攝像頭并拍照上傳

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

背景

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

需求分析

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

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

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

實現

視頻采集

由于 Electron 內置了 Chromium 瀏覽器,該瀏覽器對各項前端標準都支持得非常好,所以基于 Electron 開發應用不會遇到瀏覽器兼容性問題。幾乎可以在 Electron 中使用所有 HTML5、CSS3 、ES6 標準中定義的 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 對象。若找不到滿足請求參數的媒體類型,promise會reject回調一個NotFoundError。

現在已經成功獲取到視頻流,接下來就是將視頻流回顯到頁面。這里使用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(麥克風) 這里只請求攝像頭,所以只設置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類型有三種,分別是audioinput、audiooutput和videoinput。分別代表音視頻的輸入和輸出。可在列表中查找目標媒體是否已經接入且可用。

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

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

拍照生成圖片

拍照其實就是截取視頻中的某一幀,這里使用canvas來實現截取。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

上個步驟已經完成了拍照,接下來就需要將圖片上傳至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 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轉為圖片文件 */
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是基于Chromium和Node.js實現的,這就使前端開發者可以使用JavaScript、HTML和CSS輕松構建跨平臺的桌面應用。Electron可以使用幾乎所有的Web前端生態領域及Node.js生態領域的組件和技術方案。

圖片


責任編輯:武曉燕 來源: 大轉轉FE
相關推薦

2012-05-18 15:10:22

HTML5

2009-08-21 17:11:05

C#攝像頭

2016-02-22 10:30:38

AngularJSHTML5攝像頭

2012-06-23 20:13:44

HTML5

2024-11-29 16:51:18

2023-12-20 17:33:52

2020-12-07 12:05:07

GUITkinterPython

2021-03-11 10:21:55

特斯拉黑客網絡攻擊

2013-03-21 09:56:09

2018-06-20 11:54:54

2009-08-21 17:17:49

C#攝像頭編程

2025-01-13 00:00:30

WinForm應用開發

2011-04-25 09:16:10

Windows 8

2017-06-20 11:45:52

2021-07-19 14:47:11

微軟漏洞Windows

2021-08-26 23:17:59

人工智能智慧城市攝像頭

2011-09-08 13:53:20

Linux攝像頭

2009-08-21 17:24:18

C#控制攝像頭

2009-06-17 11:52:01

Linux

2022-04-15 11:30:59

代碼,Python保存視頻
點贊
收藏

51CTO技術棧公眾號

久久久影院一区二区三区| 欧美激情一区二区三区成人| 狠狠躁狠狠躁视频专区| 久久77777| 北条麻妃一区二区三区| 欧美在线视频观看| 久久久久麻豆v国产| 视频在线一区| 一本在线高清不卡dvd| www.亚洲一区二区| 日本不卡视频一区二区| 久久99国产精品久久99| 亚州精品天堂中文字幕| 青青青视频在线播放| 午夜视频一区二区在线观看| 欧美性色19p| 日韩人妻精品一区二区三区| 四虎影视在线播放| 国产精品一区久久久久| 欧美资源在线观看| 全网免费在线播放视频入口| 中文有码一区| 精品福利一区二区三区| www.夜夜爽| 午夜伦理福利在线| 一区二区三区日韩精品视频| 日韩三级电影网站| 丰满人妻一区二区三区免费视频| 免费人成精品欧美精品| 555www成人网| 久久高清无码视频| 五月开心六月丁香综合色啪 | 神马久久久久久久久久| 久草中文综合在线| 国产成人精品av| 久久久久久久99| 欧美va天堂在线| 色狠狠久久aa北条麻妃 | 性猛交富婆╳xxx乱大交天津| 日韩电影免费一区| 欧美在线一区二区视频| 精品无码m3u8在线观看| 欧美在线不卡| 操日韩av在线电影| 永久免费看片视频教学| 色777狠狠狠综合伊人| 亚洲少妇中文在线| 亚洲天堂久久新| 亚洲素人在线| 亚洲片av在线| 在线观看日本中文字幕| 色综合中文网| 一区二区欧美激情| 黄色片网站免费| 国产欧美日韩一区二区三区四区| 日韩av资源在线播放| 这里只有精品在线观看视频 | 精品国产1区2区3区| 五月天丁香社区| 草草视频在线一区二区| 亚洲福利视频二区| 日韩aaaaa| 日本福利一区| 亚洲性av网站| 国产91在线播放九色| 天天插综合网| 欧美精品国产精品日韩精品| 日本少妇性高潮| 国产婷婷精品| 国产精品夫妻激情| 91国内精品视频| 国产激情视频一区二区在线观看| 成人黄色在线免费观看| 老牛影视av牛牛影视av| 91原创在线视频| 日本高清一区| 黄色网页在线观看| 亚洲成人动漫精品| 北条麻妃在线视频| 成人在线精品| 日韩成人性视频| 少妇太紧太爽又黄又硬又爽小说| 91久久国产| 91精品国产高清久久久久久91| 91video| 蜜臀av一区二区三区| 亚洲999一在线观看www| 亚洲人成色777777精品音频| 国产午夜精品福利| 国产在线无码精品| 一级毛片久久久| 9191国产精品| jizz日本免费| 91亚洲国产成人久久精品| 精品中文字幕乱| 狠狠人妻久久久久久综合| 美女视频第一区二区三区免费观看网站| 国产主播在线一区| 婷婷视频在线观看| 亚洲天堂网中文字| av免费播放网址| 久久天堂久久| 亚洲欧洲日产国码av系列天堂| 国产尤物在线播放| 午夜在线精品偷拍| 96久久精品| 成人在线观看免费| 亚洲高清视频中文字幕| 三级av免费观看| 免费成人三级| 免费不卡在线观看av| 无码人妻精品一区二区| 国产激情视频一区二区在线观看| 日韩欧美一区二区三区四区五区| 男男gaygays亚洲| 欧美日韩久久一区| 加勒比综合在线| 国产欧美成人| 99爱精品视频| 26uuu亚洲电影在线观看| 欧美在线|欧美| 9.1成人看片| 极品中文字幕一区| 91久久国产综合久久蜜月精品 | 欧美一级一片| 久久免费国产精品1| 国产精品久久久久久久久毛片| 久久无码av三级| 国产成人无码a区在线观看视频| 国产一区二区久久久久| 日韩在线免费av| 国产情侣免费视频| 久久久久久黄色| 免费欧美一级视频| 欧美日韩精品一区二区三区在线观看| 美乳少妇欧美精品| 99热这里是精品| 日韩理论片中文av| 亚洲欧美日韩三级| 99久久99久久精品国产片桃花| 国产精品成人一区二区| 麻豆av电影在线观看| 欧美性猛交xxxx免费看| 李宗瑞91在线正在播放| 一级一片免费看| 蜜臀久久99精品久久久久久9 | 久久久久久久久久久免费精品 | 成人不卡视频| 中文字幕免费精品一区高清| 波多野结衣影片| 国产欧美va欧美不卡在线| 国产成人a亚洲精v品无码| 西野翔中文久久精品字幕| 欧美一级淫片播放口| 婷婷丁香花五月天| 色菇凉天天综合网| 精品人妻中文无码av在线| 奇米777欧美一区二区| 亚洲精品在线视频观看| 电影一区中文字幕| 久久99国产精品自在自在app| www.com在线观看| 亚洲国产精品影院| 蜜桃精品成人影片| 日本美女视频一区二区| 一区二区三区四区五区精品 | 日本免费网站视频| 国产麻豆午夜三级精品| 国产精品一线二线三线| 亚洲人成伊人成综合图片| 国产精品爱久久久久久久| 婷婷激情在线| 精品国产123| 欧美性猛交xxxx乱大交hd | 中文字幕亚洲字幕| 一级特黄色大片| 一区二区三区小说| 日本黄色片在线播放| 日本中文字幕一区二区视频| 强伦女教师2:伦理在线观看| 精品女人视频| 国产精品免费久久久久影院| h片在线播放| 国产视频自拍一区| 6—12呦国产精品| 亚洲一区二区三区四区的| 添女人荫蒂视频| 久久精品国产精品亚洲精品| 免费看欧美一级片| av中文字幕一区二区| 亚洲影影院av| 欧美成a人片在线观看久| 久久国产精品久久久久久| 天天在线女人的天堂视频| 欧美精品色一区二区三区| 成人免费区一区二区三区| 国产精品久久久久久一区二区三区| 在线播放av网址| 美美哒免费高清在线观看视频一区二区 | 久久99久久99精品免观看粉嫩| 婷婷伊人综合中文字幕| 欧美高清性hdvideosex| 天堂中文在线网| 一区二区三区在线观看欧美| 四虎成人免费影院| 99久免费精品视频在线观看| 波多野结衣国产精品| 亚洲一区二区网站| 日本久久久网站| 欧美黄色录像片| 欧美日韩在线不卡一区| 超碰97成人| 亚洲自拍小视频免费观看| 经典三级一区二区| 国外色69视频在线观看| 麻豆av在线导航| 亚洲色图第一页| 污视频网站免费观看| 日韩亚洲欧美在线| 91中文字幕在线视频| 在线观看视频91| 国产 日韩 欧美 在线| 悠悠色在线精品| 日韩影院一区二区| 国产精品美女久久久久久久久久久 | 北条麻妃视频在线| 日韩一区二区免费看| 国产人妻人伦精品| 无码一区二区三区视频| 伊人色综合影院| 日韩不卡一区| 亚洲成人一区二区三区| 国产一区网站| 免费在线观看一区二区| 欧洲vs亚洲vs国产| 久久精品日产第一区二区三区| 国产精品成人自拍| 国产成人精品免费视频大全最热| 日韩在线视频一区二区三区| 91在线色戒在线| 国产免费区一区二区三视频免费| 成人黄色影片在线| 电影91久久久| av资源一区二区| 亚洲一区二区电影| 国产另类第一区| 美女av一区| 欧美激情一区二区三区在线视频| 网曝91综合精品门事件在线| 久久久久欧美| 国产在视频线精品视频www666| 欧美三级电影在线播放| 国产不卡av一区二区| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 亚洲3区在线| 福利视频久久| 全国精品免费看| 欧美日韩精品久久久免费观看| 神马电影久久| 亚洲欧洲在线一区| 欧美在线观看天堂一区二区三区| 99国产精品白浆在线观看免费| 国模一区二区三区| 免费看又黄又无码的网站| 久久精品女人天堂| 91av视频免费观看| 成人精品国产福利| 亚洲综合色一区| 国产精品久久99| 久草免费在线视频观看| 精品久久久久久久久久久久久| 一级黄色av片| 3d动漫精品啪啪1区2区免费| 成人久久精品人妻一区二区三区| 亚洲精品二三区| jizz亚洲| 欧美激情啊啊啊| 台湾佬中文娱乐久久久| 91久久精品久久国产性色也91| gogo久久日韩裸体艺术| 青青影院一区二区三区四区| 99久久夜色精品国产亚洲96| 国产xxxx振车| 人人狠狠综合久久亚洲| 91视频免费入口| 久久综合九色综合欧美98| 三级黄色片在线观看| 亚洲超碰精品一区二区| 国产三级理论片| 精品精品欲导航| www日韩tube| 韩国精品美女www爽爽爽视频| 日韩一级二级| 国产日韩久久| 国产国产精品| 日本成年人网址| 国产一区二区三区av电影| 免费毛片视频网站| 亚洲一区中文在线| 一级黄色录像大片| 亚洲精品视频在线观看视频| 自拍亚洲图区| 国产精品视频色| 亚洲精品aaaaa| www.av蜜桃| 国产一区在线观看视频| 波多野吉衣中文字幕| 亚洲影视在线播放| 91丨九色丨蝌蚪丨对白| 亚洲日本aⅴ片在线观看香蕉| 在线观看三级视频| 国产欧美日韩91| 色综合中文网| 欧美黄网站在线观看| 盗摄精品av一区二区三区| 永久免费未视频| 在线免费观看日本一区| 亚洲人成色777777老人头| 欧美日韩福利在线观看| 亚洲欧美专区| 亚洲精品国产一区| 日韩国产一区二| 欧美多人猛交狂配| 精品女厕一区二区三区| www.色婷婷.com| 欧美日产国产成人免费图片| 中文字幕成人| 自拍偷拍一区二区三区| 日本视频在线一区| 精品国产av无码| 色素色在线综合| 欧美女v视频| 国产成人精品国内自产拍免费看| 亚洲香蕉视频| 国产精品亚洲二区在线观看| 91毛片在线观看| √资源天堂中文在线| 日韩成人在线免费观看| 看黄在线观看| 久久久www免费人成黑人精品| 亚洲精品视频啊美女在线直播| 欧美xxxx日本和非洲| 亚洲国产成人高清精品| 日韩一级中文字幕| 97在线看福利| 色老板在线视频一区二区| 免费观看精品视频| 国产日韩三级在线| 国产九色91回来了| 色偷偷av一区二区三区| avtt久久| www.在线观看av| 成人激情黄色小说| 自拍偷拍欧美亚洲| 亚洲女人被黑人巨大进入al| 偷拍精品精品一区二区三区| 日韩性感在线| 九九视频精品免费| www.av视频| 欧美精品一区二区高清在线观看| 97蜜桃久久| 日本在线一区| 狠狠狠色丁香婷婷综合久久五月| 澳门黄色一级片| 亚洲国产欧美精品| 色8久久影院午夜场| 一区二区三区国产福利| 懂色av一区二区三区蜜臀| 日本熟妇乱子伦xxxx| 亚洲人成电影网站色| 久久婷婷五月综合色丁香| 7777在线视频| 99久久久久久99| 亚洲综合网av| 欧美国产日韩一区| 国产不卡一二三区| 色偷偷中文字幕| 精品毛片网大全| 男人的天堂在线视频免费观看| 成人区精品一区二区| 久久久久久久波多野高潮日日| 中文字幕第69页| 亚洲丁香久久久| 色999久久久精品人人澡69| 国产aaa免费视频| 日本一区二区综合亚洲| 国产黄色大片网站| 日韩av免费在线观看| 亚洲色图二区| 成人性生交大免费看| 欧美一级片在线看| 345成人影院| 大陆极品少妇内射aaaaaa| 久久久久久黄色| 免费看国产片在线观看| 国产精品专区h在线观看| 亚洲欧洲视频| 乱h高h女3p含苞待放| 亚洲欧洲在线视频| 久久99精品国产自在现线|