H5實現調用終端設備的相機

一、getUserMedia API簡介

getUserMedia API爲用戶提供訪問硬件設備媒體(攝像頭、視頻、音頻、地理位置等)的接口,基於該接口,開發者可以在不依賴任何瀏覽器插件的條件下訪問硬件媒體設備。

getUserMedia API最初是navigator.getUserMedia,目前已被最新Web標準廢除,變更爲navigator.mediaDevices.getUserMedia(),但瀏覽器支持情況不如舊版API普及。

MediaDevices.getUserMedia()方法提示用戶允許使用一個視頻和/或一個音頻輸入設備,例如相機或屏幕共享和/或麥克風。如果用戶給予許可,就返回一個Promise對象,MediaStream對象作爲此Promise對象的Resolved[成功]狀態的回調函數參數,相應的,如果用戶拒絕了許可,或者沒有媒體可用的情況下PermissionDeniedError或者NotFoundError作爲此Promise的Rejected[失敗]狀態的回調函數參數。注意,由於用戶不會被要求必須作出允許或者拒絕的選擇,所以返回的Promise對象可能既不會觸發resolve也不會觸發reject。

參考官方API:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia

手機版本支持情況:在這裏插入圖片描述

二、頁面代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>拍照</title>
</head>
<body>
<video id="video" width="640" height="480" autoplay="autoplay"></video>
<!--拍照按鈕-->
<div>
    <button id="capture">拍照</button>
</div>
<!--描繪video截圖-->
<canvas id="canvas" width="640" height="480"></canvas>
<script>
    let video = document.getElementById("video");
    let canvas = document.getElementById("canvas");
    let context = canvas.getContext("2d");

    // 老的瀏覽器可能根本沒有實現 mediaDevices,所以我們可以先設置一個空的對象
    if (navigator.mediaDevices === undefined) {
        navigator.mediaDevices = {};
    }

    // 一些瀏覽器部分支持 mediaDevices。我們不能直接給對象設置 getUserMedia
    // 因爲這樣可能會覆蓋已有的屬性。這裏我們只會在沒有getUserMedia屬性的時候添加它。
    if (navigator.mediaDevices.getUserMedia === undefined) {
        navigator.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);
            });
        }
    }

    //默認使用前攝像頭,強制使用後置攝像頭如下設置
    // let constraints = {video: { facingMode: { exact: "environment" } }};
    let constraints = {video: true};
    navigator.mediaDevices.getUserMedia(constraints)
        .then(function (stream) {
            // 舊的瀏覽器可能沒有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);
        });

    //註冊拍照按鈕的單擊事件
    document.getElementById("capture").addEventListener("click", function () {
        //繪製畫面
        context.drawImage(video, 0, 0, 640, 480);
    });
</script>
</body>
</html> 

上面代碼完成後可以直接在瀏覽器裏使用http://localhost:8080查看。或者使用127.0.0.1進行本地查看。但是若是想要設置其他的ip地址,例如:192.168.0.11 等IP地址則無法訪問。

原因:getUserMedia除本地地址外,只支持安全的協議訪問。也就是說需要用https才能訪問,下面講解如何配置https。

三、https配置

1、使用jdk提供的keytoo工具生成祕鑰

打開命令行,輸入下列代碼:

keytool -genkey -alias tomcat -keyalg RSA -keystore ./server.keystore

進入命令後按下列輸入內容:
在這裏插入圖片描述

運行完畢後會在當前路徑下得到一個名爲server.keystore的祕鑰文件。

2、將祕鑰加入springboot工程

將祕鑰拷貝到項目根路徑。注意:跟路徑指的是工程的第一層路徑,請注意位置。
在這裏插入圖片描述

3、配置springboot的配置文件application.properties

加入下列代碼:

server.port=8443
server.ssl.key-store=server.keystore
server.ssl.key-alias=tomcat
server.ssl.enabled=true
server.ssl.key-store-password=123456
server.ssl.key-store-type=JKS

4、啓動項目,訪問路徑 https://localhost:8443/。

注意協議和端口號

會看到如下錯誤提示,這是因爲我們自己配置的祕鑰(證書)沒有官方註冊,無法被瀏覽器識別。可以點高級 -> 繼續前往 。

在這裏插入圖片描述
在這裏插入圖片描述

這時能正常訪問則說明我們的https配置完畢。可以替換成其他IP地址測試能正常使用攝像頭了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章