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
|
module.exports = MediaStream
var debug = require('debug')('webtorrent:media-stream')
var inherits = require('inherits')
var once = require('once')
var stream = require('stream')
var MediaSource = typeof window !== 'undefined' && window.MediaSource
inherits(MediaStream, stream.Writable)
function MediaStream (media, opts) {
var self = this
if (!(self instanceof MediaStream)) return new MediaStream(media, opts)
stream.Writable.call(self, opts)
if (!MediaSource) throw new Error('web browser lacks MediaSource support')
self.media = media
opts = opts || {}
opts.type = opts.type || 'video/webm; codecs="vorbis,vp8"'
debug('new mediastream %s %s', media, JSON.stringify(opts))
self._mediaSource = new MediaSource()
self._sourceBuffer = null
self._cb = null
self.media.src = window.URL.createObjectURL(self._mediaSource)
var sourceopen = once(function () {
self._sourceBuffer = self._mediaSource.addSourceBuffer(opts.type)
self._sourceBuffer.addEventListener('updateend', self._flow.bind(self))
self._flow()
})
self._mediaSource.addEventListener('webkitsourceopen', sourceopen, false)
self._mediaSource.addEventListener('sourceopen', sourceopen, false)
self.on('finish', function () {
debug('finish')
self._mediaSource.endOfStream()
})
window.vs = self
}
MediaStream.prototype._write = function (chunk, encoding, cb) {
var self = this
if (!self._sourceBuffer) {
self._cb = function (err) {
if (err) return cb(err)
self._write(chunk, encoding, cb)
}
return
}
if (self._sourceBuffer.updating) {
return cb(new Error('Cannot append buffer while source buffer updating'))
}
self._sourceBuffer.appendBuffer(chunk)
debug('appendBuffer %s', chunk.length)
self._cb = cb
}
MediaStream.prototype._flow = function () {
var self = this
debug('flow')
if (self._cb) {
self._cb(null)
}
}
|