vue实现录屏功能
dearweb 发布:2021-10-26 10:09:55阅读:vue实现录屏功能分享学习使用。
<!--录屏--> <template> <div class="container"> <section class="item"> <span class="type-name">文件名称:</span> <input type="text" v-model.trim="fileName" /> <span>.mp4</span> </section> <section class="item"> <span class="type-name">录制时长</span> <span>{{timeLong}}s</span> </section> <section> <button class="media-btn" @click="clicks()" title="点击开始录制">{{txt}}</button> </section> </div> </template> <script> export default { data() { return { timeout: 0, recordedBlobs: [], fileName: '', txt: '开始录制', status: false, stream: null, options: { audioBitsPerSecond: 128000, videoBitsPerSecond: 4500000, mimeType: 'video/webm' }, startTime: 0, timeLong: 0, timeLongs: null, endTime: 0 } }, watch: { status(a) { if (a) { this.txt = '停止录制' } else { this.txt = '开始录制' } } }, methods: { clicks() { if (this.status) { this.stopReset() this.status = false clearInterval(this.timesLongs) } else { this.startScreen() } }, cauTime() { this.timeLongs = setInterval(() => { this.timeLong = (new Date().getTime() - this.startTime) / 1000 }, 200) }, stopReset() { this.stream.getTracks().forEach(track => track.stop()) this.recordedBlobs = [] }, startScreen() { //注意,加上 audio: true 之后底部可以拖动的停止就失效了,正在fixing navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }).then( stream => { this.status = !this.status console.log('开始录制') this.startTime = new Date().getTime() this.cauTime() this.stream = stream const mediaRecorder = new MediaRecorder(stream, this.options) mediaRecorder.ondataavailable = event => { if (event.data.size > 0) { this.status = false clearInterval(this.timeLongs) console.log('结束录制,录制时长:' + this.timeLong + 's') this.recordedBlobs.push(event.data) this.download() this.stopReset() } } mediaRecorder.start() }, error => console.log(error) ) }, download() { const blob = new Blob(this.recordedBlobs, { type: 'video/mp4' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') document.body.appendChild(a) a.style.display = 'none' a.href = url if (this.fileName) { a.download = this.fileName + '.mp4' } else { a.download = new Date() + '.mp4' } a.click() window.URL.revokeObjectURL(url) } } } </script> <style scoped> .container { width: 450px; height: 250px; border: 1px solid; } .item { display: flex; align-items: center; margin: 25px 0; font-size: 20px; } .item .unit { margin-left: 10px; } .item input { height: 30px; padding: 1px; padding-left: 5px; } .item input[type='text'] { width: 180px; } .item input[type='number'] { width: 80px; } .type-name { width: 30%; } .media-btn { background: rgb(146, 224, 214); border: none; padding: 8px; border-radius: 5px; cursor: pointer; font-weight: 800; outline: none; } .media-btn:hover { background: rgb(155, 235, 224); } .tip { background-color: rgb(248, 243, 172); display: inline-block; padding: 19px; font-size: 25px; font-weight: 900; border-radius: 3px; margin-top: 19px; } </style>
小礼物走一波,支持作者
赏还没有人赞赏,支持一波吧