The MediaRecorder
interface of the MediaStream Recording API provides functionality to easily record media. It is created by the invocation of the MediaRecorder()
constructor.
MediaRecorder.MediaRecorder()
MediaRecorder
object, given a MediaStream
to record. Options are available to do things like set the container's MIME type (such as "video/webm"
or "video/mp4"
) and the bit rates of the audio and video tracks or a single overall bit rate.MediaRecorder.mimeType
Read only
MediaRecorder
object when it was created.MediaRecorder.state
Read only
MediaRecorder
object (inactive
, recording
, or paused
.)MediaRecorder.stream
Read only
MediaRecorder
was created.MediaRecorder.ignoreMutedMedia
MediaRecorder
instance will record input when the input MediaStreamTrack
is muted. If this attribute is false
, MediaRecorder
will record silence for audio and black frames for video. The default is false
.MediaRecorder.videoBitsPerSecond
Read only
MediaRecorder.audioBitsPerSecond
Read only
MediaRecorder.isTypeSupported()
Boolean
value indicating if the given MIME type is supported by the current user agent . MediaRecorder.pause()
MediaRecorder.requestData()
Blob
containing the saved data received thus far (or since the last time requestData()
was called. After calling this method, recording continues, but in a new Blob
.MediaRecorder.resume()
MediaRecorder.start()
timeslice
argument with a value in milliseconds. If this is specified, the media will be captured in separate chunks of that duration, rather than the default behavior of recording the media in a single large chunk.MediaRecorder.stop()
dataavailable
event containing the final Blob
of saved data is fired. No more recording occurs.MediaRecorder.ondataavailable
dataavailable
event, which can be used to grab the recorded media (which is made available as a Blob
object in the event's data
attribute.)MediaRecorder.onerror
EventHandler
called to handle the recordingerror
event, including reporting errors that arise with media recording. These are fatal errors that stop recording.MediaRecorder.onpause
EventHandler
called to handle the pause
event, which occurs when media recording is paused.MediaRecorder.onresume
EventHandler
called to handle the resume
event, which occurs when media recording resumes after being paused.MediaRecorder.onstart
EventHandler
called to handle the start
event, which occurs when media recording starts.MediaRecorder.onstop
EventHandler
called to handle the stop
event, which occurs when media recording ends, either when the MediaStream
ends — or after the MediaRecorder.stop()
method is called.if (navigator.mediaDevices) { console.log('getUserMedia supported.'); var constraints = { audio: true }; var chunks = []; navigator.mediaDevices.getUserMedia(constraints) .then(function(stream) { var mediaRecorder = new MediaRecorder(stream); visualize(stream); record.onclick = function() { mediaRecorder.start(); console.log(mediaRecorder.state); console.log("recorder started"); record.style.background = "red"; record.style.color = "black"; } stop.onclick = function() { mediaRecorder.stop(); console.log(mediaRecorder.state); console.log("recorder stopped"); record.style.background = ""; record.style.color = ""; } mediaRecorder.onstop = function(e) { console.log("data available after MediaRecorder.stop() called."); var clipName = prompt('Enter a name for your sound clip'); var clipContainer = document.createElement('article'); var clipLabel = document.createElement('p'); var audio = document.createElement('audio'); var deleteButton = document.createElement('button'); clipContainer.classList.add('clip'); audio.setAttribute('controls', ''); deleteButton.innerHTML = "Delete"; clipLabel.innerHTML = clipName; clipContainer.appendChild(audio); clipContainer.appendChild(clipLabel); clipContainer.appendChild(deleteButton); soundClips.appendChild(clipContainer); audio.controls = true; var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' }); chunks = []; var audioURL = URL.createObjectURL(blob); audio.src = audioURL; console.log("recorder stopped"); deleteButton.onclick = function(e) { evtTgt = e.target; evtTgt.parentNode.parentNode.removeChild(evtTgt.parentNode); } } mediaRecorder.ondataavailable = function(e) { chunks.push(e.data); } }) .catch(function(err) { console.log('The following error occured: ' + 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.
Specification | Status | Comment |
---|---|---|
MediaStream Recording | Working Draft | Initial definition |
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Basic support | 47.0 | 25.0 (25.0) | No support | No support | No support |
Feature | Android | Android Webview | Firefox Mobile (Gecko) | Firefox OS | IE Phone | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|---|
Basic support | No support | 47.0 | 25.0 (25.0) | 1.3[1] | No support | No support | No support | 47.0 |
navigator.mediaDevices.getUserMedia
© 2005–2017 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder