if (!window.AudioContext) {
window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;
}
// 老版浏览器可能根本没有实现mediaDevices, 为其设置一个空对象
if (!navigator.mediaDevices) {
navigator.mediaDevices = {
};
}
if (!navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia = function (constraints) {
let getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
// 浏览器不支持
if (!getUserMedia) {
return Promise.reject(new Error('您的浏览器暂不支持 getUserMedia !'));
}
// 包装老版 getUserMedia
return new Promise((resolve, reject) => getUserMedia.call(navigator, constraints, resolve, reject));
}
}
methods: {
start() {
// 停止之前的录制内容
this.$mediaRecorder && this.$mediaRecorder.stop();
if (!window.AudioContext) {
window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;
}
// 参考 https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia
// 老版浏览器可能根本没有实现mediaDevices, 为其设置一个空对象
if (!navigator.mediaDevices) {
navigator.mediaDevices = {
};
}
if (!navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia = function (constraints) {
let getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
// 浏览器不支持
if (!getUserMedia) {
return Promise.reject(new Error('您的浏览器暂不支持 getUserMedia !'));
}
// 包装老版 getUserMedia
return new Promise((resolve, reject) => getUserMedia.call(navigator, constraints, resolve, reject));
}
}
// 参数
// let constraints = {audio: true, video: true}; // 请求不带任何参数的音频和视频
let constraints = {
audio: true}; // 请求音频
let mediaStream = navigator.mediaDevices.getUserMedia(constraints);
mediaStream.then((stream) => {
console.info("打开成功!")
let audioContext = new AudioContext();
// 创建一个新的音视频对象
let destination = audioContext.createMediaStreamDestination();
// 创建音视频源
let mediaStreamSource = audioContext.createMediaStreamSource(stream);
// 将音视频源 链接 到新音视频对象 中
mediaStreamSource.connect(destination);
// 参考 https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder/MediaRecorder
// 媒体录制接口
let mediaRecorder = new MediaRecorder(destination.stream, {
audioBitsPerSecond: 16000});
let chunks = [];
// 有可用数据流时触发,e.data即需要的音视频数据
mediaRecorder.ondataavailable = (e) => chunks.push(e.data);
// 间视频录制结束时触发
mediaRecorder.onstop = () => {
// 通过Blob数据块, 合成完整的Blob块数据
let blob = new Blob(chunks, {
'type': 'audio/mpeg'});
// 通过Blob合建对象URL本地地址
let url = URL.createObjectURL(blob);
// 绑定到 audio 元素上
this.$refs.recordPlayer.src = url;
};
// 將 mediaRecorder 对象扔到全局this中, 用于其他方法调用
this.$mediaRecorder = mediaRecorder;
// 录制开始
mediaRecorder.start();
}, () => {
console.log("打开失败!");
});
},
stop() {
// 返回录制的二进制数据, 调用这个方法后会生成一个新的Blob对象
this.$mediaRecorder.requestData();
// 停止录制
this.$mediaRecorder.stop();
},
},
<template>
<div style="height: 100%; width: 100%;">
<div>
<audio ref="recordPlayer" controls src=""/>
<div></div>
<ButtonGroup>
<Button size="small" @click="start">开始</Button>
<Button size="small" @click="stop">结束</Button>
</ButtonGroup>
</div>
</div>
</template>
<script>
export default {
name: "home",
mounted() {
},
methods: {
start() {
// 停止之前的录制内容
this.$mediaRecorder && this.$mediaRecorder.stop();
if (!window.AudioContext) {
window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;
}
// 参考 https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia
// 老版浏览器可能根本没有实现mediaDevices, 为其设置一个空对象
if (!navigator.mediaDevices) {
navigator.mediaDevices = {
};
}
if (!navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia = function (constraints) {
let getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
// 浏览器不支持
if (!getUserMedia) {
return Promise.reject(new Error('您的浏览器暂不支持 getUserMedia !'));
}
// 包装老版 getUserMedia
return new Promise((resolve, reject) => getUserMedia.call(navigator, constraints, resolve, reject));
}
}
// 参数
// let constraints = {audio: true, video: true}; // 请求不带任何参数的音频和视频
let constraints = {
audio: true}; // 请求音频
let mediaStream = navigator.mediaDevices.getUserMedia(constraints);
mediaStream.then((stream) => {
console.info("打开成功!")
let audioContext = new AudioContext();
// 创建一个新的音视频对象
let destination = audioContext.createMediaStreamDestination();
// 创建音视频源
let mediaStreamSource = audioContext.createMediaStreamSource(stream);
// 将音视频源 链接 到新音视频对象 中
mediaStreamSource.connect(destination);
// 参考 https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder/MediaRecorder
// 媒体录制接口
let mediaRecorder = new MediaRecorder(destination.stream, {
audioBitsPerSecond: 16000});
let chunks = [];
// 有可用数据流时触发,e.data即需要的音视频数据
mediaRecorder.ondataavailable = (e) => chunks.push(e.data);
// 间视频录制结束时触发
mediaRecorder.onstop = () => {
// 通过Blob数据块, 合成完整的Blob块数据
let blob = new Blob(chunks, {
'type': 'audio/mpeg'});
// 通过Blob合建对象URL本地地址
let url = URL.createObjectURL(blob);
// 绑定到 audio 元素上
this.$refs.recordPlayer.src = url;
};
// 將 mediaRecorder 对象扔到全局this中, 用于其他方法调用
this.$mediaRecorder = mediaRecorder;
// 录制开始
mediaRecorder.start();
}, () => {
console.log("打开失败!");
});
},
stop() {
// 返回录制的二进制数据, 调用这个方法后会生成一个新的Blob对象
this.$mediaRecorder.requestData();
// 停止录制
this.$mediaRecorder.stop();
},
},
}
</script>
<style scoped>
</style>
页面开始录音时, Console提示 Cannot read property ‘getUserMedia’ of undefined .
该问题可以通过以下几个方式解决: