xgplayer-mp4 2.0.4 → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/index.js +2 -1
- package/browser/index.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -2
- package/src/index.js +6 -4
- package/src/media/task.js +2 -1
- package/src/mp4.js +14 -5
- package/src/parse/box/MP4DecConfigDescrTag.js +3 -0
- package/src/parse/box/MP4DecSpecificDescrTag.js +4 -0
- package/src/parse/box/esds.js +9 -4
- package/src/util/index.js +15 -14
- package/version.json +1 -1
- package/webpack.config.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xgplayer-mp4",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.5",
|
|
4
4
|
"description": "xgplayer plugin for mp4 transform to fmp4",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
"build": "node ./src/version.js && webpack --progress --display-chunks -p",
|
|
9
9
|
"watch": "webpack --progress --display-chunks -p --watch",
|
|
10
10
|
"test": "karma start --single-run",
|
|
11
|
-
"release": "npm publish --registry=https://registry.npmjs.org",
|
|
12
11
|
"test:watch": "karma start"
|
|
13
12
|
},
|
|
14
13
|
"repository": {
|
package/src/index.js
CHANGED
|
@@ -13,9 +13,9 @@ const DESTROYED = 'DESTROYED';
|
|
|
13
13
|
const sniffer = Player.sniffer;
|
|
14
14
|
|
|
15
15
|
let isEnded = (player, mp4) => {
|
|
16
|
-
if (mp4.meta.endTime - player.currentTime < 0.5) {
|
|
16
|
+
if (player.mse && mp4.meta.endTime - player.currentTime < 0.5) {
|
|
17
17
|
// let range = player.getBufferedRange(player.buffered2)
|
|
18
|
-
let offsetTime =
|
|
18
|
+
let offsetTime = player.duration - player.currentTime
|
|
19
19
|
if (offsetTime < 0.5) {
|
|
20
20
|
player.mse.endOfStream()
|
|
21
21
|
player._stopProgress()
|
|
@@ -62,7 +62,7 @@ class Mp4Player extends Player {
|
|
|
62
62
|
})
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
_initMp4Kernal(){
|
|
65
|
+
_initMp4Kernal (){
|
|
66
66
|
let player = this;
|
|
67
67
|
let rule = player.config.pluginRule || function () { return true }
|
|
68
68
|
if (MSE.isSupported('video/mp4; codecs="avc1.64001E, mp4a.40.5"')) {
|
|
@@ -74,7 +74,9 @@ class Mp4Player extends Player {
|
|
|
74
74
|
return player.currentSrc
|
|
75
75
|
},
|
|
76
76
|
set (url) {
|
|
77
|
-
player.mse
|
|
77
|
+
if (player.mse) {
|
|
78
|
+
player.mse.endOfStream()
|
|
79
|
+
}
|
|
78
80
|
player._onDestroy();
|
|
79
81
|
player.config.autoplay = player.autoplay = true
|
|
80
82
|
player.config.url = url
|
package/src/media/task.js
CHANGED
package/src/mp4.js
CHANGED
|
@@ -254,7 +254,13 @@ class MP4 {
|
|
|
254
254
|
if (nextBox) {
|
|
255
255
|
if (nextBox.type === 'moov') {
|
|
256
256
|
self.getData(moovStart, moovStart + nextBox.size + 28).then(res => {
|
|
257
|
-
let parsed
|
|
257
|
+
let parsed
|
|
258
|
+
// try {
|
|
259
|
+
parsed = new Parser(res)
|
|
260
|
+
// }catch(e) {
|
|
261
|
+
|
|
262
|
+
// }
|
|
263
|
+
|
|
258
264
|
self._boxes = self._boxes.concat(parsed.boxes)
|
|
259
265
|
moov = parsed.boxes.filter(box => box.type === 'moov')
|
|
260
266
|
if (moov.length) {
|
|
@@ -301,7 +307,6 @@ class MP4 {
|
|
|
301
307
|
let stsz = util.findBox(trak, 'stsz') // sample-size
|
|
302
308
|
let stts = util.findBox(trak, 'stts') // sample-time
|
|
303
309
|
let stco = util.findBox(trak, 'stco') // chunk-offset
|
|
304
|
-
|
|
305
310
|
let cttsObj = type === 'video' ? this._cttsObj : null;
|
|
306
311
|
let stscObj = type === 'video' ? this._stscVideoObj : this._stscAudioObj;
|
|
307
312
|
let mdatStart = this.mdatStart
|
|
@@ -328,11 +333,12 @@ class MP4 {
|
|
|
328
333
|
})
|
|
329
334
|
}
|
|
330
335
|
} else {
|
|
336
|
+
let offset = util.seekSampleOffset(stsc, stco, stsz, start, mdatStart, stscObj)
|
|
331
337
|
samples = {
|
|
332
338
|
idx: start,
|
|
333
339
|
size: stsz.entries[start],
|
|
334
340
|
time: util.seekSampleTime(stts, cttsObj, start),
|
|
335
|
-
offset:
|
|
341
|
+
offset: offset
|
|
336
342
|
}
|
|
337
343
|
}
|
|
338
344
|
return samples
|
|
@@ -475,7 +481,7 @@ class MP4 {
|
|
|
475
481
|
end = videoNextFrame.offset
|
|
476
482
|
if (this.audioTrak) {
|
|
477
483
|
let audioNextFrame = this.getSamplesByOrders('audio', this.audioKeyFrames[fragIndex + 1].order, 0)
|
|
478
|
-
end = Math.max(end, audioNextFrame.offset)
|
|
484
|
+
end = Math.max(end, audioNextFrame.offset || 0)
|
|
479
485
|
}
|
|
480
486
|
}
|
|
481
487
|
if (window.isNaN(start) || (end !== undefined && window.isNaN(end))) {
|
|
@@ -487,7 +493,10 @@ class MP4 {
|
|
|
487
493
|
loadFragment (fragIndex) {
|
|
488
494
|
let self = this
|
|
489
495
|
let range = this.getFragRange(fragIndex)
|
|
490
|
-
if(range === [0, 0])
|
|
496
|
+
if(range === [0, 0]) {
|
|
497
|
+
debugger
|
|
498
|
+
return false;
|
|
499
|
+
}
|
|
491
500
|
return this.getData(range[0], range[1]).then((dat) => {
|
|
492
501
|
return self.createFragment(new Uint8Array(dat), range[0] - this.mdatStart, fragIndex)
|
|
493
502
|
})
|
|
@@ -4,6 +4,10 @@ Box.MP4DecSpecificDescrTag = function (stream) {
|
|
|
4
4
|
let box = new Box()
|
|
5
5
|
let size, dataSize
|
|
6
6
|
box.type = stream.readUint8()
|
|
7
|
+
if (box.type !== 5) {
|
|
8
|
+
stream.position = stream.position - 1
|
|
9
|
+
return box
|
|
10
|
+
}
|
|
7
11
|
size = stream.readUint8()
|
|
8
12
|
if (size === 0x80) {
|
|
9
13
|
box.extend = true
|
package/src/parse/box/esds.js
CHANGED
|
@@ -5,8 +5,13 @@ Box.esds = function () {
|
|
|
5
5
|
let stream = new Stream(this.data)
|
|
6
6
|
this.version = stream.readUint8()
|
|
7
7
|
this.flag = Stream.readByte(stream.dataview, 3)
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
try {
|
|
9
|
+
let box = Box.MP4ESDescrTag(stream)
|
|
10
|
+
this.subBox.push(box)
|
|
11
|
+
delete this.data
|
|
12
|
+
stream = null
|
|
13
|
+
}catch(e) {
|
|
14
|
+
console.error(e)
|
|
15
|
+
}
|
|
16
|
+
|
|
12
17
|
}
|
package/src/util/index.js
CHANGED
|
@@ -69,12 +69,11 @@ util.stscOffset = function (stsc, sample_order, stscObj) {
|
|
|
69
69
|
// let chunk_start = stsc.entries.filter((item) => {
|
|
70
70
|
// return item.first_sample <= sample_order && sample_order < item.first_sample + item.chunk_count * item.samples_per_chunk
|
|
71
71
|
// })[0]
|
|
72
|
-
let chunk_start = stscObj[sample_order]
|
|
72
|
+
let chunk_start = stscObj[sample_order];
|
|
73
73
|
if (!chunk_start) {
|
|
74
74
|
let last_chunk = stsc.entries.pop()
|
|
75
75
|
stsc.entries.push(last_chunk)
|
|
76
76
|
let chunk_offset = Math.floor((sample_order - last_chunk.first_sample) / last_chunk.samples_per_chunk)
|
|
77
|
-
chunk_offset = Math.min(chunk_offset, last_chunk.chunk_count)
|
|
78
77
|
let last_chunk_index = last_chunk.first_chunk + chunk_offset
|
|
79
78
|
let last_chunk_first_sample = last_chunk.first_sample + last_chunk.samples_per_chunk * chunk_offset
|
|
80
79
|
return {
|
|
@@ -95,7 +94,9 @@ util.stscOffset = function (stsc, sample_order, stscObj) {
|
|
|
95
94
|
|
|
96
95
|
util.seekSampleOffset = function (stsc, stco, stsz, order, mdatStart, stscObj) {
|
|
97
96
|
let chunkOffset = util.stscOffset(stsc, order + 1, stscObj)
|
|
98
|
-
let
|
|
97
|
+
let sum = util.sum.apply(null, stsz.entries.slice(chunkOffset.samples_offset[0] - 1, chunkOffset.samples_offset[1] - 1))
|
|
98
|
+
let ss = stco.entries[chunkOffset.chunk_index - 1]
|
|
99
|
+
let result = ss + sum - mdatStart
|
|
99
100
|
if (result === undefined) {
|
|
100
101
|
throw `result=${result},stco.length=${stco.entries.length},sum=${util.sum.apply(null, stsz.entries.slice(0, order))}`
|
|
101
102
|
} else if (result < 0) {
|
|
@@ -118,7 +119,7 @@ util.seekSampleTime = function (stts, cttsObj, order) {
|
|
|
118
119
|
}
|
|
119
120
|
})
|
|
120
121
|
if (cttsObj) {
|
|
121
|
-
if
|
|
122
|
+
if(cttsObj[order]){
|
|
122
123
|
offset = cttsObj[order]
|
|
123
124
|
}
|
|
124
125
|
}
|
|
@@ -240,11 +241,11 @@ util.toUTF8 = function (str) {
|
|
|
240
241
|
}
|
|
241
242
|
|
|
242
243
|
util.bufferToString = function (value) {
|
|
243
|
-
return (
|
|
244
|
+
return ("0"+(Number(value).toString(16))).slice(-2).toUpperCase()
|
|
244
245
|
}
|
|
245
246
|
util.strToBuf = function (str) {
|
|
246
247
|
let buffer = []
|
|
247
|
-
for
|
|
248
|
+
for(let i = 0; i < str.length; i = i + 2) {
|
|
248
249
|
buffer.push(
|
|
249
250
|
parseInt(str[i] + str[i + 1], 16)
|
|
250
251
|
)
|
|
@@ -252,20 +253,20 @@ util.strToBuf = function (str) {
|
|
|
252
253
|
return new Uint8Array(buffer)
|
|
253
254
|
}
|
|
254
255
|
util.str2hex = function (str) {
|
|
255
|
-
if
|
|
256
|
-
return
|
|
256
|
+
if(str === "") {
|
|
257
|
+
return ""
|
|
257
258
|
}
|
|
258
|
-
let arr = []
|
|
259
|
-
for
|
|
259
|
+
let arr = [];
|
|
260
|
+
for(let i = 0; i < str.length; i++) {
|
|
260
261
|
arr.push(str.charCodeAt(i))
|
|
261
262
|
}
|
|
262
263
|
return arr
|
|
263
264
|
}
|
|
264
265
|
util.parse = function (a) {
|
|
265
266
|
if (!Array.isArray(a)) {
|
|
266
|
-
let arr = []
|
|
267
|
-
let value = ''
|
|
268
|
-
for
|
|
267
|
+
let arr = [];
|
|
268
|
+
let value = '';
|
|
269
|
+
for(let i = 0; i < a.length; i++) {
|
|
269
270
|
if (i % 2) {
|
|
270
271
|
value = a[i - 1] + a[ i ]
|
|
271
272
|
arr.push(parseInt(value, 16))
|
|
@@ -274,6 +275,6 @@ util.parse = function (a) {
|
|
|
274
275
|
}
|
|
275
276
|
return arr
|
|
276
277
|
}
|
|
277
|
-
return a.map(item => {
|
|
278
|
+
return a.map(item => {return parseInt(item, 16)})
|
|
278
279
|
}
|
|
279
280
|
export default util
|
package/version.json
CHANGED