-
Notifications
You must be signed in to change notification settings - Fork 18
/
MediaRecorder.html
587 lines (464 loc) · 27.8 KB
/
MediaRecorder.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
<!DOCTYPE html>
<html>
<head>
<title>MediaStream Recording</title>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
<script type="text/javascript" src='https://www.w3.org/Tools/respec/respec-w3c-common' class='remove'></script>
<script type="text/javascript" class='remove'>
var respecConfig = {
specStatus: "ED",
editors: [{
name: "Jim Barnett",
company: "Genesys",
},
{ name: "Travis Leithead",
company: "Microsoft Corp.",
url: "mailto:[email protected]?subject=MediaStream Capture Scenarios Feedback",
companyURL: "http://www.microsoft.com"}],
// publishDate: "2013-11-08",
edDraftURI: "http://dvcs.w3.org/hg/dap/raw-file/tip/media-stream-capture/RecordingProposal.html",
previousPublishDate: null,
prevED: "https://dvcs.w3.org/hg/dap/raw-file/default/media-stream-capture/MediaRecorder.html",
noIDLIn: true,
inlineCSS: true,
noRecTrack: true,
shortName: "mediastream-recording",
wg: ["Device APIs Working Group", "Web Real-Time Communications Working Group"],
wgURI: ["http://www.w3.org/2009/dap/", "http://www.w3.org/2011/04/webrtc/"],
wgPublicList: "public-media-capture",
wgPatentURI: ["http://www.w3.org/2004/01/pp-impl/43696/status", "http://www.w3.org/2004/01/pp-impl/47318/status"]
};
</script>
<style type="text/css">
/* ReSpec.js CSS optimizations (Richard Tibbett) - cut-n-paste :) */
div.example {
border-top: 1px solid #ff4500;
border-bottom: 1px solid #ff4500;
background: #fff;
padding: 1em;
font-size: 0.9em;
margin-top: 1em;
}
div.example::before {
content: "Example";
display: block;
width: 150px;
background: #ff4500;
color: #fff;
font-family: initial;
padding: 3px;
padding-left: 5px;
font-weight: bold;
margin: -1em 0 1em -1em;
}
/* Clean up pre.idl */
pre.idl::before {
font-size:0.9em;
}
/* Add better spacing to sections */
section, .section {
margin-bottom: 2em;
}
/* Reduce note and issue render size */
.note, .issue {
font-size:0.8em;
}
/* Add addition spacing to ol and ul for rule definition */
ol.rule li, ul.rule li {
padding:0.2em;
}
</style>
</head>
<body>
<section id="abstract">
<p>This document defines a recording API for use with MediaStreams as defined in
[[!GETUSERMEDIA]]</p></section>
<section id="sotd">
<p>
<em>This section describes the status of this document at the time of its publication. Other
documents may supersede this document. A list of current <acronym title="World Wide Web Consortium">W3C</acronym> publications and the latest revision
of this technical report can be found in the <a href="http://www.w3.org/TR/"><acronym title="World Wide Web Consortium">W3C</acronym> technical reports
index</a> at http://www.w3.org/TR/.</em>
</p>
<p>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:</p>
<ul>
<li>Privacy issues that arise when capturing media.</li>
<li>Technical discussions within the task force.</li>
<li>Experience gained through early experimentations.</li>
<li>Feedback received from other groups and individuals.</li>
</ul>
<p>
This document was published by the <a href="http://www.w3.org/2011/04/webrtc/">Web Real-Time Communication Working Group</a> as an Editor's Draft.
If you wish to make comments regarding this document, please send them to
<a href="mailto:[email protected]">[email protected]</a>
(<a href="mailto:[email protected]?subject=subscribe">subscribe</a>,
<a href="http://lists.w3.org/Archives/Public/public-media-capture/">archives</a>).
All feedback is welcome.
</p>
<p>
Publication as an Editor's Draft does not imply endorsement by the <acronym title="World Wide Web Consortium">W3C</acronym> Membership.
This is a draft document and may be updated, replaced or obsoleted by other documents at
any time. It is inappropriate to cite this document as other than work in progress.
</p>
<p>
This document was produced by a group operating under the
<a href="http://www.w3.org/Consortium/Patent-Policy-20040205/">5 February 2004 <acronym title="World Wide Web Consortium">W3C</acronym> Patent Policy</a>.
<acronym title="World Wide Web Consortium">W3C</acronym> maintains a public list of any patent disclosures (<a href="http://www.w3.org/2004/01/pp-impl/47318/status" rel="disclosure">Web Real-Time Communication Working Group</a>, <a href="http://www.w3.org/2004/01/pp-impl/43696/status" rel="disclosure">Device APIs Working Group</a>)
made in connection with the deliverables of the group; that page also includes instructions for
disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains
<a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential">Essential Claim(s)</a> must disclose the
information in accordance with <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure">section
6 of the <acronym title="World Wide Web Consortium">W3C</acronym> Patent Policy</a>.
</p>
</section>
<section id="overview" class="informative"><h2>Overview</h2>
<p>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. </p>
</section>
<section id="not-conformance" class="informative"><h2>Conformance</h2>
<p>This specification defines conformance criteria that apply to a single
product: the <dfn>user agent</dfn> that implements the interfaces that it
contains.</p>
<p>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. </p>
<p>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.</p>
<p></p>
</section>
<section id="MediaRecorderAPI"><h2>Media Recorder API</h2>
<dl title='interface MediaRecorder : EventTarget' class="idl">
<dt>Constructor(MediaStream stream, [TreatUndefinedAs=Missing] optional DOMString mimeType)</dt><dd>
<dl class='parameters'>
<dt>MediaStream stream</dt>
<dd>
The MediaStream to be recorded.
</dd>
<dt>[TreatUndefinedAs=Missing] optional DOMString mimeType</dt>
<dd>
The container format for the recording, which may include any
parameters that are defined for the format. If the UA does not
support the format or any of the parameters specified, it
<em title="must" class="rfc2119"> must </em> raise an <code>UnsupportedOption</code> Exception. If
this paramater is not specified, the UA will use a platform-specific
default format.
</dd>
</dl></dd>
<dt>readonly attribute MediaStream stream</dt><dd>The MediaStream to be
recorded. </dd>
<dt>readonly attribute DOMString mimeType</dt><dd>The MIME type that was be selected as the container for recording. This entry includes all the parameters to the base MimeType. 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 <img> tag. The default value for this property is platform-specific.</dd>
<dt>readonly attribute RecordingStateEnum state</dt><dd>The current state of the MediaRecorder object. </dd>
<dt>attribute EventHandler onstart</dt><dd>Called to handle the start event.</dd>
<dt>attribute EventHandler onstop</dt><dd>Called to handle the stop event.</dd>
<dt>attribute EventHandler ondataavailable</dt><dd>Called to handle the dataavailable event. Note that the Blob (see [[!FILE-API]]) of recorded data is contained in this event and can
be accessed via the 'data' attribute.</dd>
<dt>attribute EventHandler onpause</dt><dd>Called to handle the pause event. </dd>
<dt>attribute EventHandler onresume</dt><dd>Called to handle the resume event. </dd>
<dt>attribute EventHandler onerror</dt><dd>Called to handle the DOMError event. </dd>
<dt>attribute Boolean ignoreMutedMedia</dt><dd>If this attribute is set to
<code>true</code>, the MediaRecorder will not record anything when the input Media
Stream is muted. If this attribute is <code>false</code>, the MediaRecorder will
record silence (for audio) and black frames (for video) when the input MediaStrea
is muted. When the MediaRecorder is created, the UA <em title="must" class="rfc2119">must</em> set
this attribute to <code>false</code>.</dd>
<dt>void start()</dt>
<dd>When a <code>MediaRecorder</code> object’s <code>start()</code> method is invoked,
the UA <em title="must" class="rfc2119">must</em> queue a task, using the DOM manipulation task source,
that runs the following steps:
<ol>
<li>If the <code>state</code> is not "inactive", raise a DOM <code>InvalidState</code> error and terminate these steps. Otherwise:</li>
<li>Set <code>state</code> to 'recording' and wait until media
becomes available from <code>stream</code>.</li>
<li>Once data becomes available raise a <code>start</code> event and start gathering the
data into a Blob (see [[!FILE-API]]). </li>
<li>If the <code>timeSlice</code> argument has been provided, then once <code>timeSlice</code>
milliseconds of data have been colleced, or some minimum time slice imposed
by the UA, whichever is greater, raise a <code>dataavailable</code> event containing
the Blob of collected data, and start gathering a new Blob of data. Otherwise (if <code>timeSlice</code>
has not been provided), continue gathering data into the original Blob.</li>
<li>When the <code>stream</code> is ended set <code>recording</code>
to 'inactive' and stop gathering data. Callers SHOULD not rely on exactness of the timeSlice value, especially if the timeSlice value is small. Callers SHOULD consider timeSlice as a minimum value</li>
<li>Then raise a <code>dataavailable</code> event containing the Blob of data.</li>
<li>Finally, raise a <code>stop</code> event.</li>
</ol>
<p>Note that <code>stop()</code>,
<code>requestData()</code>, and <code>pause</code> also affect the recording behavior.</p>
<p>The UA <em title="must" class="rfc2119">must</em> record the MediaStream
in such a way that the original Tracks can be retrieved at playback time. When multiple Blobs
are returned (because of <code>timeSlice</code> or <code>requestData</code>), the individual
Blobs need not be playable, but the combination of all the Blobs from a completed recording <em title="must" class="rfc2119">must</em>
be playable. If any Track within the
MediaStream is muted at any time (i.e., if its <code>readyState</code> is set to <code>muted</code>), the UA
<em title="must" class="rfc2119">must</em> insert black frames or silence until the Track is unmuted. </p>
<p> If at any point
the <code>stream's</code> isolation properties change so that MediaRecorder is no longer allowed
access to it, the UA <em title="must" class="rfc2119">must</em> stop recording, discard any data that it
has gathered and raise a <code>SecurityError</code> event followed by
the <code>stop</code> event. If the UA is
unable to start recording or at any point is unable to contine recording (i.e., for reasons
other than a security violation), it <em title="must" class="rfc2119">must</em> raise
a <code>DOMError</code> event, followed by a <code>dataavailable</code> event containing
the Blob it has gathered, follwed by the <code>stop</code> event.
</p>
<dl class='parameters'>
<dt>optional long timeslice</dt>
<dd>
The number of milliseconds of data to return in a single Blob.
</dd>
</dl>
</dd>
<dt>void stop()</dt>
<dd>When a <code>MediaRecorder</code> object’s <code>stop</code> method is invoked,
the UA <em title="must" class="rfc2119">must</em>
queue a task, using the DOM manipulation task source, that runs the following steps:
<ol>
<li>If <code>state</code> is "inactive", raise a DOM <code>InvalideStateError</code>event and terminate these steps.
Otherwise:</li>
<li>Set <code>state</code> to 'inactive' and stop gathering data. </li>
<li>Raise a <code>dataavailable</code> event containing the Blob of data that has been gathered.</li>
<li>Raise a <code>stop</code> event</li>
</ol>
</dd>
<dt>void pause()</dt>
<dd>When a <code>MediaRecorder</code> object’s <code>pause()</code>method is invoked,
the UA <em title="must" class="rfc2119">must</em>
queue a task, using the DOM manipulation task source, that runs the following steps:
<ol>
<li>If <code>state</code> is "inactive"
raise a DOM
<code>InvalidState</code> error and terminate these steps. Otherwise: </li>
<li>Set <code>state</code> to "paused".</li>
<li>Stop gathering data into its current Blob (but keep the Blob available so that
recording can be resumed in the future).</li>
<li>Raise a <code>pause</code> event </li>
</ol>
</dd>
<dt>void resume()</dt>
<dd>When a <code>MediaRecorder</code> object’s <code>resume()</code> method is invoked,
the UA <em title="must" class="rfc2119">must</em>
queue a task, using the DOM manipulation task source, that runs the following steps:
<ol>
<li>If <code>state</code> is "inactive"
raise a DOM <code>InvalidState</code>
error and terminate these steps. Otherwise: </li>
<li>Set <code>state</code> to "recording".</li>
<li>Resume (or continue) gathering data into its current Blob.</li>
<li>Raise a <code>resume</code> event.</li>
</ol></dd>
<dt>void requestData()</dt>
<dd>
When a <code>MediaRecorder</code>object’s <code>requestData()</code> method is invoked,
the UA <em title="must" class="rfc2119">must</em>
queue a task, using the DOM manipulation task source, that runs the following steps:
<ol>
<li>If <code>state</code> is not "recording"
raise a DOM
<code>InvalidState</code> error and terminate these steps.
Otherwise:</li>
<li>Raise a <code>dataavailable</code> event containing the current Blob of saved data. (Note that this Blob
will be empty if no data has been gathered yet.)</li>
<li>Create a new Blob and gather subsequent data into it.</li>
</ol>
</dd>
<dt>static DOMString canRecordMimeType(DOMString mimeType)</dt>
<dd><p>This method <em title="must" class="rfc2119">must</em> return the
empty string if <code>mimeType</code> is a type that the user agent knows
it cannot record; it <em title="must" class="rfc2119">must</em> return
"probably" if the user agent is confident that <code>mimeType</code>
represents a type that it can record; and it <em title="must" class="rfc2119">must</em> return
"maybe" otherwise. Implementors are encouraged to return "maybe"
unless the type can be confidently established as being supported or not.</p>
<dl class='parameters'>
<dt>DOMString mimeType</dt>
<dd>
A MimeType, including parameters, specifying a container format for
recording.
</dd>
</dl>
</dd>
</dl>
<p>The <code>MediaRecorder()</code>
constructor takes one argument which
<em title="must" class="rfc2119">must</em> be of type <code>MediaStream</code> (see [[!GETUSERMEDIA]]). When the constructor
is invoked, the UA <em title="must" class="rfc2119">must</em> construct a new <code><a class="idlType" href="#idl-def-MediaRecorder">MediaRecorder</a></code> object,
set its <a href="#widl-mediastream">mediaStream</a> attribute to be the provided MediaStream, set its <a href="#widl-state">state</a> attribute to 'inactive'
and return the object.</p>
<section id="RecordingStateEnum">
<h3>RecordingStateEnum</h3>
<dl title="enum RecordingStateEnum" class="idl">
<dt>inactive</dt>
<dd>Recording is not occuring. (Either it has not been started or it has been stopped.).</dd>
<dt>recording</dt>
<dd>Recording has been started and the UA is capturing data..</dd>
<dt>paused</dt>
<dd>Recording has been started, then paused, and not yet stopped or resumed.</dd> </dl>
</section>
</section>
<section id="blob-event">
<h2>Blob Event</h2>
<dl title='[Constructor] interface BlobEvent : Event' class='idl'>
<dt>readonly attribute Blob data</dt>
<dd>
Returns a Blob object whose type attribute indicates the encoding of the blob data.
</dd>
</dl>
<h3>BlobEventInit</h3>
<dl title='dictionary BlobEventInit' class='idl'>
<dt>Blob data</dt>
<dd>
A Blob object containing the data to deliver via this event.
</dd>
</dl>
</section>
<section id="properties">
<h3>MediaRecorder Properties</h3>
<p>
[TO DO: Provide API surface to set and read these. When that is done,
this section will be removed.]
</p>
<table class="simple">
<thead>
<tr>
<th>Property Name</th>
<th>Values</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr id="def-property-MimeType">
<td>MimeType</td>
<td><code>DOMString</code></td>
<td> The MIME type that was be selected as the container for recording. This entry includes all the parameters to the base MimeType.
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 <img> tag.
The default value for this property is platform-specific.</td>
</tr>
<tr id="def-property-BitRate">
<td>BitRate</td>
<td><code>long</code></td>
<td> The bitrate type that was selected as for recording. The default
value for this property is platform-specific.</td>
</tr>
<tr id="def-property-IgnoreMutedMedia">
<td>ignoreMutedMedia</td>
<td><code>boolean</code></td>
<td> If this property is set to 'true', the MediaRecorder should stop
recording when the MediaStream is muted. If it is false, the
MediaRecorder should record silence (for audio) or black frames(for video)
when the source MediaStream is muted. The default value for this
property is true.</td>
</tr>
</tbody>
</table>
</section>
<section id="error-handling">
<h2>Error Handling</h2>
<section id="general-principles">
<h3>General Principles</h3>
<p>Errors are indicated in two ways: exceptions and objects passed to
error callbacks. In the former case, a <a href="http://www.w3.org/TR/2012/WD-dom-20121206/#exception-domexception">DOMException</a> is raised (see [[!DOM4]]).
An exception <em title="must" class="rfc2119">must</em> be thrown when the
error can be detected at the time that the call is made. In all other cases, an <a href="http://www.w3.org/TR/2012/WD-dom-20121206/#interface-domerror">DOMError</a> object(see [[!DOM4]]) <em title="must" class="rfc2119">must</em> be provided to the failure
callback. The error name in the object provided <em title="must" class="rfc2119">must</em> be picked from
the <code>RecordingErrorName</code>
enums. If recording has been started and not yet stopped when the error occurs, then after raising the error, the UA <em title="must" class="rfc2119">must</em>
raise a dataavailable event, containing any data that it has gathered,
and then a stop event. The UA <em title="may" class="rfc2119">may</em> set platform-specific
limits, such those for the minimum and maximum Blob size that it will support, or the number of
Tracks it will record at once. It <em title="must" class="rfc2119">must</em> signal a fatal
error if these limits are exceeded. </p>
</section>
<section>
<h4>RecordingErrorNameEnum</h4>
<dl title="enum RecordingErrorNameEnum" class="idl">
<dt>InvalidState</dt>
<dd>The <code>MediaRecorder</code> is not in a state
in which the proposed operation is allowed
to be executed.</dd>
<dt>OutOfMemory</dt>
<dd>The UA has exhaused the available memory. User agents SHOULD provide as much additional information as possible in the <code>message</code> attribute.</dd>
<dt>IllegalStreamModification</dt>
<dd>A modification to the <code>stream</code> has occurred that makes it impossible to continue recording. An example would be the addition of a Track while recording is occurring.
User agents SHOULD provide as much additional information as possible in the <code>message</code> attribute.</dd>
<dt>SecurityError</dt><dd>The isolation properties of the MediaStream do not
allow the MediaRecorder access to it.</dd>
<dt>OtherRecordingError</dt>
<dd>Used for an fatal error other than those listed above. User agents SHOULD provide as much additional information as possible in the <code>message</code> attribute.</dd>
</dl>
</section>
<section id="recordingexceptionenum">
<h2>RecordingExceptionEnum</h2>
<dl title="enum RecordingExceptionEnum" class="idl">
<dt>UnsupportedOption</dt>
<dd>The UA cannot provide the codec or recording option that has
been requested.</dd>
</dl>
</section>
</section>
<section id="event-summary" class="informative">
<h2>Event summary</h2>
<p>The following additional events fire on <code><a class="idlType" href="#idl-def-MediaRecorder"><code>MediaRecorder</code></a></code>
objects:</p>
<table style="border-width:0; width:60%" border="1">
<tbody><tr>
<th>Event name</th>
<th>Interface</th>
<th>Fired when...</th>
</tr>
</tbody><tbody>
<tr>
<td><dfn id="event-mediarecorder-start"><code>start</code></dfn></td>
<td><code>Event</code></td>
<td>The UA has started recording data on the MediaStream.</td>
</tr>
<tr>
<td><dfn id="event-mediarecorder-stop"><code>stop</code></dfn></td>
<td><code>Event</code></td>
<td>The UA has stopped recording data on the MediaStream.</td>
</tr>
<tr>
<td><dfn id="event-mediarecorder-dataavailable"><code>dataavailable</code></dfn></td>
<td><a href="#idl-def-BlobEvent"><code>BlobEvent</code></a></td>
<td>The UA generates this even to return data to the application. The 'data' attribute of this
event contains a Blob of recorded data.</td>
</tr>
<tr>
<td><dfn id="event-mediarecorder-pause"><code>pause</code></dfn></td>
<td><code>Event</code></td>
<td>The UA has paused recording data on the MediaStream.</td>
</tr>
<tr>
<td><dfn id="event-mediarecorder-resume"><code>resume</code></dfn></td>
<td><code>Event</code></td>
<td>The UA has resumed recording data on the MediaStream.</td>
</tr>
<tr>
<td><dfn id="event-mediarecorder-DOMError"><code>DOMError</code></dfn></td>
<td><a href="http://www.w3.org/TR/2012/WD-dom-20121206/#interface-domerror"><code>DOMError</code></a></td>
<td>A fatal error has occurred and the UA has stopped recording. More detailed error information
is available in the 'message' attribute. </td>
</tr>
</tbody>
</table>
</section>
<section class="appendix" id="openissues"><!--OddPage--><h2>Open Issues</h2>
<ol>
<li>Do we need an MTI
format?</li>
<li>Do we need a "setSyncPoint()" operator and a "syncpoint" signal,
so that the client can tell the recorder to insert a point at
which a recording can be broken up (typically a new I-frame)? </li>
<li>Do we want a general onstatechange handler in place of
onstart, onpause, etc.?</li>
</ol>
</section>
</body></html>