Skip to content

Commit

Permalink
fix(flv/[Flv.js, index.js. tasks/liveTask.js, parse/mainParser.js]): …
Browse files Browse the repository at this point in the history
…fix flv multi player instance a
  • Loading branch information
leonardoFu committed Oct 23, 2018
1 parent ffd9894 commit bfb7be7
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 43 deletions.
2 changes: 1 addition & 1 deletion packages/xgplayer-flv/browser/index.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/xgplayer-flv/dist/index.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/xgplayer-flv/src/Flv.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ export default class Flv {
const handleFtypMoov = (ftypMoov) => {
if (flvPlayer.isSourceOpen && !this.tempFlvPlayer) {
mse.appendBuffer(ftypMoov.buffer)
} else if (!this.isChangingSrc) {
} else if (!this.isChangingSrc && !this._options.isLive) {
this.isSeeking = true
flvPlayer.seek(this._player.currentTime)
}
Expand Down
5 changes: 4 additions & 1 deletion packages/xgplayer-flv/src/parse/MainParser.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,14 @@ export default class MainParser extends TransCoder {
}

initLiveStream () {
new LiveTask(this._config.url, this.requestConfig).run(this.loadLiveData.bind(this))
this.loadTask = new LiveTask(this._config.url, this.requestConfig).run(this.loadLiveData.bind(this))
}

loadLiveData (buffer) {
if (buffer === undefined) {
this.emit('live-end')
this._player.mse.endOfStream()
this.destroy()
}
try {
this.buffer.write(new Uint8Array(buffer))
Expand Down Expand Up @@ -312,6 +314,7 @@ export default class MainParser extends TransCoder {
this._store = null
this.clearBuffer()
this.stop = true
this.loadTask && this.loadTask.cancel()
}

seek (target) {
Expand Down
8 changes: 4 additions & 4 deletions packages/xgplayer-flv/src/parse/demux/VideoDemuxer.js
Original file line number Diff line number Diff line change
Expand Up @@ -220,10 +220,6 @@ export default class VideoDemuxer extends Demuxer {
mi.mimeType = `video/x-flv; codecs="${mi.videoCodec}"`
mi.codec = mi.mimeType.replace('x-flv', 'mp4')
}

if (mi.isComplete) {
this.handleMediaInfoReady(mi)
}
}
let pps
const ppsCount = dv.getUint8()
Expand Down Expand Up @@ -252,6 +248,10 @@ export default class VideoDemuxer extends Demuxer {

mi.sps = meta.sps = sps
mi.pps = meta.pps = pps

if (mi.isComplete) {
this.handleMediaInfoReady(mi)
}
if (store.hasInitialMetaDispatched) {
if (store.videoTrack.length || store.audioTrack.length) {
this.handleDataReady(store.videoTrack, store.audioTrack)
Expand Down
33 changes: 20 additions & 13 deletions packages/xgplayer-flv/src/parse/remux/Fmp4.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,10 +137,10 @@ class FMP4 {
return FMP4.initBox(size, 'trak', tkhd, mdia)
}
static tkhd (data) {
let id = data.id,
duration = data.duration,
width = data.width,
height = data.height
let id = data.id
let duration = data.duration
let width = data.width
let height = data.height
let content = new Uint8Array([
0x00, 0x00, 0x00, 0x07, // version(0) + flags 1位版本 box版本,0或1,一般为0。(以下字节数均按version=0)按位或操作结果值,预定义如下:
// 0x000001 track_enabled,否则该track不被播放;
Expand Down Expand Up @@ -182,7 +182,9 @@ class FMP4 {
return FMP4.initBox(8 + content.byteLength, 'tkhd', content)
}
static edts (data) {
let buffer = new Buffer(), duration = data.duration, mediaTime = data.mediaTime
let buffer = new Buffer()
let duration = data.duration
let mediaTime = data.mediaTime
buffer.write(FMP4.size(36), FMP4.type('edts'))
// elst
buffer.write(FMP4.size(28), FMP4.type('elst'))
Expand Down Expand Up @@ -222,7 +224,6 @@ class FMP4 {
return FMP4.initBox(12 + content.byteLength, 'mdhd', FMP4.extension(0, 0), content)
}
static hdlr (type) {
let buffer = new Buffer()
let value = [0x00, // version 0
0x00, 0x00, 0x00, // flags
0x00, 0x00, 0x00, 0x00, // pre_defined
Expand All @@ -243,7 +244,7 @@ class FMP4 {
return FMP4.initBox(8 + value.length, 'hdlr', new Uint8Array(value))
}
static minf (data) {
let buffer = new Buffer(), size = 8
let size = 8
let vmhd = data.type === 'video' ? FMP4.vmhd() : FMP4.smhd()
let dinf = FMP4.dinf()
let stbl = FMP4.stbl(data);
Expand Down Expand Up @@ -311,7 +312,6 @@ class FMP4 {
return FMP4.initBox(16 + content.byteLength, 'stsd', FMP4.extension(0, 0), new Uint8Array([0x00, 0x00, 0x00, 0x01]), content)
}
static mp4a (data) {
let buffer = new Buffer()
let content = new Uint8Array([
0x00, 0x00, 0x00, // reserved
0x00, 0x00, 0x00, // reserved
Expand Down Expand Up @@ -354,8 +354,14 @@ class FMP4 {
return buffer.buffer
}
static avc1 (data) {
let buffer = new Buffer(), size = 40// 8(avc1)+8(avcc)+8(btrt)+16(pasp)
let sps = data.sps, pps = data.pps, width = data.width, height = data.height, hSpacing = data.pixelRatio[0], vSpacing = data.pixelRatio[1]
let buffer = new Buffer()
let size = 40// 8(avc1)+8(avcc)+8(btrt)+16(pasp)
let sps = data.sps
let pps = data.pps
let width = data.width
let height = data.height
let hSpacing = data.pixelRatio[0]
let vSpacing = data.pixelRatio[1]
let avccBuffer = new Buffer()
avccBuffer.write(new Uint8Array([
0x01, // version
Expand Down Expand Up @@ -526,7 +532,8 @@ class FMP4 {
let offset = Buffer.writeUint32(8 + 8 + 16 + 8 + 16 + 16 + 12 + 4 + 4 + 16 * data.samples.length + sdtpLength)
buffer.write(FMP4.size(20 + 16 * data.samples.length), FMP4.type('trun'), new Uint8Array([0x00, 0x00, 0x0F, 0x01]), sampleCount, offset)

let size = buffer.buffer.byteLength, writeOffset = 0
let size = buffer.buffer.byteLength
let writeOffset = 0
data.samples.forEach(() => {
size += 16
})
Expand All @@ -536,7 +543,6 @@ class FMP4 {
trunBox.set(buffer.buffer, 0)
writeOffset += buffer.buffer.byteLength
data.samples.forEach((item) => {
console.log(item.duration)
trunBox.set(Buffer.writeUint32(item.duration), writeOffset)
writeOffset += 4
trunBox.set(Buffer.writeUint32(item.size), writeOffset)
Expand Down Expand Up @@ -567,7 +573,8 @@ class FMP4 {
return buffer.buffer
}
static mdat (data) {
let buffer = new Buffer(), size = 8
let buffer = new Buffer()
let size = 8
data.samples.forEach(item => {
size += item.size
})
Expand Down
71 changes: 49 additions & 22 deletions packages/xgplayer-flv/src/tasks/LiveTask.js
Original file line number Diff line number Diff line change
@@ -1,29 +1,56 @@
class LiveTask {
constructor(url, config) {
const _headers = new window.Headers();
const _config = {
headers: Object.assign({}, _headers),
method: 'GET',
cache: 'default',
mode: 'cors',
};
this.request = new Request(url, Object.assign({}, _config, config));
}
constructor (url, config) {
const _headers = new window.Headers()

run (callback) {
const _config = {
headers: Object.assign({}, _headers),
method: 'GET',
cache: 'default',
mode: 'cors'
}
this._stop = false
this.request = new Request(url, Object.assign({}, _config, config)) // eslint-disable-line
}

function resolve (reader) {
reader.read().then(result => {
callback(result.done ? undefined : result.value);
resolve(reader);
});
run (callback) {
const self = this
function resolve (reader) {
reader.read().then(result => {
if (self._stop) {
reader.cancel()
return
}
fetch(this.request).then(res => {
const reader = res.body.getReader();
resolve(reader);
});

callback(result.done ? undefined : result.value)
resolve(reader)
})
}

const prom = new Promise((resolve, reject) => {
let isTimeout = true

fetch(this.request).then((res) => { // eslint-disable-line
isTimeout = false
resolve(res)
})
setTimeout(() => {
isTimeout && reject() // eslint-disable-line
}, 5000)
})

prom
.then(res => {
const reader = res.body.getReader()
resolve(reader)
})
.catch(res => {
callback()
})

return this
}
cancel () {
this._stop = true
}
}

export default LiveTask;
export default LiveTask

0 comments on commit bfb7be7

Please sign in to comment.