webrtc 入门第二章 音视频录制
一、介绍
1、媒体录制原理
在很多场景中回放音视频资源的需求是非常重要的例如会议,直播授课等。任何媒体形式的表情都可进行录制,如 ,,等。其中内容更加自由用户的任何2d,3d操作都可以进行录制和传播。
MediaRecoder 是控制媒体录制的api,使用它可以进行录制音视频,使得web可以脱离服务器,独立进行视频录制。同时W3C也制定了相应的web标准。录制出来的是经过转码的标准媒体流数据。
二、实践
1、录制对象 MediaRecoder
var mediarecode=new MediaRecoder(stream,options)
1.stream:为通过getUserMedia方法获取到的视频流。同样可已直接用 ,, 标签直接获取,这样可以实现本地播放视频录制,绘画板同步等。
2.options:为限制参数,具体如下
参数 | 解释 |
---|---|
mimeType | 指定录制的媒体类型(音频、视频)、编码方式(audio/mpeg,audio/ogg,video/mp4)等 |
audioBitsPerSecond | 指定音频比特率 |
videoBitsPerSecond | 指定视频比特率 |
bitsPerSecond | 指定音视频比特率,包含上面两项 |
3.mediaRecoder的常用api方法和事件
名称 | 作用 | 类型 |
---|---|---|
MediaRecoder.start() | 开始录制事件,timeslice为触发ondataavailable事件 | 方法 |
MediaRecoder.pause() | 停止录制 | 方法 |
MediaRecoder.resume() | 恢复录制 | 方法 |
MediaRecoder.isTypeSupported() | 判断是否支持某个格式(有需求可以使用) | 方法 |
MediaRecoder.ondataavailable() | 当有录制有有效数据是触发该事件,在次方法里可以处理数据例如下载等 | 事件 |
MediaRecoder.onerror() | 录制出错时触发该事件,此时会停止录制 | 事件 |
2、录制音频
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>webrtc录制声音</title>
</head>
<body>
<div class="app">
<h1>声音录制<h1/>
<audio class="audio" controls autoplay></audio>
<hr/>
<input type="button" title="打开麦克风" value="打开麦克风" v-on:click="openAudio"/>
<input type="button" title="开始录制" value="开始录制" v-on:click="startRecode"/>
<input type="button" title="停止录制" value="停止录制" v-on:click="stopRecode"/>
<input type="button" title="播放" value="播放" v-on:click="play"/>
{{/* <input type="button" title="下载" value="下载" v-on:click="download"/>*/}}
<a :href="downloadUrl" download="test1.ogg" v-on:click="download"/>下载</a>
</div>
</body>
<script src="/static/js/Vue.2.5.3.js"></script>
<script type="text/javascript">
let vm = new Vue({
el: ".app",
delimiters: ['{[', ']}'],
data: {
status: "",
stream: null,
mediaRecorder: null,
recordedBlobs: [],
audio: null,
downloadUrl: ""
},
methods: {
// 下载
download: function () {
const blob = new Blob(this.recordedBlobs, {"type": "audio/ogg"})
this.downloadUrl = window.URL.createObjectURL(blob)
//setTimeout(() => {
// window.URL.revokeObjectURL(this.downloadUrl)
// }, 100)
// // 必须创建一个a标签下载
const a = document.createElement("a")
a.style.display = "none"
a.href = this.downloadUrl
a.download = "test.ogg"
document.body.appendChild(a)
a.click()
// 移除a标签
setTimeout(() => {
document.body.removeChild(a)
}, 100)
},
// 开始录制
startRecode: function () {
let that = this;
if (that.status == "startRecode") {
return
}
if (that.stream == null) {
alert("请打开麦克风")
return;
}
that.status = "startRecode"
// 开始录制
let options = {"mineType": "audio/ogg;"}
try {
that.mediaRecorder = new MediaRecorder(that.stream, options)
console.log(that.mediaRecorder)
// 退出回调事件
that.mediaRecorder.onstop = (event) => {
console.log("录制已停止")
console.log(event)
console.log(that.recordedBlobs)
}
// 录制数据回调时间
that.mediaRecorder.ondataavailable = that.ondataavailable
// 录制10s
that.mediaRecorder.start(10)
} catch (e) {
alert("录制失败", e)
}
},
// 播放
play: function () {
const blob = new Blob(this.recordedBlobs, {"type": "audio/ogg"})
this.audio = document.querySelector('audio');
this.audio.src = window.URL.createObjectURL(blob)
this.audio.play()
},
stopRecode: function () {
this.mediaRecorder.stop()
alert("停止录制")
},
ondataavailable: function (event) {
let that = this;
if (event.data && event.data.size > 0) {
console.log("recode data", event.data)
// 收到数据后,导入本都录制缓存
that.recordedBlobs.push(event.data)
}
},
openAudio: function () {
if (navigator.getUserMedia) {
window.audioContext = new AudioContext()
navigator.getUserMedia({
'audio': true
}, this.onVoice, this.errorFunc); //success是获取成功的回调函数
} else {
alert('Native device media streaming (getUserMedia) not supported in this browser.');
}
},
errorFunc: function (e) {
alert("tive device media streaming (getUserMedia) not supported in this browser")
},
onVoice: function (stream) {
let that = this;
console.log(stream)
that.status = "start"
that.stream = stream
}
},
})
</script>
</html>
音频录制的流程如下
1.打开麦克风:同样使用getUserMedia()方法 约束条件’audio’: true , 即可请求麦克风。获取到音频流stream
2.录制:使用MediaRecorder 接口开始录制。在录制过程中ondataavailable 回调方法将录制到的音频数据存入缓存中
3.播放:将音频缓存的数据创建Blob 对象,然后使用audio标签播放
4.下载:将音频缓存的数据创建Blob 对象,然后window.URL.createObjectURL创建下载地址,使用a标签进行下载
3、录制视频
录制视频的方式及流程和录制音频的过程时一样的,唯一的区别就是在媒体流的格式
1.getUserMedia 约束项 constraints={video:{width:400,height:300}}
2.使用Blob创建视频对象 options = {“mineType”: “video/webm”}
其余流程都一样,本次不展示视频录制代码
三、总结
本章介绍了关于包括音频,视频等媒体资源录制,其流程其实很简单,使用到的api也不多,直接看代码都就可以操作,需要注意的如下
1.关于媒体设备的支持性和兼容性,不同浏览器版本对api的支持上可能不同
2.需要注意在录制过程中的使用参数,不同的应用场景对使用的参数可能会有差别
3.录制canvas 需要查看如何获取canvas的流媒体可以查看 canvas.captureStream api,该方法可以获得canvas的流媒体,然后可以做一些同步播放或者录制等功能,和音视频操作一样。
四、感谢
感谢作者 亢少军老师的 《WebRTC音视频开发 》 课本 第七章 媒体录制 的指导