This document defines a recording API for use with MediaStreams as defined in [[!GETUSERMEDIA]]
This document is not complete. It is subject to major changes and, while early experimentations are encouraged, it is therefore not intended for implementation. The Media Capture Task Force expects this specification to evolve significantly based on:
This API attempts to make basic recording very simple, while still allowing for more complex use cases. In the simplest case, the application instatiates the MediaRecorder object, calls record() and then calls stop() or waits for the MediaStream to be ended. The contents of the recording will be made available in the platform's default encoding via the dataavailable event. Functions are available to query the platform's available set of encodings, and to select the desired ones if the author wishes. The application can also choose how much data it wants to receive at one time. By default a Blob containing the entire recording is returned when the recording finishes. However the application can choose to receive smaller buffers of data at regular intervals.
This specification defines conformance criteria that apply to a single product: the user agent that implements the interfaces that it contains.
Conformance requirements phrased as algorithms or specific steps may be implemented in any manner, so long as the end result is equivalent to the behavior specified in this document.
Implementations that use ECMAScript to implement the APIs defined in this specification must implement them in a manner consistent with the ECMAScript Bindings defined in the Web IDL specification [[!WEBIDL]], as this specification uses that specification and terminology.
[ Constructor (MediaStream stream, optional MediaRecorderOptions options)]
interface MediaRecorder : EventTarget {
readonly attribute MediaStream stream;
readonly attribute DOMString mimeType;
readonly attribute RecordingState state;
attribute EventHandler onstart;
attribute EventHandler onstop;
attribute EventHandler ondataavailable;
attribute EventHandler onpause;
attribute EventHandler onresume;
attribute EventHandler onerror;
attribute boolean ignoreMutedMedia;
readonly attribute unsigned long videoBitsPerSecond;
readonly attribute unsigned long audioBitsPerSecond;
void start (optional long timeslice);
void stop ();
void pause ();
void resume ();
void requestData ();
static boolean isTypeSupported (DOMString type);
};
MediaRecorder| Parameter | Type | Nullable | Optional | Description |
|---|---|---|---|---|
| stream | MediaStream |
✘ | ✘ | The MediaStream to be recorded. This will
be the value of the stream attribute. See
[[!GETUSERMEDIA]] for the definition of MediaStream. |
| options | MediaRecorderOptions |
✘ | ✔ | A dictionary of options to for the UA
instructing how the recording will take part.
options.mimeType, if present, will become the
value of mimeType attribute. |
stream of type MediaStream, readonlymimeType of type DOMString, readonlymimeType. The UA should be able to play back any of the
MIME types it supports for recording. For example, it should be able
to display a video recording in the HTML <video> tag. The
default value for this property is platform-specific. Note that the
mimeType specifies the container format for the
recording, and that the codecs that the recording contains will
normally be specified as parameters to it.state of type RecordingState, readonlyinactive.onstart of type EventHandleronstop of type EventHandlerondataavailable of type EventHandleronpause of type EventHandleronresume of type EventHandleronerror of type EventHandlerignoreMutedMedia of type booleantrue, the MediaRecorder
will not record anything when the input Media Stream is muted. If
this attribute is false, the MediaRecorder will record
silence (for audio) and black frames (for video) when the input
MediaStream is muted. When the MediaRecorder is created, the UA
must set this attribute to
false.videoBitsPerSecond of type unsigned long, readonlybitsPerSecond.audioBitsPerSecond of type unsigned long, readonlybitsPerSecond.startMediaRecorder object’s
start() method is invoked, the UA must run the following steps:
undefined.state is not "inactive", throw an
InvalidStateError DOMException and abort these
steps.SecurityError
DOMException and abort these steps.state to "recording", and run the following
steps in parallel:
start event.SecurityError, immediately followed by a
stop event.
UnknownError, followed by a
dataavailable event containing blob,
followed by a stop event.
undefined,
then once a minimum of timeslice milliseconds of
data have been collected, or some minimum time slice imposed
by the UA, whichever is greater, let blob be the
Blob of collected data, start gathering a new Blob of data,
and queue a task, using the DOM manipulation task source,
that fires a dataavailable event containing
blob.recording to "inactive".dataavailable event containing
blob.stop event.undefined.Note that stop(), requestData(), and
pause() also affect the recording behavior.
The UA must record the
MediaStream in such a way that the original Tracks can be retrieved
at playback time. When multiple Blobs are returned (because of
timeslice or requestData), the individual
Blobs need not be playable, but the combination of all the Blobs
from a completed recording must be playable. If any Track within the
MediaStream is muted at any time (i.e., if its
readyState is set to muted), the UA
must insert black frames or
silence until the Track is unmuted.
| Parameter | Type | Nullable | Optional | Description |
|---|---|---|---|---|
| timeslice | long |
✘ | ✔ | The number of milliseconds of data to return in a single Blob. |
void
stopMediaRecorder object’s stop
method is invoked, the UA must queue a task, using the DOM manipulation task
source, that runs the following steps:
state is "inactive", throw a
InvalidStateError DOMException and terminate these
steps. Otherwise:state to 'inactive' and stop gathering
data.dataavailable event containing the Blob
of data that has been gathered.stop eventvoid
pauseMediaRecorder object’s
pause()method is invoked, the UA must queue a task, using the DOM manipulation
task source, that runs the following steps:
state is "inactive" throw an
InvalidStateError DOMException and terminate these
steps. Otherwise:state to "paused".pause eventvoid
resumeMediaRecorder object’s
resume() method is invoked, the UA must queue a task, using the DOM manipulation
task source, that runs the following steps:
state is "inactive" throw an
InvalidStateError DOMException and terminate these
steps. Otherwise:state to "recording".resume event.void
requestDataMediaRecorderobject’s
requestData() method is invoked, the UA must queue a task, using the DOM
manipulation task source, that runs the following steps:
state is not "recording" throw an
InvalidStateError DOMException and terminate these
steps. Otherwise:dataavailable event containing the
current Blob of saved data. (Note that this Blob will be empty if
no data has been gathered yet.)void
isTypeSupported, staticMediaRecorder can record in the
specified MIME type. If true is returned from this method, it only
indicates that the MediaRecorder implementation is
capable of recording Blob objects for the specified MIME type.
Recording may still fail if sufficient resources are not available
to support the concrete media encoding. When this method is
invoked, the User Agent must run the following steps:
type is an empty string, then return true
(note that this case is essentially equivalent to leaving up to
the UA the choice of container and codecs on constructor).type does not contain a valid MIME type
string, then return false.type contains a media type or media subtype
that the MediaRecorder does not support, then return false.type contains a media container that the
MediaSource does not support, then return false.type contains a codec that the MediaSource
does not support, then return false.| Parameter | Type | Nullable | Optional | Description |
|---|---|---|---|---|
| type | DOMString |
✘ | ✘ | A MIME Type, including parameters, specifying a container and/or codec formats for recording. |
boolean
dictionary MediaRecorderOptions {
DOMString mimeType;
unsigned long audioBitsPerSecond;
unsigned long videoBitsPerSecond;
unsigned long bitsPerSecond;
};
mimeType of type DOMStringNotSupportedError DOMException. If this paramater is
not specified, the UA will use a platform-specific default format.
The container format, whether passed in to the constructor or
defaulted, will be used as the value of the mimeType
attribute.audioBitsPerSecond of type unsigned longvideoBitsPerSecond of type unsigned longbitsPerSecond of type unsigned longaudioBitsPerSecond or videoBitsPerSecond
if present, and might be distributed among the present track
encoders as the UA sees fit. This parameter is a hint for the
encoder(s) and the total value might be surpassed, not achieved, or
only be achieved over a long period of time.enum RecordingState {
"inactive",
"recording",
"paused"
};
| Enumeration description | |
|---|---|
inactive |
Recording is not occuring. (Either it has not been started or it has been stopped.). |
recording |
Recording has been started and the UA is capturing data.. |
paused |
Recording has been started, then paused, and not yet stopped or resumed. |
[ Constructor (DOMString type, BlobEventInit eventInitDict)]
interface BlobEvent : Event {
readonly attribute Blob data;
};
BlobEvent| Parameter | Type | Nullable | Optional | Description |
|---|---|---|---|---|
| type | DOMString |
✘ | ✘ | Associated Event type. |
| eventInitDict | BlobEventInit |
✘ | ✘ | An initializer whose data
field will be used to initialize the attribute of the same
name. |
data of type Blob, readonlydictionary BlobEventInit {
required Blob data;
};
data of type Blob, requiredThe UA must throw a DOMException (see
[[!DOM4]]) when the error can be detected at the time that the call is
made. In all other cases, an ErrorEvent must be fired. If recording has been started
and not yet stopped when the error occurs, then after raising the error,
the UA must fire a
dataavailable event, containing any data that it has
gathered, and then a stop event. The UA may set
platform-specific limits, such as those for the minimum and maximum Blob
size that it will support, or the number of Tracks it will record at
once. It must signal a fatal error if these limits are exceeded.
The following interface is defined for cases when an event is raised that could have been caused by an error:
Firing an
error event named e with an Error
error means that an event with the name e, which
does not bubble (except where otherwise stated) and is not cancelable
(except where otherwise stated), and which uses the
ErrorEvent interface with the error attribute set to error, must be
created and dispatched at the given target. If no Error
object is specified, the error attribute defaults to null.
[Exposed=Window,
Constructor (DOMString type, ErrorEventInit eventInitDict)]
interface ErrorEvent : Event {
readonly attribute Error? error;
};
ErrorEventErrorEvent.
| Parameter | Type | Nullable | Optional | Description |
|---|---|---|---|---|
| type | DOMString |
✘ | ✘ | |
| eventInitDict | ErrorEventInit |
✘ | ✘ |
error of type Error, readonly , nullabledictionary ErrorEventInit : EventInit {
Error? error = null;
};
error of type Error, nullable, defaulting to
nullEach of the exceptions defined in this document is a
DOMException with a specific type. The exception types and
properties such as code value are defined in [[!WEBIDL]].
| Name | Description |
|---|---|
InvalidStateError |
An operation was called on an object on which it is not allowed or at a time when it is not allowed, or if a request is made on a source object that has been deleted or removed. |
NotSupportedError |
A MediaRecorder could not be created due to
unsupported options (e.g. MIME type) specification. User agents
should provide as much additional information as possible in the
message attribute.
|
SecurityError |
The isolation properties of the MediaStream do not allow the MediaRecorder access to it. |
The following additional events fire on
objects:MediaRecorder
| Event name | Interface | Fired when... |
|---|---|---|
start |
Event |
The UA has started recording data on the MediaStream. |
stop |
Event |
The UA has stopped recording data on the MediaStream. |
dataavailable |
BlobEvent
|
The UA generates this even to return data to the application. The 'data' attribute of this event contains a Blob of recorded data. |
pause |
Event |
The UA has paused recording data on the MediaStream. |
resume |
Event |
The UA has resumed recording data on the MediaStream. |
ErrorEvent |
EventError |
An error has occurred, e.g. out of memory or a modification to
the stream has occurred that makes it impossible to
continue recording (e.g. a Track has been added to or removed from
the said stream while recording is occurring). |
This section will be removed before publication.