forked from drone/command-center-dashboard

罗广辉
2025-04-21 22a23b05b25e4b5c616f65989ac0ca16324f4c29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
export default class RecordVideo {
    /**
     * 构造函数
     *
     * @param  {Object}   videoObj 视频对象
     */
    constructor(videoObj) {
        this.video = videoObj
        this.mediaRecorder = null
        this.chunks = []
    }
 
    /**
     * 初始化
     *
     * @return {Object} promise
     */
    init() {
        // 返回Promise对象
        // resolve 正常处理
        // reject 处理异常情况
        return new Promise((resovle, reject) => {
            navigator.mediaDevices
                .getUserMedia({
                    audio: true,
                    video: true,
                    // video: {
                    //     width: this.videoWidth,
                    //     height: this.videoHeight
                    // }
                })
                // 返回一个媒体内容的流
                .then(stream => {
                    // 检测是否支持 srcObject,该属性在新的浏览器支持
                    if ('srcObject' in this.video) {
                        this.video.srcObject = stream
                    } else {
                        // 兼容旧的浏览器
                        this.video.src = window.URL.createObjectURL(stream)
                    }
 
                    // 当视频的元数据已经加载时触发
                    this.video.addEventListener('loadmetadata', () => {
                        this.video.play()
                    })
                    this.mediaRecorder = new MediaRecorder(stream)
                    this.mediaRecorder.addEventListener('dataavailable', e => {
                        this.chunks.push(e.data)
                    })
                    resovle()
                })
                // 异常抓取,包括用于禁用麦克风、摄像头
                .catch(error => {
                    reject(error)
                })
        })
    }
 
    /**
     * 视频开始录制
     */
    startRecord() {
        if (this.mediaRecorder.state === 'inactive') {
            this.mediaRecorder.start()
        }
    }
 
    /**
     * 视频结束录制
     */
    stopRecord() {
        if (this.mediaRecorder.state === 'recording') {
            this.mediaRecorder.stop()
        }
    }
 
    /**
     * 检测当前浏览器对否支持
     *
     * @return {boolean} 当前浏览器是否支持
     */
    isSupport() {
        const flag = navigator.mediaDevices && navigator.mediaDevices.getUserMedia
        if (flag) {
            return true
        }
    }
}