亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > HTML5 > 正文

HTML5通過navigator.mediaDevices.getUserMedia調用手機攝像頭問題

2024-09-05 07:23:25
字體:
來源:轉載
供稿:網友

navigator.mediaDevices.getUserMedia

應項目要求,需要實現移動端app嵌入H5頁面完成實人認證的功能。打開getUserMedia文檔,鏈接如下:
https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia
看上去很簡單,最終卻寫的懷疑人生。

API環境

問題一:(為什么不管怎么配置都顯示前置攝像頭)

想正常使用API必須在https環境下進行,否則你會發現不管怎么寫,都只能調用默認的攝像頭(大部分都是前置,只有少部分是后置)
前端開發者可以將文件上傳至"碼云"倉庫,獲取https鏈接然后在手機上預覽
鏈接:碼云倉庫入口

問題二:(API在安卓和ios效果一樣嗎?)

根據官方文檔,目前navigator.mediaDevices.getUserMedia在ios上只支持11版本以上,且只能在safari正常運行。安卓目前沒有發現版本限制,需要兼容的代碼如下

if (navigator.mediaDevices === undefined) {    navigator.mediaDevices = {}; }if (navigator.mediaDevices.getUserMedia === undefined) {    navigator.mediaDevices.getUserMedia = function (constraints) {    var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia || navigator.oGetUserMedia;	if (!getUserMedia) {	    return Promise.reject(new Error('getUserMedia is not implemented in this browser'));	}	return new Promise(function (resolve, reject) {		getUserMedia.call(navigator, constraints, resolve, reject);	});  }}

