xgplayer-mp4 1.2.4 → 2.0.2
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 +1 -1
- package/browser/index.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
- package/src/constants.js +14 -0
- package/src/fmp4/buffer.js +6 -0
- package/src/fmp4/mp4.js +181 -84
- package/src/gap_jump.js +151 -0
- package/src/index.js +550 -315
- package/src/media/mse.js +77 -22
- package/src/media/task.js +68 -17
- package/src/mp4.js +284 -268
- package/src/parse/box/MP4DecConfigDescrTag.js +3 -0
- package/src/parse/box/MP4DecSpecificDescrTag.js +4 -0
- package/src/parse/box/avcC.js +4 -1
- package/src/parse/box/elst.js +0 -13
- package/src/parse/box/esds.js +9 -4
- package/src/parse/box/frma.js +10 -0
- package/src/parse/box/golomb.js +88 -0
- package/src/parse/box/hvc1.js +30 -0
- package/src/parse/box/hvcC.js +55 -0
- package/src/parse/box/pasp.js +2 -3
- package/src/parse/box/schm.js +18 -0
- package/src/parse/box/sps.js +286 -0
- package/src/parse/box/stsz.js +6 -1
- package/src/parse/box/tfhd.js +43 -0
- package/src/parse/box.js +5 -1
- package/src/parse/stream.js +4 -0
- package/src/util/getHeaders.js +18 -0
- package/src/util/index.js +138 -20
- package/src/util/intervalTimer.js +36 -0
- package/src/util/isSupport.js +20 -0
- package/src/util/proxyPromise.js +27 -0
- package/src/util/timer.js +46 -0
- package/src/util/xhr.js +46 -0
- package/version.json +1 -1
- package/webpack.config.js +45 -39
- package/src/util/download.js +0 -13
- package/src/write/box/MP4DecConfigDescrTag.js +0 -21
- package/src/write/box/MP4DecSpecificDescrTag.js +0 -19
- package/src/write/box/MP4ESDescrTag.js +0 -19
- package/src/write/box/SLConfigDescriptor.js +0 -16
- package/src/write/box/avc1.js +0 -33
- package/src/write/box/avcC.js +0 -32
- package/src/write/box/btrt.js +0 -14
- package/src/write/box/co64.js +0 -17
- package/src/write/box/ctts.js +0 -19
- package/src/write/box/dref.js +0 -25
- package/src/write/box/elst.js +0 -27
- package/src/write/box/esds.js +0 -11
- package/src/write/box/ftyp.js +0 -17
- package/src/write/box/hdlr.js +0 -15
- package/src/write/box/iods.js +0 -14
- package/src/write/box/mdat.js +0 -5
- package/src/write/box/mdhd.js +0 -27
- package/src/write/box/mehd.js +0 -12
- package/src/write/box/mfhd.js +0 -12
- package/src/write/box/mfro.js +0 -14
- package/src/write/box/mp4a.js +0 -26
- package/src/write/box/mvhd.js +0 -34
- package/src/write/box/pasp.js +0 -10
- package/src/write/box/smhd.js +0 -17
- package/src/write/box/stco.js +0 -17
- package/src/write/box/stsc.js +0 -19
- package/src/write/box/stsd.js +0 -23
- package/src/write/box/stss.js +0 -17
- package/src/write/box/stsz.js +0 -18
- package/src/write/box/stts.js +0 -18
- package/src/write/box/tfdt.js +0 -16
- package/src/write/box/tfhd.js +0 -18
- package/src/write/box/tfra.js +0 -29
- package/src/write/box/tkhd.js +0 -44
- package/src/write/box/trex.js +0 -16
- package/src/write/box/trun.js +0 -40
- package/src/write/box/udta.js +0 -5
- package/src/write/box/url.js +0 -16
- package/src/write/box/vmhd.js +0 -19
- package/src/write/box/wide.js +0 -12
- package/src/write/box.js +0 -37
- package/src/write/buffer.js +0 -12
- package/src/write/index.js +0 -33
- package/src/write/stream.js +0 -99
- package/webpack.config.test.js +0 -8
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export default function getResponseHeaders(xhr) {
|
|
2
|
+
const headerMap = {};
|
|
3
|
+
if (xhr instanceof window.XMLHttpRequest) {
|
|
4
|
+
try {
|
|
5
|
+
const headers = xhr.getAllResponseHeaders();
|
|
6
|
+
|
|
7
|
+
const arr = headers.trim().split(/[\r\n]+/);
|
|
8
|
+
arr.forEach(function (line) {
|
|
9
|
+
const parts = line.split(': ');
|
|
10
|
+
const header = parts.shift();
|
|
11
|
+
const value = parts.join(': ');
|
|
12
|
+
headerMap[header] = value;
|
|
13
|
+
});
|
|
14
|
+
} catch (error) {
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return headerMap;
|
|
18
|
+
}
|
package/src/util/index.js
CHANGED
|
@@ -64,11 +64,12 @@ util.sum = function (...rst) {
|
|
|
64
64
|
* @param {Number} sample_order [帧次序]
|
|
65
65
|
* @return {Object} [块的位置和当前帧的偏移数]
|
|
66
66
|
*/
|
|
67
|
-
util.stscOffset = function (stsc, sample_order) {
|
|
67
|
+
util.stscOffset = function (stsc, sample_order, stscObj) {
|
|
68
68
|
let chunk_index; let samples_offset = ''
|
|
69
|
-
let chunk_start = stsc.entries.filter((item) => {
|
|
70
|
-
|
|
71
|
-
})[0]
|
|
69
|
+
// let chunk_start = stsc.entries.filter((item) => {
|
|
70
|
+
// return item.first_sample <= sample_order && sample_order < item.first_sample + item.chunk_count * item.samples_per_chunk
|
|
71
|
+
// })[0]
|
|
72
|
+
let chunk_start = stscObj[sample_order];
|
|
72
73
|
if (!chunk_start) {
|
|
73
74
|
let last_chunk = stsc.entries.pop()
|
|
74
75
|
stsc.entries.push(last_chunk)
|
|
@@ -91,9 +92,11 @@ util.stscOffset = function (stsc, sample_order) {
|
|
|
91
92
|
}
|
|
92
93
|
}
|
|
93
94
|
|
|
94
|
-
util.seekSampleOffset = function (stsc, stco, stsz, order, mdatStart) {
|
|
95
|
-
let chunkOffset = util.stscOffset(stsc, order + 1)
|
|
96
|
-
let
|
|
95
|
+
util.seekSampleOffset = function (stsc, stco, stsz, order, mdatStart, stscObj) {
|
|
96
|
+
let chunkOffset = util.stscOffset(stsc, order + 1, stscObj)
|
|
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
|
|
97
100
|
if (result === undefined) {
|
|
98
101
|
throw `result=${result},stco.length=${stco.entries.length},sum=${util.sum.apply(null, stsz.entries.slice(0, order))}`
|
|
99
102
|
} else if (result < 0) {
|
|
@@ -102,7 +105,7 @@ util.seekSampleOffset = function (stsc, stco, stsz, order, mdatStart) {
|
|
|
102
105
|
return result
|
|
103
106
|
}
|
|
104
107
|
|
|
105
|
-
util.seekSampleTime = function (stts,
|
|
108
|
+
util.seekSampleTime = function (stts, cttsObj, order) {
|
|
106
109
|
let time; let duration; let count = 0; let startTime = 0; let offset = 0
|
|
107
110
|
stts.entry.every(item => {
|
|
108
111
|
duration = item.sampleDuration
|
|
@@ -115,22 +118,14 @@ util.seekSampleTime = function (stts, ctts, order, time_offset=0) {
|
|
|
115
118
|
return true
|
|
116
119
|
}
|
|
117
120
|
})
|
|
118
|
-
if (
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (order < ct) {
|
|
123
|
-
offset = item.offset
|
|
124
|
-
return false
|
|
125
|
-
} else {
|
|
126
|
-
return true
|
|
127
|
-
}
|
|
128
|
-
})
|
|
121
|
+
if (cttsObj) {
|
|
122
|
+
if(cttsObj[order]){
|
|
123
|
+
offset = cttsObj[order]
|
|
124
|
+
}
|
|
129
125
|
}
|
|
130
126
|
if (!time) {
|
|
131
127
|
time = startTime + (order - count) * duration
|
|
132
128
|
}
|
|
133
|
-
time -= time_offset
|
|
134
129
|
return {time, duration, offset}
|
|
135
130
|
}
|
|
136
131
|
|
|
@@ -159,4 +154,127 @@ util.seekTrakDuration = function (trak, timeScale) {
|
|
|
159
154
|
return Number(duration / timeScale).toFixed(4)
|
|
160
155
|
}
|
|
161
156
|
|
|
157
|
+
util.StringToArrayBuffer = function (str) {
|
|
158
|
+
let arr = new ArrayBuffer(str.length)
|
|
159
|
+
let view = new Uint8Array(arr)
|
|
160
|
+
for (let i = 0; i < str.length; i++) {
|
|
161
|
+
view[i] = str.charCodeAt(i)
|
|
162
|
+
}
|
|
163
|
+
return arr
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Convert a hex string to a Uint8Array.
|
|
167
|
+
* @param {string} str
|
|
168
|
+
* @return {!Uint8Array}
|
|
169
|
+
* @export
|
|
170
|
+
*/
|
|
171
|
+
util.fromHex = function (str) {
|
|
172
|
+
let arr = new Uint8Array(str.length / 2)
|
|
173
|
+
for (let i = 0; i < str.length; i += 2) {
|
|
174
|
+
arr[i / 2] = window.parseInt(str.substr(i, 2), 16)
|
|
175
|
+
}
|
|
176
|
+
return arr
|
|
177
|
+
}
|
|
178
|
+
util.fromCharCode = function (array) {
|
|
179
|
+
let max = 16000
|
|
180
|
+
let ret = ''
|
|
181
|
+
for (let i = 0; i < array.length; i += max) {
|
|
182
|
+
let subArray = array.subarray(i, i + max)
|
|
183
|
+
ret += String.fromCharCode.apply(null, subArray)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return ret
|
|
187
|
+
}
|
|
188
|
+
util.ArrayBufferToString = function (arr) {
|
|
189
|
+
let str = ''
|
|
190
|
+
let view = new Uint8Array(arr)
|
|
191
|
+
for (let i = 0; i < view.length; i++) {
|
|
192
|
+
str += String.fromCharCode(view[i])
|
|
193
|
+
}
|
|
194
|
+
return str
|
|
195
|
+
}
|
|
196
|
+
util.Base64ToHex = function (str) {
|
|
197
|
+
let bin = window.atob(str.replace(/-/g, '+').replace(/_/g, '/'))
|
|
198
|
+
let res = ''
|
|
199
|
+
for (let i = 0; i < bin.length; i++) {
|
|
200
|
+
res += ('0' + bin.charCodeAt(i).toString(16)).substr(-2)
|
|
201
|
+
}
|
|
202
|
+
return res
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Convert a Uint8Array to a base64 string. The output will always use the
|
|
207
|
+
* alternate encoding/alphabet also known as "base64url".
|
|
208
|
+
* @param {!Uint8Array} arr
|
|
209
|
+
* @param {boolean=} padding If true, pad the output with equals signs.
|
|
210
|
+
* Defaults to true.
|
|
211
|
+
* @return {string}
|
|
212
|
+
* @export
|
|
213
|
+
*/
|
|
214
|
+
util.toBase64 = function (arr, padding) {
|
|
215
|
+
// btoa expects a "raw string" where each character is interpreted as a byte.
|
|
216
|
+
let bytes = util.fromCharCode(arr)
|
|
217
|
+
padding = (padding === undefined) ? true : padding
|
|
218
|
+
let base64 = window.btoa(bytes).replace(/\+/g, '-').replace(/\//g, '_')
|
|
219
|
+
return padding ? base64 : base64.replace(/=*$/, '')
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
util.toUTF8 = function (str) {
|
|
223
|
+
// http://stackoverflow.com/a/13691499
|
|
224
|
+
// Converts the given string to a URI encoded string. If a character falls
|
|
225
|
+
// in the ASCII range, it is not converted; otherwise it will be converted to
|
|
226
|
+
// a series of URI escape sequences according to UTF-8.
|
|
227
|
+
// Example: 'g#€' -> 'g#%E3%82%AC'
|
|
228
|
+
let encoded = encodeURIComponent(str)
|
|
229
|
+
// Convert each escape sequence individually into a character. Each escape
|
|
230
|
+
// sequence is interpreted as a code-point, so if an escape sequence happens
|
|
231
|
+
// to be part of a multi-byte sequence, each byte will be converted to a
|
|
232
|
+
// single character.
|
|
233
|
+
// Example: 'g#%E3%82%AC' -> '\x67\x35\xe3\x82\xac'
|
|
234
|
+
let utf8 = unescape(encoded)
|
|
235
|
+
|
|
236
|
+
let result = new Uint8Array(utf8.length)
|
|
237
|
+
for (let i = 0; i < utf8.length; ++i) {
|
|
238
|
+
result[i] = utf8.charCodeAt(i)
|
|
239
|
+
}
|
|
240
|
+
return result.buffer
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
util.bufferToString = function (value) {
|
|
244
|
+
return ("0"+(Number(value).toString(16))).slice(-2).toUpperCase()
|
|
245
|
+
}
|
|
246
|
+
util.strToBuf = function (str) {
|
|
247
|
+
let buffer = []
|
|
248
|
+
for(let i = 0; i < str.length; i = i + 2) {
|
|
249
|
+
buffer.push(
|
|
250
|
+
parseInt(str[i] + str[i + 1], 16)
|
|
251
|
+
)
|
|
252
|
+
}
|
|
253
|
+
return new Uint8Array(buffer)
|
|
254
|
+
}
|
|
255
|
+
util.str2hex = function (str) {
|
|
256
|
+
if(str === "") {
|
|
257
|
+
return ""
|
|
258
|
+
}
|
|
259
|
+
let arr = [];
|
|
260
|
+
for(let i = 0; i < str.length; i++) {
|
|
261
|
+
arr.push(str.charCodeAt(i))
|
|
262
|
+
}
|
|
263
|
+
return arr
|
|
264
|
+
}
|
|
265
|
+
util.parse = function (a) {
|
|
266
|
+
if (!Array.isArray(a)) {
|
|
267
|
+
let arr = [];
|
|
268
|
+
let value = '';
|
|
269
|
+
for(let i = 0; i < a.length; i++) {
|
|
270
|
+
if (i % 2) {
|
|
271
|
+
value = a[i - 1] + a[ i ]
|
|
272
|
+
arr.push(parseInt(value, 16))
|
|
273
|
+
value = ''
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return arr
|
|
277
|
+
}
|
|
278
|
+
return a.map(item => {return parseInt(item, 16)})
|
|
279
|
+
}
|
|
162
280
|
export default util
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// 替代setInterval
|
|
2
|
+
class IntervalTimer {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.timeID = null;
|
|
5
|
+
this.func = null;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
repeat(func, ms) {
|
|
9
|
+
this.timeID = 1;
|
|
10
|
+
this.repeatInterval(func, ms);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
repeatInterval(func, ms) {
|
|
14
|
+
if (!this.timeID) return;
|
|
15
|
+
if (this.func === null) {
|
|
16
|
+
this.func = func;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (this.func !== func) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (this.timeID) clearTimeout(this.timeID);
|
|
23
|
+
this.timeID = null;
|
|
24
|
+
this.timeID = setTimeout(() => {
|
|
25
|
+
func();
|
|
26
|
+
this.repeatInterval(func, ms);
|
|
27
|
+
}, ms);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
clear() {
|
|
31
|
+
clearTimeout(this.timeID);
|
|
32
|
+
this.timeID = null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export default IntervalTimer;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
exports.isMSBrowser = function () {
|
|
2
|
+
let ua = window.navigator.userAgent
|
|
3
|
+
let msie = ua.indexOf('MSIE ')
|
|
4
|
+
let trident = ua.indexOf('Trident/')
|
|
5
|
+
return msie > 0 || trident > 0
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
exports.isMediaSourceSupported = function () {
|
|
9
|
+
const mediaSource = (window.MediaSource = window.MediaSource || window.WebKitMediaSource)
|
|
10
|
+
return mediaSource && typeof mediaSource.isTypeSupported === 'function'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
exports.isSupported = function () {
|
|
14
|
+
return exports.isMediaSourceSupported()
|
|
15
|
+
&& !exports.isMSBrowser()
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
exports.isSupportedWithXgmse = function () {
|
|
19
|
+
return !exports.isMSBrowser()
|
|
20
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
export default class ProxyPromise {
|
|
3
|
+
|
|
4
|
+
constructor() {
|
|
5
|
+
let resolvePromise;
|
|
6
|
+
let rejectPromise;
|
|
7
|
+
|
|
8
|
+
const promise = new Promise(((resolve, reject) => {
|
|
9
|
+
resolvePromise = resolve;
|
|
10
|
+
rejectPromise = reject;
|
|
11
|
+
}));
|
|
12
|
+
|
|
13
|
+
const publicPromise = promise
|
|
14
|
+
publicPromise.resolve = resolvePromise;
|
|
15
|
+
publicPromise.reject = rejectPromise;
|
|
16
|
+
|
|
17
|
+
return publicPromise;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
/** @param {T=} value */
|
|
22
|
+
resolve(value) {}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
/** @param {*=} reason */
|
|
26
|
+
reject(reason) {}
|
|
27
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export default class Timer{
|
|
2
|
+
|
|
3
|
+
constructor(onTick) {
|
|
4
|
+
this.onTick_ = onTick;
|
|
5
|
+
this.cancelPending_ = null;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
tickAfter(delayInSeconds, callback = null) {
|
|
9
|
+
|
|
10
|
+
this.stop();
|
|
11
|
+
let alive = true;
|
|
12
|
+
let timeoutId = null;
|
|
13
|
+
|
|
14
|
+
this.cancelPending_ = () => {
|
|
15
|
+
window.clearTimeout(timeoutId);
|
|
16
|
+
alive = false;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const onTick = () => {
|
|
20
|
+
if (alive) {
|
|
21
|
+
this.onTick_();
|
|
22
|
+
if(callback){
|
|
23
|
+
callback();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
timeoutId = window.setTimeout(onTick, delayInSeconds * 1000);
|
|
29
|
+
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
tickEvery(seconds){
|
|
34
|
+
this.tickAfter(seconds, ()=>{
|
|
35
|
+
this.tickEvery(seconds);
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
stop() {
|
|
41
|
+
if (this.cancelPending_) {
|
|
42
|
+
this.cancelPending_();
|
|
43
|
+
this.cancelPending_ = null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
package/src/util/xhr.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
class XHR {
|
|
2
|
+
constructor ({url, method = 'GET', type = 'arraybuffer', data = {}} = {}) {
|
|
3
|
+
return new Promise((resolve, reject) => {
|
|
4
|
+
let R = new window.XMLHttpRequest()
|
|
5
|
+
let _method = method.toUpperCase()
|
|
6
|
+
let _data = []
|
|
7
|
+
if (type) {
|
|
8
|
+
R.responseType = type
|
|
9
|
+
}
|
|
10
|
+
for (let k in data) {
|
|
11
|
+
_data.push(`k=${data[k]}`)
|
|
12
|
+
}
|
|
13
|
+
if (_method === 'GET') {
|
|
14
|
+
R.open(_method, `${url}?${_data.join('&')}`)
|
|
15
|
+
R.send()
|
|
16
|
+
} else if (_method === 'POST') {
|
|
17
|
+
|
|
18
|
+
// if (url.indexOf('data:application/json;base64') === 0) {
|
|
19
|
+
R.open(_method, url, true)
|
|
20
|
+
// R.timeout = 0
|
|
21
|
+
// R.withCredentials = false
|
|
22
|
+
R.setRequestHeader('Content-Type', 'application/json');
|
|
23
|
+
R.send(JSON.stringify(data))
|
|
24
|
+
// } else {
|
|
25
|
+
// R.open(_method, url)
|
|
26
|
+
// R.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
|
|
27
|
+
// R.send(_data.join('&'))
|
|
28
|
+
// }
|
|
29
|
+
} else {
|
|
30
|
+
throw new Error(`xhr ${_method} is not supported`)
|
|
31
|
+
}
|
|
32
|
+
R.onload = () => {
|
|
33
|
+
if (R.status === 200 || R.status === 206) {
|
|
34
|
+
resolve(R)
|
|
35
|
+
} else {
|
|
36
|
+
reject(R)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
R.onerror = () => {
|
|
40
|
+
reject(R)
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default XHR
|
package/version.json
CHANGED
package/webpack.config.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
|
|
1
2
|
const polyfill = []
|
|
3
|
+
const argv = require('yargs').argv;
|
|
2
4
|
|
|
3
5
|
const umd = {
|
|
4
6
|
entry: polyfill.concat(['./src/index.js']),
|
|
@@ -7,32 +9,24 @@ const umd = {
|
|
|
7
9
|
path: `${__dirname}/dist`,
|
|
8
10
|
filename: 'index.js',
|
|
9
11
|
library: 'xgplayer-mp4',
|
|
12
|
+
globalObject: 'this',
|
|
10
13
|
libraryTarget: 'umd'
|
|
11
14
|
},
|
|
12
15
|
mode: 'production',
|
|
13
16
|
module: {
|
|
14
|
-
rules: [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
'style-loader',
|
|
21
|
-
{
|
|
22
|
-
loader: 'css-loader',
|
|
23
|
-
options: {
|
|
24
|
-
importLoaders: 1,
|
|
25
|
-
minimize: true
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
'postcss-loader',
|
|
29
|
-
'sass-loader'
|
|
30
|
-
]
|
|
31
|
-
}]
|
|
17
|
+
rules: [
|
|
18
|
+
{
|
|
19
|
+
test: /\.js$/,
|
|
20
|
+
loader: 'babel-loader'
|
|
21
|
+
}
|
|
22
|
+
]
|
|
32
23
|
},
|
|
33
24
|
externals: {
|
|
34
25
|
'xgplayer': 'xgplayer'
|
|
35
26
|
},
|
|
27
|
+
node: {
|
|
28
|
+
fs: 'empty',
|
|
29
|
+
},
|
|
36
30
|
optimization: {
|
|
37
31
|
minimize: true
|
|
38
32
|
}
|
|
@@ -43,34 +37,46 @@ const client = {
|
|
|
43
37
|
devtool: 'source-map',
|
|
44
38
|
output: {
|
|
45
39
|
path: `${__dirname}/browser`,
|
|
46
|
-
filename: 'index.js'
|
|
40
|
+
filename: 'index.js',
|
|
41
|
+
library: 'Mp4Player',
|
|
42
|
+
libraryTarget: 'window'
|
|
47
43
|
},
|
|
44
|
+
// devtool: argv.watch ? 'source-map' : 'none',
|
|
48
45
|
module: {
|
|
49
|
-
rules: [
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
'style-loader',
|
|
56
|
-
{
|
|
57
|
-
loader: 'css-loader',
|
|
58
|
-
options: {
|
|
59
|
-
importLoaders: 1,
|
|
60
|
-
minimize: true
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
'postcss-loader',
|
|
64
|
-
'sass-loader'
|
|
65
|
-
]
|
|
66
|
-
}]
|
|
46
|
+
rules: [
|
|
47
|
+
{
|
|
48
|
+
test: /\.js$/,
|
|
49
|
+
loader: 'babel-loader'
|
|
50
|
+
}
|
|
51
|
+
]
|
|
67
52
|
},
|
|
53
|
+
mode: 'production',
|
|
68
54
|
externals: {
|
|
69
55
|
'xgplayer': 'Player'
|
|
70
56
|
},
|
|
71
|
-
|
|
57
|
+
node: {
|
|
58
|
+
fs: 'empty',
|
|
59
|
+
},
|
|
72
60
|
optimization: {
|
|
73
|
-
minimize: true
|
|
61
|
+
minimize: true,
|
|
62
|
+
minimizer: [
|
|
63
|
+
new UglifyJsPlugin({
|
|
64
|
+
test: [/\.(js|jsx)$/],
|
|
65
|
+
exclude: [/node_modules/],
|
|
66
|
+
parallel: true,
|
|
67
|
+
sourceMap: true,
|
|
68
|
+
uglifyOptions: {
|
|
69
|
+
warnings: false,
|
|
70
|
+
compress: {
|
|
71
|
+
inline: 1,
|
|
72
|
+
keep_fnames: true
|
|
73
|
+
},
|
|
74
|
+
mangle: {
|
|
75
|
+
keep_fnames: true
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
],
|
|
74
80
|
}
|
|
75
81
|
}
|
|
76
82
|
|
package/src/util/download.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
class Download {
|
|
2
|
-
constructor (filename, content) {
|
|
3
|
-
let aLink = document.createElement('a')
|
|
4
|
-
let blob = new Blob([content])
|
|
5
|
-
let evt = document.createEvent('MouseEvents')
|
|
6
|
-
evt.initEvent('click', false, false)
|
|
7
|
-
aLink.download = filename
|
|
8
|
-
aLink.href = URL.createObjectURL(blob)
|
|
9
|
-
aLink.dispatchEvent(evt)
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export default Download
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import Box from '../box'
|
|
2
|
-
import Stream from '../stream'
|
|
3
|
-
Box.MP4DecConfigDescrTag = function (data, output) {
|
|
4
|
-
let stream = new Stream(new Uint8Array(data.size).buffer)
|
|
5
|
-
stream.writeUint8(data.type)
|
|
6
|
-
if (data.extend) {
|
|
7
|
-
for (let i = 0; i < 3; i++) {
|
|
8
|
-
stream.writeUint8(0x80)
|
|
9
|
-
}
|
|
10
|
-
stream.writeUint8(data.size - 5)
|
|
11
|
-
} else {
|
|
12
|
-
stream.writeUint8(data.size - 2)
|
|
13
|
-
}
|
|
14
|
-
stream.writeUint8(data.typeID)
|
|
15
|
-
stream.writeUint8(data.streamUint)
|
|
16
|
-
stream.writeUint24(data.bufferSize)
|
|
17
|
-
stream.writeUint32(data.maximum)
|
|
18
|
-
stream.writeUint32(data.average)
|
|
19
|
-
output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
|
|
20
|
-
Box.MP4DecSpecificDescrTag(data.subBox[0], output)
|
|
21
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import Box from '../box'
|
|
2
|
-
import Stream from '../stream'
|
|
3
|
-
|
|
4
|
-
Box.MP4DecSpecificDescrTag = function (data, output) {
|
|
5
|
-
let stream = new Stream(new Uint8Array(data.size).buffer)
|
|
6
|
-
stream.writeUint8(data.type)
|
|
7
|
-
if (data.extend) {
|
|
8
|
-
for (let i = 0; i < 3; i++) {
|
|
9
|
-
stream.writeUint8(0x80)
|
|
10
|
-
}
|
|
11
|
-
stream.writeUint8(data.size - 5)
|
|
12
|
-
} else {
|
|
13
|
-
stream.writeUint8(data.size - 2)
|
|
14
|
-
}
|
|
15
|
-
data.EScode.forEach(item => {
|
|
16
|
-
stream.writeUint8(Number(`0x${item}`))
|
|
17
|
-
})
|
|
18
|
-
output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
|
|
19
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import Box from '../box'
|
|
2
|
-
import Stream from '../stream'
|
|
3
|
-
Box.MP4ESDescrTag = function (data, output) {
|
|
4
|
-
let stream = new Stream(new Uint8Array(data.size).buffer)
|
|
5
|
-
stream.writeUint8(data.type)
|
|
6
|
-
if (data.extend) {
|
|
7
|
-
for (let i = 0; i < 3; i++) {
|
|
8
|
-
stream.writeUint8(0x80)
|
|
9
|
-
}
|
|
10
|
-
stream.writeUint8(data.size - 5)
|
|
11
|
-
} else {
|
|
12
|
-
stream.writeUint8(data.size - 2)
|
|
13
|
-
}
|
|
14
|
-
stream.writeUint16(data.esID)
|
|
15
|
-
stream.writeUint8(data.priority)
|
|
16
|
-
output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
|
|
17
|
-
Box.MP4DecConfigDescrTag(data.subBox[0], output)
|
|
18
|
-
Box.SLConfigDescriptor(data.subBox[1], output)
|
|
19
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import Box from '../box'
|
|
2
|
-
import Stream from '../stream'
|
|
3
|
-
Box.SLConfigDescriptor = function (data, output) {
|
|
4
|
-
let stream = new Stream(new Uint8Array(data.size).buffer)
|
|
5
|
-
stream.writeUint8(data.type)
|
|
6
|
-
if (data.extend) {
|
|
7
|
-
for (let i = 0; i < 3; i++) {
|
|
8
|
-
stream.writeUint8(0x80)
|
|
9
|
-
}
|
|
10
|
-
stream.writeUint8(data.size - 5)
|
|
11
|
-
} else {
|
|
12
|
-
stream.writeUint8(data.size - 2)
|
|
13
|
-
}
|
|
14
|
-
stream.writeUint8(data.SL)
|
|
15
|
-
output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
|
|
16
|
-
}
|
package/src/write/box/avc1.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import Box from '../box'
|
|
2
|
-
Box.avc1 = function (data, output) {
|
|
3
|
-
let stream = this.stream
|
|
4
|
-
stream.fill(6)
|
|
5
|
-
stream.writeUint16(data.dataReferenceIndex)
|
|
6
|
-
stream.fill(16)
|
|
7
|
-
stream.writeUint16(data.width)
|
|
8
|
-
stream.writeUint16(data.height)
|
|
9
|
-
stream.writeUint32(data.horizresolution)
|
|
10
|
-
stream.writeUint32(data.vertresolution)
|
|
11
|
-
stream.fill(4)
|
|
12
|
-
stream.writeUint16(data.frameCount)
|
|
13
|
-
stream.fill(32)
|
|
14
|
-
stream.writeUint16(data.depth)
|
|
15
|
-
stream.fill(2)
|
|
16
|
-
output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
|
|
17
|
-
let self = this
|
|
18
|
-
data.subBox.forEach(item => {
|
|
19
|
-
let box = new Box(item, self.output)
|
|
20
|
-
self.subBox.push(box)
|
|
21
|
-
box.writeBody()
|
|
22
|
-
})
|
|
23
|
-
let writeSize = stream.position
|
|
24
|
-
self.subBox.forEach(item => {
|
|
25
|
-
writeSize += item.stream.position + 8
|
|
26
|
-
})
|
|
27
|
-
if (writeSize !== data.size - 8) {
|
|
28
|
-
throw new Error(`${data.type} box incomplete`)
|
|
29
|
-
} else {
|
|
30
|
-
self.outputSize = writeSize
|
|
31
|
-
}
|
|
32
|
-
delete this.data
|
|
33
|
-
}
|
package/src/write/box/avcC.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import Box from '../box'
|
|
2
|
-
Box.avcC = function (data, output) {
|
|
3
|
-
let stream = this.stream
|
|
4
|
-
stream.writeUint8(data.configVersion)
|
|
5
|
-
stream.writeUint8(data.profile)
|
|
6
|
-
stream.writeUint8(data.profileCompatibility)
|
|
7
|
-
stream.writeUint8(data.AVCLevelIndication)
|
|
8
|
-
stream.writeUint8(data.lengthSizeMinusOne - 1)
|
|
9
|
-
stream.writeUint8(data.numOfSequenceParameterSets)
|
|
10
|
-
stream.writeUint16(data.sequenceLength)
|
|
11
|
-
data.sequence.forEach(item => {
|
|
12
|
-
stream.writeUint8(Number('0x' + item))
|
|
13
|
-
})
|
|
14
|
-
stream.writeUint8(data.ppsCount)
|
|
15
|
-
stream.writeUint16(data.ppsLength)
|
|
16
|
-
data.pps.forEach(item => {
|
|
17
|
-
stream.writeUint8(Number('0x' + item))
|
|
18
|
-
})
|
|
19
|
-
if (data.last.length) {
|
|
20
|
-
data.last.forEach(item => {
|
|
21
|
-
stream.writeUint8(item)
|
|
22
|
-
})
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
|
|
26
|
-
if (stream.position !== data.size - 8) {
|
|
27
|
-
throw new Error(`${data.type} box incomplete`)
|
|
28
|
-
} else {
|
|
29
|
-
this.outputSize = stream.position
|
|
30
|
-
}
|
|
31
|
-
delete this.data
|
|
32
|
-
}
|
package/src/write/box/btrt.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import Box from '../box';
|
|
2
|
-
Box.btrt = function (data, output) {
|
|
3
|
-
let stream = this.stream;
|
|
4
|
-
stream.writeUint32(this.bufferSizeDB);
|
|
5
|
-
stream.writeUint32(this.maxBitrate);
|
|
6
|
-
stream.writeUint32(this.avgBitrate);
|
|
7
|
-
output.write(new Uint8Array(stream.buffer.slice(0, stream.position)));
|
|
8
|
-
if (stream.position !== data.size - 8) {
|
|
9
|
-
throw `${data.type} box incomplete`;
|
|
10
|
-
} else {
|
|
11
|
-
this.outputSize = stream.position;
|
|
12
|
-
}
|
|
13
|
-
delete this.data;
|
|
14
|
-
};
|