此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
MediaRecorder
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2021年4月.
* Some parts of this feature may have varying levels of support.
MediaRecorder 是MediaStream Recording API 提供的用来进行媒体轻松录制的接口,他需要通过调用MediaRecorder() 构造方法进行实例化。
In this article
构造函数
MediaRecorder.MediaRecorder()创建一个新的
MediaRecorder对象,对指定的MediaStream对象进行录制,支持的配置项包括设置容器的 MIME 类型 (例如"video/webm"或者"video/mp4") 和音频及视频的码率或者二者同用一个码率
配置项
MediaRecorder.mimeType只读返回
MediaRecorder对象创建时选择器选择的录制容器的 MIME typeMediaRecorder.state只读返回录制对象
MediaRecorder的当前状态 (闲置中,录制中或者暂停 ) (inactive,recording, orpaused.)MediaRecorder.stream只读返回录制器对象
MediaRecorder创建时构造函数传入的 stream 对象MediaRecorder.ignoreMutedMedia用以指定
MediaRecorder是否录制无声的输入源。如果这个属性是 false. 录制器对象MediaRecorder会录制无声的音频或者黑屏的视频,默认值是 falseMediaRecorder.videoBitsPerSecond只读返回视频采用的编码比率。它可能和构造函数的设置比率不同。(if it was provided).
MediaRecorder.audioBitsPerSecond只读返回音频采用的编码比率,它可能和构造函数中设置的比率不同。(if it was provided).
方法
MediaRecorder.isTypeSupported()返回一个
Boolean值,来表示设置的 MIME type 是否被当前用户的设备支持。MediaRecorder.pause()暂停媒体录制
MediaRecorder.requestData()请求一个从开始到当前接收到的,存储为
Blob类型的录制内容。(或者是返回从上一次调用requestData()方法之后到现在的内容). 调用这个方法后,录制将会继续进行,但是会创建一个新的Blob对象MediaRecorder.resume()继续录制之前被暂停的录制动作。
MediaRecorder.start()开始录制媒体,这个方法调用时可以通过给
timeslice参数设置一个毫秒值,如果设置这个毫秒值,那么录制的媒体会按照你设置的值进行分割成一个个单独的区块,而不是以默认的方式录制一个非常大的整块内容。MediaRecorder.stop()停止录制。同时触发
dataavailable事件,返回一个存储Blob内容的录制数据。之后不再记录
静态方法
MediaRecorder.isTypeSupported()静态方法,判断给定的 MIME 类型是否支持。返回
Boolean类型的值。
事件处理
MediaRecorder.ondataavailable调用它用来处理
dataavailable事件,该事件可用于获取录制的媒体资源 (在事件的data属性中会提供一个可用的Blob对象.)MediaRecorder.onerrorAn event handler called to handle the
recordingerrorevent, including reporting errors that arise with media recording. These are fatal errors that stop recording.MediaRecorder.onpause用来处理
pause事件,该事件在媒体暂停录制时触发(MediaRecorder.pause()).MediaRecorder.onresume用来处理
resume事件,该事件在暂停后回复录制视频时触发(MediaRecorder.resume()).MediaRecorder.onstart用来处理
start事件,该事件在媒体开始录制时触发(MediaRecorder.start()).MediaRecorder.onstop用来处理
stop事件,该事件会在媒体录制结束时、媒体流(MediaStream)结束时、或者调用MediaRecorder.stop()方法后触发。
事件
Listen to these events usingaddEventListener() or by assigning an event listener to theoneventname property of this interface.
示例
if (navigator.mediaDevices) { console.log("支持 getUserMedia。"); const constraints = { audio: true }; let chunks = []; navigator.mediaDevices .getUserMedia(constraints) .then((stream) => { const mediaRecorder = new MediaRecorder(stream); record.onclick = () => { mediaRecorder.start(); console.log(mediaRecorder.state); console.log("录制开始"); record.style.background = "red"; record.style.color = "black"; }; stop.onclick = () => { mediaRecorder.stop(); console.log(mediaRecorder.state); console.log("录制停止"); record.style.background = ""; record.style.color = ""; }; mediaRecorder.onstop = (e) => { console.log("数据将在调用 MediaRecorder.stop() 后可用。"); const clipName = prompt("输入音频片段的名称"); const clipContainer = document.createElement("article"); const clipLabel = document.createElement("p"); const audio = document.createElement("audio"); const deleteButton = document.createElement("button"); const mainContainer = document.querySelector("body"); clipContainer.classList.add("clip"); audio.setAttribute("controls", ""); deleteButton.textContent = "Delete"; clipLabel.textContent = clipName; clipContainer.appendChild(audio); clipContainer.appendChild(clipLabel); clipContainer.appendChild(deleteButton); mainContainer.appendChild(clipContainer); audio.controls = true; const blob = new Blob(chunks, { type: "audio/ogg; codecs=opus" }); chunks = []; const audioURL = URL.createObjectURL(blob); audio.src = audioURL; console.log("录制停止"); deleteButton.onclick = (e) => { const evtTgt = e.target; evtTgt.parentNode.parentNode.removeChild(evtTgt.parentNode); }; }; mediaRecorder.ondataavailable = (e) => { chunks.push(e.data); }; }) .catch((err) => { console.error(`发生以下错误:${err}`); });}备注:This code sample is inspired by the Web Dictaphone demo. Some lines have been omitted for brevity;refer to the source for the complete code.
Specifications
| Specification |
|---|
| MediaStream Recording> # mediarecorder-api> |
Browser compatibility
See also
- Using the MediaRecorder API
- Web Dictaphone: MediaRecorder + getUserMedia + Web Audio API visualization demo, byChris Mills (source on Github.)
- Recording a media element
- simpl.info MediaStream Recording demo, bySam Dutton.
navigator.mediaDevices.getUserMedia- FingerSpell: Sign Language Fingerspelling practice using MediaDevices and the MediaStream Recording API to create and download recordings, MediaRecorder API supported desktop browsers only (source on GitHub)