npm package: @itmirror/uvc-camera-jssdk
Description: 封装uvc-camera安卓方法和上传功能的jssdk
Author: intellimirror
Latest version: 1.1.7

# @itmirror/uvc-camera-jssdk
js-sdk for uvc-camera，封装安卓端方法调用和上传

### 安装
```
npm i @itmirror/uvc-camera-jssdk --save
```

### 使用
```
import uvcCamera from '@itmirror/uvc-camera-jssdk'

// web开发环境调试，需引入下面的测试数据
// 生产环境记得删除
import guaguaData from '@itmirror/uvc-camera-jssdk/lib/guaguaData.js'
uvcCamera.init('camera', { devData: guaguaData });
```
创建实例
```javascript
// 第一个参数为父容器的id，需要设置宽高
let myCamera = uvcCamera.init('camera', {
    host: '', // 请求地址
    uploadAction: '/upload', // 上传路径
    successAction: '/success', // 成功路径
    fps: 20, // 帧率
    retry: 3, // 上传重试次数
    fileType: 'base64' // 返回的文件格式
    buttonEvent: function () {} // 硬件按钮触发
}, function () {
    console.log('init success');
})
```

修改配置
```javascript
myCamera = uvcCamera.update({
    fps: 15,
    retry: 5,
    fileType: 'file'
})
```

开启摄像头
```javascript
myCamera.open(function (json) {}) // 开启后，自动开始传输数据
```

开始传输数据
```javascript
myCamera.start()
```

拍照
```javascript
myCamera.takePicture(function (data) {
    console.log('图片为：', data)
})
```

换灯
```javascript
// 可选值: green, red, blue
myCamera.setLight('red')
```

重拍上一张
```javascript
myCamera.prev()
```

拍下一张
```javascript
myCamera.next()
```

上传
```javascript
myCamera.upload({
    options: {
        timeout: 10000
    },
    success: (ret) => {
        console.log('上传成功!')
    },
    fail: (err, ret) => {
        console.log('啊哦，上传失败了~')
    },
    progress: (percent) => {
        console.log('上传进度: ', percent)
    }
})
```

取消上传
```javascript
myCamera.abortUpload()
```

清除全部文件
```javascript
myCamera.clear()
```

停止传输数据
```javascript
myCamera.stop()
```

关闭摄像头
```javascript
myCamera.close()
```

销毁实例：可能会导致重新请求usb授权，原则上无需销毁
```javascript
myCamera.destroy()
```

### 参数
|     字段     |    默认值    |    类型     |     描述     |
| :---------: | :---------: | :---------: | :---------: |  
|fps|20|Number|帧率，最大为20|  
|retry|3|Number|上传失败重试次数|  
|fileType|base64|String|拍照返回的文件类型: base64, file|  
|buttonEvent|null|Function|硬件按钮事件|  
|host | '' | String| 请求地址 |  
|uploadAction|'/api/uploadImg'|String|上传路径|  
|successAction|'/api/uploadImgSuccess'|String|上传完成通知路径|  
|uploadMultiple|true|Boolean|是否一起上传|  

### 完整示例
```javascript
// html
<script src="../lib/guaguaData.js"></script>
<script src="../lib/index.js"></script>
// js
<script>
const $result = document.getElementById('result');
const $statusBtn = document.getElementById('statusBtn');
// 初始化
let isInit = false;
let isOpen = false;
let c;
init();

function init(cb = function() {}) {
    c = uvcCamera.init('camera', {
        host: 'http://192.168.61.156:7001', // 上传地址
        uploadAction: '/skinTest/uploadImg', // 上传地址
        successAction: '/skinTest/uploadImgSuccess', // 通知地址
        devData: guaguaData,
        buttonEvent: function() {
            console.log('button-handle');
            takePicture();
        }
    }, () => {
        isInit = true;
        cb();
        console.log('init success');
    });
}

function doChange() {
    if (!isInit) {
        init(changeStatus);
    } else {
        changeStatus();
    }
}

// 开始 or 停止
let isStop = true;
function changeStatus() {
    if (!isOpen) {
        // 开启摄像头
        c.open((json) => {
            if (!json.status) {
                console.log('摄像头开启失败！')
                isStop = true;
                $statusBtn.innerText = '开始';
                return;
            }
            isOpen = true;
            isStop = false;
            $statusBtn.innerText = '停止';
        })
        return
    }

    isStop = !isStop;
    $statusBtn.innerText = isStop ? '开始' : '停止';
    isStop ? c.stop() : c.start();
};

// 换灯
let light_i = 0;
const lights = ['green', 'red', 'blue'];
function changeLight() {
    light_i++;
    light_i = light_i > lights.length - 1 ? 0 : light_i;
    c.setLight(lights[light_i])
}

// 拍照
function takePicture() {
    c.takePicture(function (data) {
        console.log('data is: ', data)
        const img = document.createElement('img');
        img.src = data;
        $result.appendChild(img);

        setTimeout(() => {
            c.next(); // 拍下一张
        }, 1500);
    });
}

// 上传
function upload() {
    c.upload({
        success: function(res) {
            console.log(res)
            console.log('上传成功!')
            c.destroy()
        },
        fail: function(err) {
            console.log(err)
            console.log('上传失败...')
        },
        progress: function(val) {
            console.log(val)
            console.log('上传进度: ', val);
        },
    })
}

// 销毁
function destroy() {
    if (c) {
        c.destroy();
        c = null;
        isStop = true;
        isInit = isOpen = false;
        $statusBtn.innerText = '开始';
    }
}
</script>
```

### 注意❗
* 上传完成会清空所有拍摄的照片，请自行保存
* 调用open之前需要等init完成
* 对应安卓方法在 [android.md](./android.md)