問題三:(第一次啟用成功調用前置攝像頭,第二次需要調用后置卻黑屏或者失?。?/strong>

失敗的原因很多,列舉兩個一開始我遇到的問題
1.前置攝像頭調用后,攝像功能需要關閉后才能正常執行第二次調用,否則會報錯:設備被占用。解決方法,在每次執行調用方法前,先關閉攝像設備。

if (window.stream) {    window.stream.getTracks().forEach(track => {          track.stop();    });}

親測有用,別的找了很多停止的方法都沒有效果。
2.調用后置API的方法還是無法喚醒后置攝像頭,于是我找到另外一個方法,通過查看手機攝像頭ID,來直接喚醒后置。

var deviceInfoId="", //攝像頭ID    num = 0, //攝像頭數量    carema = []; //攝像頭ID數組    //在頁面加載完成后獲得設備ID數組window.onload = navigator.mediaDevices.enumerateDevices().then(gotDevices);function gotDevices(deviceInfos) {        for (let i = 0; i < deviceInfos.length; ++i) {            if (deviceInfos[i].kind === 'videoinput') {                carema.push(deviceInfos[i].deviceId)              }        }        deviceInfoId = carema[后置位置];}            var constraints = {                audio: false,                video: {                    deviceId: deviceInfoId,                    //放在app里面需要下面配置一下                    "permissions": {                        "audio-capture": {                            "description": "Required to capture audio using getUserMedia()"                        },                        "video-capture": {                            "description": "Required to capture video using getUserMedia()"                        }                    }                }            };            navigator.mediaDevices.getUserMedia(constraints)                .then(function (stream) {                    var video = document.getElementById('video');                    try {                        window.stream = stream;                        video.srcObject = stream;                    } catch (error) {                        video.src = window.URL.createObjectURL(stream);                    }                    this.localMediaStream = stream;                    // video.play();   這個加不加好像沒有影響                })                .catch(function (err) {                    console.log(err.name + ": " + err.message);                });

如果只是一部手機可以這樣,但是測試了多部手機發現攝像頭數組毫無規律可循,這個方法慎用。
如果頁面上添加選擇攝像設備的按鈕的話,這個方法還是不錯的。查看設備能調用幾個攝像頭鏈接如下:https://webrtc.github.io/samples/src/content/devices/input-output/
由于我們的項目頁面不希望出現切換按鈕,面對后置出現的眾多BUG,最終選擇放棄,使用input調用攝像頭。

 <input class="card_input" v-on:change="appCapture($event)" type="file" accept="image/*" capture="camera" />

成功調用后用canvas實現成像并適應屏幕大小

我這里的代碼是取video的寬高然后復制給canvas,這樣可以讓canvas和video保持一致,只用給video設置寬度100%,高度調節成合適的值,就實現了適應手機屏幕。

  var video = document.getElementById('video');            var canvas = document.getElementById('canvas'),                ctx = canvas.getContext('2d'),                CHeight = video.clientHeight, //獲取屏幕大小讓canvas自適應                CWidth = video.clientWidth;            canvas.width = CWidth;            canvas.height = CHeight;            //localMediaStream 在data里定義一個{}            if (localMediaStream) {                ctx.drawImage(video, 0, 0, CWidth, CHeight);                var dataURL = canvas.toDataURL('image/jpeg'); //dataURL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA'                img.src = dataURL;

video成像鏡像問題

API喚醒的前置攝像頭是相反的,很不舒服很不舒服。
之后用css處理一下給video添加 transform: rotate(180deg),可以實現反轉,但是還是沒有達到和手機一樣的效果。
這時候可以選擇通過設備ID調用前置攝像頭,前置攝像頭的laval一直都是“default”,也有的是空值,但是也能實現。
配置代碼如下:

 var constraints = window.constraints = {                audio: false,                video: {                    sourceId: 'default',                    facingMode:  { exact: "user" }                 }              };

完美調用自己手機的前置攝像頭!??!

完整代碼如下:
頁面代碼:

<div @click='moveToCameraAVG()' v-cloak>     <img v-if="imginfo!==''" :src="imginfo" />     <div class="warm_title2">點擊自拍一張頭像</div></div><video id="video" class="pic_video" playsinline autoplay x5-video-player-type="h5" style='object-fit:fill'></video><canvas id="canvas" class="canvas_pic" style='margin: 0;padding: 0;'></canvas><div class="bottom_div">    <div>拍照</div>    <img src='images/pic_btn.png' class="capture-btn" @click='captureAvg' /></div>
 // 頭像相機        moveToCameraAVG() {            var self = this;            if (navigator.mediaDevices === undefined) {                navigator.mediaDevices = {};            }            if (navigator.mediaDevices.getUserMedia === undefined) {                navigator.mediaDevices.getUserMedia = function (constraints) {                    var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia || navigator.oGetUserMedia;                    if (!getUserMedia) {                        return Promise.reject(new Error('getUserMedia is not implemented in this browser'));                    }                    return new Promise(function (resolve, reject) {                        getUserMedia.call(navigator, constraints, resolve, reject);                    });                }            }            if (window.stream) {                window.stream.getTracks().forEach(track => {                    track.stop();                });            }            var constraints = window.constraints = {                audio: false,                video: {                    sourceId: 'default',                    facingMode:  { exact: "user" }                 }              };            navigator.mediaDevices.getUserMedia(constraints)                .then(function (stream) {                    var video = document.getElementById('video');                    try {                        window.stream = stream;                        video.srcObject = stream;                    } catch (error) {                        video.src = window.URL.createObjectURL(stream);                    }                    self.localMediaStream = stream;                    video.play();                })                .catch(function (err) {                    alert(err.name + ": " + err.message);                });        },        //停止攝像機        stopCapture: function () {            var video = document.getElementById('video');            if (!video.srcObject) return            let stream = video.srcObject            let tracks = stream.getTracks();            tracks.forEach(track => {                track.stop()            })        },        // 頭像照片        captureAvg() {            var vm = this;            var video = document.getElementById('video');            var canvas = document.getElementById('canvas'),                ctx = canvas.getContext('2d'),                CHeight = video.clientHeight, //獲取屏幕大小讓canvas自適應                CWidth = video.clientWidth;            canvas.width = CWidth;            canvas.height = CHeight;            if (vm.localMediaStream) {                ctx.drawImage(video, 0, 0, CWidth, CHeight);                var dataURL = canvas.toDataURL('image/jpeg'); //dataURL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA'                vm.imginfo = dataURL;                // 停止攝像機                video.pause();                this.stopCapture();            }        },

到此這篇關于HTML5通過navigator.mediaDevices.getUserMedia調用手機攝像頭問題的文章就介紹到這了,更多相關HTML5調用 攝像頭內容請搜索武林網以前的文章或繼續瀏覽下面的相關文章,希望大家以后多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成+人+综合+亚洲欧洲| 自拍偷拍亚洲欧美| 亚洲护士老师的毛茸茸最新章节| 国模私拍一区二区三区| 久久久久久久久电影| 精品中文字幕视频| 国产精品视频色| 欧美性xxxx极品hd欧美风情| 国产人妖伪娘一区91| 亚洲精品999| 91免费版网站入口| 在线日韩日本国产亚洲| 国产精品福利无圣光在线一区| 国产精品久久久久aaaa九色| 日韩欧美成人免费视频| 亚洲欧美999| 国产一区二区免费| 亚洲精品videossex少妇| 精品精品国产国产自在线| 精品二区三区线观看| 精品久久久91| 欧美极品少妇xxxxⅹ免费视频| 亚洲一区二区日本| 国产精品视频免费在线| 欧美精品福利视频| 91成人免费观看网站| 红桃视频成人在线观看| 日韩在线播放视频| 2023亚洲男人天堂| 亚洲欧洲一区二区三区在线观看| 日本久久久久亚洲中字幕| 国产免费亚洲高清| 亚洲国产精彩中文乱码av在线播放| 欧美激情一区二区三级高清视频| 成人春色激情网| 久久精品国产一区二区电影| 精品成人乱色一区二区| 久久久亚洲影院| 久久久999国产| 久久精品电影一区二区| 欧美日韩不卡合集视频| 精品动漫一区二区| 伊人久久久久久久久久久| 精品毛片网大全| 国产精品男女猛烈高潮激情| 亚洲美女动态图120秒| 97超级碰碰人国产在线观看| 日韩免费在线看| 影音先锋欧美在线资源| 日韩高清av一区二区三区| 欧美日韩中文字幕在线视频| 日韩成人av一区| 亚洲成人av中文字幕| 欧美日韩福利电影| 国产精品久久久亚洲| 久久久久亚洲精品成人网小说| 久青草国产97香蕉在线视频| 国产xxx69麻豆国语对白| 日韩黄在线观看| 欧美刺激性大交免费视频| 日韩欧美国产视频| 精品日本美女福利在线观看| 欧美色图在线视频| 福利精品视频在线| 国产精品国产亚洲伊人久久| 久久久欧美一区二区| 成人免费淫片aa视频免费| 亚洲曰本av电影| 欧美重口另类videos人妖| 国产午夜精品视频| 中文字幕日韩av电影| 亚洲国产成人91精品| 51久久精品夜色国产麻豆| 欧美亚洲另类视频| 欧美电影在线观看| 成人亚洲欧美一区二区三区| 欧美色视频日本版| 国产精品高潮在线| 国产成人avxxxxx在线看| 成人激情综合网| 欧美精品18videos性欧美| 欧美性高潮床叫视频| 国产一区二区三区高清在线观看| 高潮白浆女日韩av免费看| 在线亚洲午夜片av大片| 日韩激情在线视频| 欧美激情亚洲另类| 亚洲国产精品电影在线观看| 成人看片人aa| 成人国内精品久久久久一区| 亚洲一区二区三区xxx视频| 91美女片黄在线观看游戏| 国产99久久精品一区二区永久免费| 91sao在线观看国产| 精品女同一区二区三区在线播放| 欧美大片在线看| 中文字幕欧美视频在线| 77777少妇光屁股久久一区| 久久久久久av| 国产精品成人av性教育| 久久精品福利视频| 色妞色视频一区二区三区四区| 久久久久久国产精品三级玉女聊斋| 久久国产精品久久国产精品| 亚洲精品98久久久久久中文字幕| 欧美自拍视频在线观看| 91精品国产成人www| 亚洲激情免费观看| 2019亚洲日韩新视频| 97超碰国产精品女人人人爽| 国产一区二区香蕉| 亚洲色图美腿丝袜| 欧美亚洲国产另类| 亚洲欧美国产精品专区久久| 国产成人一区二区在线| 欧美激情精品久久久久久黑人| 国产精品电影一区| 国产精品久久一区主播| 欧美性视频精品| 91中文字幕在线| 中文字幕精品久久| 亚洲精品第一页| 91精品视频在线看| 8090理伦午夜在线电影| 欧美在线视频免费观看| 91国自产精品中文字幕亚洲| 国产精品自产拍高潮在线观看| 成人精品网站在线观看| 欧美精品做受xxx性少妇| 亚洲a在线观看| 欧美二区在线播放| 久久好看免费视频| 亚洲国产精品va在线| 国产欧美精品日韩精品| 欧美色另类天堂2015| 精品久久中文字幕久久av| 2025国产精品视频| 欧美最猛性xxxxx(亚洲精品)| 亚洲影院污污.| 亚洲精品短视频| 国产精品白丝av嫩草影院| 亚洲第一页自拍| 欧美电影免费在线观看| 亚洲有声小说3d| 岛国av一区二区在线在线观看| 欧美亚洲第一页| 久久久久久国产| 国产91ⅴ在线精品免费观看| 日韩av手机在线| 少妇高潮久久77777| 欧美性猛交xxxxx免费看| 久久久国产精品亚洲一区| 国产亚洲欧美一区| 久久久国产精品免费| 日韩暖暖在线视频| 97视频在线观看视频免费视频| 国产精品偷伦视频免费观看国产| 色偷偷av一区二区三区乱| 在线观看久久久久久| 日韩精品一区二区三区第95| 性色av一区二区三区在线观看| 中文字幕日韩欧美在线视频| 亚洲少妇中文在线| 91香蕉嫩草影院入口|