一、录音频
模板
<template>
<div class="audio-box">
<span style="padding-right: 20px">音频录制:</span>
<el-button
:type="recording ? 'danger' : 'primary'"
@click="handleStartOrStop"
circle
>
<i class="iconfont" :class="recording ? 'icon-stop' : 'icon-start'"></i>
</el-button>
<audio controls :src="audioSrc" ref="recordPlayer" class="audio-item">
<a :href="audioSrc"> Download audio </a>
</audio>
</div>
</template>
JS
<script>
export default {
data() {
return {
mediaRecorder: null,
recording: false,
audioSrc: null,
chunks: [],
};
},
methods: {
handleStartOrStop() {
if (!this.recording) {
this.start();
} else {
this.stop();
}
},
start() {
this.mediaRecorder && this.mediaRecorder.stop();
let constraints = { audio: true };
let mediaStream = navigator.mediaDevices.getUserMedia(constraints);
mediaStream.then(
(stream) => {
this.$message.success("开始录制");
this.chunks = [];
this.recording = true;
let audioContext = new AudioContext();
let destination = audioContext.createMediaStreamDestination();
let mediaStreamSource = audioContext.createMediaStreamSource(stream);
mediaStreamSource.connect(destination);
let mediaRecorder = new MediaRecorder(destination.stream);
mediaRecorder.ondataavailable = (e) => this.chunks.push(e.data);
mediaRecorder.onstop = () => {
let blob = new Blob(this.chunks, { type: "audio/mpeg" });
let url = URL.createObjectURL(blob);
this.audioSrc = url;
};
this.mediaRecorder = mediaRecorder;
mediaRecorder.start();
},
() => {
console.log("打开失败!");
}
);
},
stop() {
this.recording = false;
this.$message.success("录制完成!");
this.mediaRecorder.requestData();
this.mediaRecorder.stop();
},
},
};
</script>
二、录视频
模板
<template>
<div class="video-box">
<span class="word-span">视频录制:</span>
<el-button
:type="recording ? 'danger' : 'primary'"
@click="handleStartOrStop"
circle
>
<i class="iconfont" :class="recording ? 'icon-stop' : 'icon-start'"></i>
</el-button>
<video id="video" autoplay class="video-item" v-show="recording"></video>
<video
class="video-item"
controls
:src="audioSrc"
v-show="!recording && audioSrc"
></video>
</div>
</template>
JS
<script>
export default {
data() {
return {
mediaRecorder: null,
recording: false,
audioSrc: null,
mediaBlobs: [],
recorder: null,
medisStream: null,
};
},
methods: {
handleStartOrStop() {
if (!this.recording) {
this.start();
} else {
this.stop();
}
},
async start() {
this.recording = true;
const self = this;
this.$message.success("开始录制视频!");
this.medisStream = await navigator.mediaDevices.getUserMedia({
audio: true,
video: true,
});
var video = document.getElementById("video");
video.srcObject = this.medisStream;
video.play();
this.recorder = new MediaRecorder(this.medisStream);
this.recorder.ondataavailable = (e) => {
self.mediaBlobs.push(e.data);
};
this.recorder.onstop = () => {
let recordedBlob = new Blob(this.mediaBlobs, { type: "video/webm" });
this.audioSrc = URL.createObjectURL(recordedBlob);
};
this.recorder?.start(1000);
},
stop() {
this.recording = false;
this.$message.success("录制完成!");
this.recorder?.stop();
this.medisStream.getTracks().forEach((track) => track.stop());
},
},
};
</script>