diff --git a/docs/flv/css/common.css b/docs/flv/css/common.css index 486a5ee1c..fad85d5d0 100644 --- a/docs/flv/css/common.css +++ b/docs/flv/css/common.css @@ -19,20 +19,16 @@ body, .part-top .config { width: 500px; - display: flex; margin-bottom: 20px; } .part-top .config .urlInput { - flex: 1; - outline: none; -} - -.part-top .config .playBtn { - width: 50px; + width: 100%; + margin-bottom: 20px; } .part-top .artplayer { + opacity: 0; width: 500px; height: 300px; background: #fff; diff --git a/docs/flv/index.html b/docs/flv/index.html index f47611cf0..3c10db404 100644 --- a/docs/flv/index.html +++ b/docs/flv/index.html @@ -19,8 +19,12 @@
- - + + +
+ + +
@@ -31,13 +35,13 @@ diff --git a/docs/flv/js/common.js b/docs/flv/js/common.js index 01db5bc76..5dd67a6cd 100644 --- a/docs/flv/js/common.js +++ b/docs/flv/js/common.js @@ -1,11 +1,11 @@ 'use strict'; (function() { - consola.creat({ - target: '.part-bottom', - size: '100%', - zIndex: 99, - }); + // consola.creat({ + // target: '.part-bottom', + // size: '100%', + // zIndex: 99, + // }); console.info('Welcome, if you like it, consider star it, thank you.'); console.info('https://github.com/zhw2590582/ArtPlayer'); @@ -16,8 +16,9 @@ var $urlInput = document.querySelector('.urlInput'); var $playBtn = document.querySelector('.playBtn'); + var $fileBtn = document.querySelector('.fileBtn'); - function creatPlayer() { + function creatPlayer(file) { Artplayer.instances.forEach(function(art) { art.destroy(true); }); @@ -28,13 +29,24 @@ type: 'flv', customType: { flv: function(video, url) { - this.plugins.artplayerPluginFlv.init(video, url); + var flv = new Flv({ + mediaElement: video, + url: file instanceof File ? file : url, + debug: true, + }); + + this.on('destroy', () => { + flv.destroy(); + }); }, }, - plugins: [artplayerPluginFlv] }); } creatPlayer(); $playBtn.addEventListener('click', creatPlayer); + $fileBtn.addEventListener('change', () => { + const file = $fileBtn.files[0]; + creatPlayer(file); + }); })(); diff --git a/docs/flv/video/again.flv b/docs/flv/video/again.flv new file mode 100644 index 000000000..618f40f72 Binary files /dev/null and b/docs/flv/video/again.flv differ diff --git a/docs/uncompiled/artplayer-plugin-flv.js b/docs/uncompiled/artplayer-plugin-flv.js index 0885d71db..2399ad820 100644 --- a/docs/uncompiled/artplayer-plugin-flv.js +++ b/docs/uncompiled/artplayer-plugin-flv.js @@ -170,6 +170,36 @@ }; var tinyEmitter = E; + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { + arr2[i] = arr[i]; + } + + return arr2; + } + } + + var arrayWithoutHoles = _arrayWithoutHoles; + + function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + } + + var iterableToArray = _iterableToArray; + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + + var nonIterableSpread = _nonIterableSpread; + + function _toConsumableArray(arr) { + return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread(); + } + + var toConsumableArray = _toConsumableArray; + function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } @@ -270,85 +300,727 @@ return FlvError; }(wrapNativeSuper(Error)); + function errorHandle(condition, msg) { if (!condition) { throw new FlvError(msg); } } + function mergeTypedArrays(a, b) { + var c = new a.constructor(a.length + b.length); + c.set(a); + c.set(b, a.length); + return c; + } + function sleep() { + var ms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + return new Promise(function (resolve) { + return setTimeout(resolve, ms); + }); + } + function getUint8Sum(arr) { + return arr.reduce(function (totle, num, index) { + return totle + num * Math.pow(256, arr.length - index - 1); + }, 0); + } + function string2Bin(str) { + var result = []; - var CheckSupport = function CheckSupport() { - classCallCheck(this, CheckSupport); + for (var i = 0; i < str.length; i += 1) { + result.push(Number(str.charCodeAt(i).toString(10))); + } + return result; + } + function bin2String(array) { + var _String$fromCharCode; + + return (_String$fromCharCode = String.fromCharCode).call.apply(_String$fromCharCode, [String].concat(toConsumableArray(array))); + } + function bin2Float(array) { + var view = new DataView(new ArrayBuffer(array.length)); + array.forEach(function (b, i) { + view.setUint8(i, b); + }); + return view.getFloat64(0); + } + function bin2Boolean(bin) { + return bin === 1; + } + function log(name) { + var msg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + console.log("[".concat(name, "] ").concat(msg)); + } + function readUint8(uint8) { + var index = 0; + return function read(length) { + var tempUint8 = new Uint8Array(length); + + for (var i = 0; i < length; i += 1) { + tempUint8[i] = uint8[index]; + index += 1; + } + + read.index = index; + return tempUint8; + }; + } + + var utils = /*#__PURE__*/Object.freeze({ + errorHandle: errorHandle, + mergeTypedArrays: mergeTypedArrays, + sleep: sleep, + getUint8Sum: getUint8Sum, + string2Bin: string2Bin, + bin2String: bin2String, + bin2Float: bin2Float, + bin2Boolean: bin2Boolean, + log: log, + readUint8: readUint8 + }); + + function checkSupport(options) { + var mediaElement = options.mediaElement, + url = options.url; + errorHandle(mediaElement instanceof HTMLVideoElement, 'The first parameter is not a video tag element'); + errorHandle(typeof url === 'string' || url instanceof File && url.type === 'video/x-flv', 'The second parameter is not a string type or flv file'); var MP4H264MimeCodec = 'video/mp4; codecs="avc1.42001E, mp4a.40.2"'; - var videoElement = window.document.createElement('video'); - var canPlay = videoElement.canPlayType(MP4H264MimeCodec); + var canPlay = mediaElement.canPlayType(MP4H264MimeCodec); errorHandle(window.MediaSource && window.MediaSource.isTypeSupported(MP4H264MimeCodec) && (canPlay === 'probably' || canPlay === 'maybe'), "Unsupported MIME type or codec: ".concat(MP4H264MimeCodec)); errorHandle(typeof window.Promise === 'function', "Unsupported 'Promise' method"); errorHandle(typeof window.fetch === 'function', "Unsupported 'fetch' method"); + errorHandle(typeof window.Worker === 'function', "Unsupported 'Worker' method"); + errorHandle(typeof window.ReadableStream === 'function', "Unsupported 'ReadableStream' method"); + } + + var EventProxy = + /*#__PURE__*/ + function () { + function EventProxy() { + classCallCheck(this, EventProxy); + + this.destroyEvents = []; + this.proxy = this.proxy.bind(this); + } + + createClass(EventProxy, [{ + key: "proxy", + value: function proxy(target, name, callback) { + var option = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + target.addEventListener(name, callback, option); + this.destroyEvents.push(function () { + target.removeEventListener(name, callback, option); + }); + } + }, { + key: "destroy", + value: function destroy() { + this.destroyEvents.forEach(function (event) { + return event(); + }); + } + }]); + + return EventProxy; + }(); + + var CreatWorker = + /*#__PURE__*/ + function () { + function CreatWorker() { + classCallCheck(this, CreatWorker); + + this.workers = new Map(); + } + + createClass(CreatWorker, [{ + key: "add", + value: function add(name, fn) { + if (!this.workers.has(name)) { + this.workers.set(name, CreatWorker.create(fn)); + } + } + }, { + key: "run", + value: function run(name) { + var worker = this.workers.get(name); + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return worker.post(args); + } + }, { + key: "kill", + value: function kill(name) { + var worker = this.workers.get(name); + worker.kill(); + } + }, { + key: "killAll", + value: function killAll() { + this.workers.forEach(function (worker) { + worker.kill(); + }); + } + }], [{ + key: "fnToStr", + value: function fnToStr(fn) { + return "\n self.onmessage = event => {\n return self.postMessage((".concat(fn, ").apply(null, event.data));\n }\n "); + } + }, { + key: "create", + value: function create(fn) { + var blob = new Blob([CreatWorker.fnToStr(fn)], { + type: 'application/javascript' + }); + var objectURL = window.URL.createObjectURL(blob); + var worker = new Worker(objectURL); + + worker.kill = function () { + URL.revokeObjectURL(objectURL); + worker.terminate(); + }; + + worker.post = function (args) { + return new Promise(function (resolve, reject) { + worker.onmessage = function (event) { + resolve(event.data); + }; + + worker.onerror = function (error) { + reject(error); + }; + + worker.postMessage(args); + }); + }; + + return worker; + } + }]); + + return CreatWorker; + }(); + + var config = { + mediaSource: { + propertys: ['activeSourceBuffers', 'duration', 'readyState', 'sourceBuffers'], + methods: ['addSourceBuffer', 'endOfStream', 'removeSourceBuffer', 'clearLiveSeekableRange', 'setLiveSeekableRange'], + events: ['sourceclose', 'sourceended', 'sourceopen'] + }, + sourceBuffer: { + propertys: ['mode', 'updating', 'buffered', 'timestampOffset', 'audioTracks', 'videoTracks', 'textTracks', 'appendWindowStart', 'appendWindowEnd', 'trackDefaults'], + methods: ['appendBuffer', 'appendStream', 'abort', 'remove'], + events: ['abort', 'error', 'update', 'updateend', 'updatestart'] + }, + sourceBufferList: { + propertys: ['length'], + events: ['addsourcebuffer', 'removesourcebuffer'] + } }; - var CreatMediaSource = function CreatMediaSource(flv) { - classCallCheck(this, CreatMediaSource); + var CreatMediaSource = + /*#__PURE__*/ + function () { + function CreatMediaSource(flv) { + classCallCheck(this, CreatMediaSource); - this.mediaSource = new MediaSource(); - this.url = URL.createObjectURL(this.mediaSource); - flv.mediaElement.src = this.url; - }; + this.flv = flv; + this.creatUrl(); + this.eventBind(); + } + + createClass(CreatMediaSource, [{ + key: "creatUrl", + value: function creatUrl() { + var _this$flv = this.flv, + mediaElement = _this$flv.options.mediaElement, + destroyEvents = _this$flv.events.destroyEvents; + this.mediaSource = new MediaSource(); + var url = URL.createObjectURL(this.mediaSource); + destroyEvents.push(function () { + URL.revokeObjectURL(url); + }); + mediaElement.src = url; + } + }, { + key: "eventBind", + value: function eventBind() { + var _this = this; + + var proxy = this.flv.events.proxy; + config.mediaSource.events.forEach(function (eventName) { + proxy(_this.mediaSource, eventName, function (event) { + _this.flv.emit("mediaSource:".concat(event.type), event); + }); + }); + config.sourceBufferList.events.forEach(function (eventName) { + proxy(_this.mediaSource.sourceBuffers, eventName, function (event) { + _this.flv.emit("sourceBuffers:".concat(event.type), event); + }); + proxy(_this.mediaSource.activeSourceBuffers, eventName, function (event) { + _this.flv.emit("activeSourceBuffers:".concat(event.type), event); + }); + }); + } + }]); + + return CreatMediaSource; + }(); + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + var arrayWithHoles = _arrayWithHoles; + + function _iterableToArrayLimit(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + var iterableToArrayLimit = _iterableToArrayLimit; + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + + var nonIterableRest = _nonIterableRest; + + function _slicedToArray(arr, i) { + return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest(); + } + + var slicedToArray = _slicedToArray; + + function fetchStream(flv, url) { + flv.emit('flvFetchStart'); + fetch(url).then(function (response) { + errorHandle(response.ok && response.status >= 200 && response.status <= 299, "".concat(response.status, " ").concat(response.statusText)); + var contentType = response.headers.get('content-type'); + errorHandle(contentType.includes('x-flv'), 'The resource does not seem to be a flv file'); + return new Response(new ReadableStream({ + start: function start(controller) { + var reader = response.body.getReader(); + flv.on('destroy', function () { + reader.cancel(); + }); + flv.on('readerCancel', function () { + reader.cancel(); + }); + + (function read() { + reader.read().then(function (_ref) { + var done = _ref.done, + value = _ref.value; + + if (done) { + flv.emit('flvFetchEnd'); + controller.close(); + return; + } + + flv.emit('flvFetching', new Uint8Array(value)); + controller.enqueue(value); + read(); + }).catch(function (error) { + throw error; + }); + })(); + }, + cancel: function cancel() { + flv.emit('flvFetchCancel'); + } + })); + }); + } + + function readFile(flv, file) { + flv.emit('flvFetchStart'); + var proxy = flv.events.proxy; + var reader = new FileReader(); + proxy(reader, 'load', function (e) { + var buffer = e.target.result; + var uint8 = new Uint8Array(buffer); + flv.emit('flvFetchEnd', uint8); + }); + reader.readAsArrayBuffer(file); + } + + function parseScripTag(scripTagBody) { + var readScripTag = readUint8(scripTagBody); + var metadata = Object.create(null); + var amf1 = Object.create(null); + var amf2 = Object.create(null); + + var _readScripTag = readScripTag(1); + + var _readScripTag2 = slicedToArray(_readScripTag, 1); + + amf1.type = _readScripTag2[0]; + errorHandle(amf1.type === 2, "AMF: [amf1] type expect 2, but got ".concat(amf1.type)); + amf1.size = getUint8Sum(readScripTag(2)); + amf1.string = bin2String(readScripTag(amf1.size)); + + var _readScripTag3 = readScripTag(1); + + var _readScripTag4 = slicedToArray(_readScripTag3, 1); + + amf2.type = _readScripTag4[0]; + errorHandle(amf2.type === 8, "AMF: [amf1] type expect 8, but got ".concat(amf2.type)); + amf2.size = getUint8Sum(readScripTag(4)); + amf2.metaData = Object.create(null); + + function getValue(type) { + var value = null; + + if (type !== undefined) { + switch (type) { + case 0: + value = bin2Float(readScripTag(8)); + break; + + case 1: + value = bin2Boolean(readScripTag(1)[0]); + break; + + case 2: + { + var valueLength = getUint8Sum(readScripTag(2)); + value = bin2String(readScripTag(valueLength)); + break; + } + + case 3: + { + value = Object.create(null); + var endObject = false; + + while (!endObject && readScripTag.index < scripTagBody.length) { + var nameLength = getUint8Sum(readScripTag(2)); + var name = bin2String(readScripTag(nameLength)); + var _type = readScripTag(1)[0]; + + if (name) { + value[name] = getValue(_type); + } + + if (_type === 9) { + endObject = true; + } + } + + break; + } + + case 8: + { + value = Object.create(null); + var endArray = false; + + while (!endArray && readScripTag.index < scripTagBody.length) { + var _nameLength = getUint8Sum(readScripTag(2)); + + var _name = bin2String(readScripTag(_nameLength)); + + var _type2 = readScripTag(1)[0]; + + if (_name) { + value[_name] = getValue(_type2); + } + + if (_type2 === 9) { + endArray = true; + } + } + + break; + } + + case 10: + { + var _valueLength = getUint8Sum(readScripTag(4)); + + value = []; + + for (var index = 0; index < _valueLength; index += 1) { + var itemType = readScripTag(1)[0]; + value.push(getValue(itemType)); + } + + break; + } + + case 12: + { + var _valueLength2 = getUint8Sum(readScripTag(4)); + + value = bin2String(readScripTag(_valueLength2)); + break; + } + + default: + console.log(readScripTag(scripTagBody.length - readScripTag.index - 1)); + errorHandle(false, "AMF: Unknown metaData type: ".concat(type)); + break; + } + } + + return value; + } + + while (readScripTag.index < scripTagBody.length) { + var nameLength = getUint8Sum(readScripTag(2)); + var name = bin2String(readScripTag(nameLength)); + var type = readScripTag(1)[0]; + + if (name) { + amf2.metaData[name] = getValue(type); + } + } + + errorHandle(readScripTag.index === scripTagBody.length, 'AMF: Seems to be incompletely parsed'); + errorHandle(amf2.size === Object.keys(amf2.metaData).length, 'AMF: [amf2] length does not match'); + metadata.amf1 = amf1; + metadata.amf2 = amf2; + return metadata; + } + + var FlvParse = + /*#__PURE__*/ + function () { + function FlvParse(flv) { + var _this = this; + + classCallCheck(this, FlvParse); + + this.flv = flv; + var _flv$options = flv.options, + url = _flv$options.url, + debug = _flv$options.debug; + this.uint8 = new Uint8Array(0); + this.index = 0; + this.header = null; + this.scripTag = null; + this.tags = []; + this.done = false; + flv.on('flvFetchStart', function () { + if (debug) { + console.log('[flv-fetch-start]', url); + } + }); + flv.on('flvFetchCancel', function () { + if (debug) { + console.log('[flv-fetch-cancel]'); + } + }); + flv.on('flvFetching', function (uint8) { + _this.uint8 = mergeTypedArrays(_this.uint8, uint8); + + _this.parse(); + }); + flv.on('flvFetchEnd', function (uint8) { + if (debug) { + console.log('[flv-fetch-end]'); + } + + _this.done = true; + + if (uint8) { + _this.uint8 = uint8; + _this.index = 0; + _this.header = null; + _this.scripTag = null; + _this.tags = []; + + _this.parse(); + } + + flv.emit('flvParseDone'); + + if (debug) { + console.log('[flv-parse-done]'); + } + }); + + if (typeof url === 'string') { + fetchStream(flv, url); + } else { + readFile(flv, url); + } + } + + createClass(FlvParse, [{ + key: "parse", + value: function parse() { + var debug = this.flv.options.debug; + + if (this.uint8.length >= 13 && !this.header) { + var header = Object.create(null); + header.signature = bin2String(this.read(3)); + + var _this$read = this.read(1); + + var _this$read2 = slicedToArray(_this$read, 1); + + header.version = _this$read2[0]; + + var _this$read3 = this.read(1); + + var _this$read4 = slicedToArray(_this$read3, 1); + + header.flags = _this$read4[0]; + header.headersize = getUint8Sum(this.read(4)); + this.header = header; + this.read(4); + this.flv.emit('flvParseHeader', this.header); + + if (debug) { + console.log('[flv-parse-header]', this.header); + } + } + + while (this.index < this.uint8.length) { + var tag = Object.create(null); + + var _this$read5 = this.read(1); + + var _this$read6 = slicedToArray(_this$read5, 1); + + tag.tagType = _this$read6[0]; + tag.dataSize = getUint8Sum(this.read(3)); + tag.timestamp = this.read(4); + tag.streamID = this.read(3); + tag.body = this.read(tag.dataSize); + this.tags.push(tag); + this.read(4); + + switch (tag.tagType) { + case 18: + this.scripTag = parseScripTag(tag.body); + this.flv.emit('parseScripTag', this.scripTag); + + if (debug) { + console.log('[flv-parse-scrip-tag]', this.scripTag); + } + + break; + + default: + break; + } + + this.flv.emit('flvParseTag', tag); + } + } + }, { + key: "read", + value: function read(length) { + var tempUint8 = new Uint8Array(length); + + for (var i = 0; i < length; i += 1) { + tempUint8[i] = this.uint8[this.index]; + this.index += 1; + } + + return tempUint8; + } + }]); + + return FlvParse; + }(); + + var id = 0; var Flv = /*#__PURE__*/ function (_Emitter) { inherits(Flv, _Emitter); - function Flv(mediaElement, url) { + function Flv(options) { var _this; classCallCheck(this, Flv); _this = possibleConstructorReturn(this, getPrototypeOf(Flv).call(this)); - _this.mediaElement = mediaElement; - _this.url = url; - _this.support = new CheckSupport(assertThisInitialized(assertThisInitialized(_this))); + _this.options = Object.assign({}, Flv.DEFAULTS, options); + checkSupport(_this.options); + _this.events = new EventProxy(assertThisInitialized(assertThisInitialized(_this))); + _this.workers = new CreatWorker(assertThisInitialized(assertThisInitialized(_this))); _this.mediaSource = new CreatMediaSource(assertThisInitialized(assertThisInitialized(_this))); + _this.flvData = new FlvParse(assertThisInitialized(assertThisInitialized(_this))); + id += 1; + _this.id = id; + Flv.instances.push(assertThisInitialized(assertThisInitialized(_this))); return _this; } createClass(Flv, [{ - key: "load", - value: function load() { - console.log(this); - } - }, { key: "destroy", value: function destroy() { - console.log(this); + this.events.destroy(); + this.workers.killAll(); + Flv.instances.splice(Flv.instances.indexOf(this), 1); + this.emit('destroy'); + } + }], [{ + key: "DEFAULTS", + get: function get() { + return { + mediaElement: '', + url: '', + debug: false + }; + } + }, { + key: "version", + get: function get() { + return '1.0.6'; + } + }, { + key: "config", + get: function get() { + return config; + } + }, { + key: "utils", + get: function get() { + return utils; } }]); return Flv; }(tinyEmitter); + Object.defineProperty(Flv, 'instances', { + value: [] + }); window.Flv = Flv; - function artplayerPluginFlv(art) { - var flv = null; - art.on('destroy', function () { - if (flv) { - flv.destroy(); - } - }); - return { - flv: flv, - init: function init(mediaElement, url) { - flv = new Flv(mediaElement, url); - flv.load(); - } - }; - } - - window.artplayerPluginFlv = artplayerPluginFlv; - - exports.default = artplayerPluginFlv; + exports.default = Flv; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/docs/uncompiled/artplayer-plugin-flv.js.map b/docs/uncompiled/artplayer-plugin-flv.js.map index 2aba2e3b5..629605324 100644 --- a/docs/uncompiled/artplayer-plugin-flv.js.map +++ b/docs/uncompiled/artplayer-plugin-flv.js.map @@ -1 +1 @@ -{"version":3,"file":"artplayer-plugin-flv.js","sources":["../../node_modules/@babel/runtime/helpers/classCallCheck.js","../../node_modules/@babel/runtime/helpers/createClass.js","../../node_modules/@babel/runtime/helpers/typeof.js","../../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../../node_modules/@babel/runtime/helpers/inherits.js","../../packages/artplayer-plugin-flv/node_modules/tiny-emitter/index.js","../../node_modules/@babel/runtime/helpers/isNativeFunction.js","../../node_modules/@babel/runtime/helpers/construct.js","../../node_modules/@babel/runtime/helpers/wrapNativeSuper.js","../../packages/artplayer-plugin-flv/src/flv/utils.js","../../packages/artplayer-plugin-flv/src/flv/checkSupport.js","../../packages/artplayer-plugin-flv/src/flv/creatMediaSource.js","../../packages/artplayer-plugin-flv/src/flv/index.js","../../packages/artplayer-plugin-flv/src/index.js"],"sourcesContent":["function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","function _typeof2(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;","var _typeof = require(\"../helpers/typeof\");\n\nvar assertThisInitialized = require(\"./assertThisInitialized\");\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;","function _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;","function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\n","function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\n\nmodule.exports = _isNativeFunction;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n module.exports = _construct = Reflect.construct;\n } else {\n module.exports = _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\n\nmodule.exports = _construct;","var getPrototypeOf = require(\"./getPrototypeOf\");\n\nvar setPrototypeOf = require(\"./setPrototypeOf\");\n\nvar isNativeFunction = require(\"./isNativeFunction\");\n\nvar construct = require(\"./construct\");\n\nfunction _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}\n\nmodule.exports = _wrapNativeSuper;","export class FlvError extends Error {\n constructor(message, context) {\n super(message);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, context || this.constructor);\n }\n this.name = 'FlvError';\n }\n}\n\nexport function errorHandle(condition, msg) {\n if (!condition) {\n throw new FlvError(msg);\n }\n}","import { errorHandle } from './utils';\n\nexport default class CheckSupport {\n constructor() {\n const MP4H264MimeCodec = 'video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"';\n const videoElement = window.document.createElement('video');\n const canPlay = videoElement.canPlayType(MP4H264MimeCodec);\n errorHandle(\n window.MediaSource &&\n window.MediaSource.isTypeSupported(MP4H264MimeCodec) &&\n (canPlay === 'probably' || canPlay === 'maybe'),\n `Unsupported MIME type or codec: ${MP4H264MimeCodec}`,\n );\n errorHandle(typeof window.Promise === 'function', \"Unsupported 'Promise' method\");\n errorHandle(typeof window.fetch === 'function', \"Unsupported 'fetch' method\");\n }\n}\n","export default class CreatMediaSource {\n constructor(flv) {\n this.mediaSource = new MediaSource();\n this.url = URL.createObjectURL(this.mediaSource);\n flv.mediaElement.src = this.url;\n }\n}","import Emitter from 'tiny-emitter';\nimport CheckSupport from './checkSupport';\nimport CreatMediaSource from './creatMediaSource';\n\nclass Flv extends Emitter {\n constructor(mediaElement, url) {\n super();\n this.mediaElement = mediaElement;\n this.url = url;\n this.support = new CheckSupport(this);\n this.mediaSource = new CreatMediaSource(this);\n }\n\n load() {\n console.log(this);\n }\n\n destroy() {\n console.log(this);\n }\n}\n\nwindow.Flv = Flv;\nexport default Flv;\n","import Flv from './flv';\n\nfunction artplayerPluginFlv(art) {\n let flv = null;\n\n art.on('destroy', () => {\n if (flv) {\n flv.destroy();\n }\n });\n\n return {\n flv,\n init: (mediaElement, url) => {\n flv = new Flv(mediaElement, url);\n flv.load();\n },\n };\n}\n\nwindow.artplayerPluginFlv = artplayerPluginFlv;\nexport default artplayerPluginFlv;\n"],"names":["_typeof","E","prototype","on","name","callback","ctx","e","push","fn","once","self","listener","off","apply","arguments","_","emit","data","slice","call","evtArr","i","len","length","evts","liveEvents","FlvError","message","context","Error","captureStackTrace","constructor","errorHandle","condition","msg","CheckSupport","MP4H264MimeCodec","videoElement","window","document","createElement","canPlay","canPlayType","MediaSource","isTypeSupported","Promise","fetch","CreatMediaSource","flv","mediaSource","url","URL","createObjectURL","mediaElement","src","Flv","support","console","log","Emitter","artplayerPluginFlv","art","destroy","init","load"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"artplayer-plugin-flv.js","sources":["../../node_modules/@babel/runtime/helpers/classCallCheck.js","../../node_modules/@babel/runtime/helpers/createClass.js","../../node_modules/@babel/runtime/helpers/typeof.js","../../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../../node_modules/@babel/runtime/helpers/inherits.js","../../packages/artplayer-plugin-flv/node_modules/tiny-emitter/index.js","../../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js","../../node_modules/@babel/runtime/helpers/iterableToArray.js","../../node_modules/@babel/runtime/helpers/nonIterableSpread.js","../../node_modules/@babel/runtime/helpers/toConsumableArray.js","../../node_modules/@babel/runtime/helpers/isNativeFunction.js","../../node_modules/@babel/runtime/helpers/construct.js","../../node_modules/@babel/runtime/helpers/wrapNativeSuper.js","../../packages/artplayer-plugin-flv/src/utils/flvError.js","../../packages/artplayer-plugin-flv/src/utils/index.js","../../packages/artplayer-plugin-flv/src/utils/checkSupport.js","../../packages/artplayer-plugin-flv/src/eventProxy.js","../../packages/artplayer-plugin-flv/src/creatWorker.js","../../packages/artplayer-plugin-flv/src/config.js","../../packages/artplayer-plugin-flv/src/creatMediaSource.js","../../node_modules/@babel/runtime/helpers/arrayWithHoles.js","../../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","../../node_modules/@babel/runtime/helpers/nonIterableRest.js","../../node_modules/@babel/runtime/helpers/slicedToArray.js","../../packages/artplayer-plugin-flv/src/flvParse/fetchStream.js","../../packages/artplayer-plugin-flv/src/flvParse/readFile.js","../../packages/artplayer-plugin-flv/src/flvParse/parseScripTag.js","../../packages/artplayer-plugin-flv/src/flvParse/index.js","../../packages/artplayer-plugin-flv/src/index.js"],"sourcesContent":["function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","function _typeof2(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;","var _typeof = require(\"../helpers/typeof\");\n\nvar assertThisInitialized = require(\"./assertThisInitialized\");\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;","function _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;","function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\n","function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n }\n}\n\nmodule.exports = _arrayWithoutHoles;","function _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nmodule.exports = _iterableToArray;","function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nmodule.exports = _nonIterableSpread;","var arrayWithoutHoles = require(\"./arrayWithoutHoles\");\n\nvar iterableToArray = require(\"./iterableToArray\");\n\nvar nonIterableSpread = require(\"./nonIterableSpread\");\n\nfunction _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();\n}\n\nmodule.exports = _toConsumableArray;","function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\n\nmodule.exports = _isNativeFunction;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n module.exports = _construct = Reflect.construct;\n } else {\n module.exports = _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\n\nmodule.exports = _construct;","var getPrototypeOf = require(\"./getPrototypeOf\");\n\nvar setPrototypeOf = require(\"./setPrototypeOf\");\n\nvar isNativeFunction = require(\"./isNativeFunction\");\n\nvar construct = require(\"./construct\");\n\nfunction _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}\n\nmodule.exports = _wrapNativeSuper;","export default class FlvError extends Error {\n constructor(message, context) {\n super(message);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, context || this.constructor);\n }\n this.name = 'FlvError';\n }\n} ","import FlvError from './flvError';\n\nexport function errorHandle(condition, msg) {\n if (!condition) {\n throw new FlvError(msg);\n }\n}\n\nexport function mergeTypedArrays(a, b) {\n const c = new a.constructor(a.length + b.length);\n c.set(a);\n c.set(b, a.length);\n return c;\n}\n\nexport function sleep(ms = 0) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport function getUint8Sum(arr) {\n return arr.reduce((totle, num, index) => totle + num * 256 ** (arr.length - index - 1), 0);\n}\n\nexport function string2Bin(str) {\n const result = [];\n for (let i = 0; i < str.length; i += 1) {\n result.push(Number(str.charCodeAt(i).toString(10)));\n }\n return result;\n}\n\nexport function bin2String(array) {\n return String.fromCharCode.call(String, ...array);\n}\n\nexport function bin2Float(array) {\n const view = new DataView(new ArrayBuffer(array.length));\n array.forEach((b, i) => {\n view.setUint8(i, b);\n });\n return view.getFloat64(0);\n}\n\nexport function bin2Boolean(bin) {\n return bin === 1;\n}\n\nexport function log(name, msg = '') {\n console.log(`[${name}] ${msg}`);\n}\n\nexport function readUint8(uint8) {\n let index = 0;\n return function read(length) {\n const tempUint8 = new Uint8Array(length);\n for (let i = 0; i < length; i += 1) {\n tempUint8[i] = uint8[index];\n index += 1;\n }\n read.index = index;\n return tempUint8;\n };\n}\n","import { errorHandle } from '.';\n\nexport default function checkSupport(options) {\n const { mediaElement, url } = options;\n errorHandle(mediaElement instanceof HTMLVideoElement, 'The first parameter is not a video tag element');\n errorHandle(\n typeof url === 'string' || (url instanceof File && url.type === 'video/x-flv'),\n 'The second parameter is not a string type or flv file',\n );\n\n const MP4H264MimeCodec = 'video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"';\n const canPlay = mediaElement.canPlayType(MP4H264MimeCodec);\n errorHandle(\n window.MediaSource &&\n window.MediaSource.isTypeSupported(MP4H264MimeCodec) &&\n (canPlay === 'probably' || canPlay === 'maybe'),\n `Unsupported MIME type or codec: ${MP4H264MimeCodec}`,\n );\n\n errorHandle(typeof window.Promise === 'function', \"Unsupported 'Promise' method\");\n errorHandle(typeof window.fetch === 'function', \"Unsupported 'fetch' method\");\n errorHandle(typeof window.Worker === 'function', \"Unsupported 'Worker' method\");\n errorHandle(typeof window.ReadableStream === 'function', \"Unsupported 'ReadableStream' method\");\n}\n","export default class EventProxy {\n constructor() {\n this.destroyEvents = [];\n this.proxy = this.proxy.bind(this);\n }\n\n proxy(target, name, callback, option = {}) {\n target.addEventListener(name, callback, option);\n this.destroyEvents.push(() => {\n target.removeEventListener(name, callback, option);\n });\n }\n\n destroy() {\n this.destroyEvents.forEach(event => event());\n }\n}","export default class CreatWorker {\n constructor() {\n this.workers = new Map();\n }\n\n static fnToStr(fn) {\n return `\n self.onmessage = event => {\n return self.postMessage((${fn}).apply(null, event.data));\n }\n `;\n }\n\n static create(fn) {\n const blob = new Blob([CreatWorker.fnToStr(fn)], {\n type: 'application/javascript',\n });\n const objectURL = window.URL.createObjectURL(blob);\n const worker = new Worker(objectURL);\n worker.kill = () => {\n URL.revokeObjectURL(objectURL);\n worker.terminate();\n };\n worker.post = args =>\n new Promise((resolve, reject) => {\n worker.onmessage = event => {\n resolve(event.data);\n };\n worker.onerror = error => {\n reject(error);\n };\n worker.postMessage(args);\n });\n return worker;\n }\n\n add(name, fn) {\n if (!this.workers.has(name)) {\n this.workers.set(name, CreatWorker.create(fn));\n }\n }\n\n run(name, ...args) {\n const worker = this.workers.get(name);\n return worker.post(args);\n }\n\n kill(name) {\n const worker = this.workers.get(name);\n worker.kill();\n }\n\n killAll() {\n this.workers.forEach(worker => {\n worker.kill();\n });\n }\n}\n","export default {\n mediaSource: {\n propertys: [\n 'activeSourceBuffers',\n 'duration',\n 'readyState',\n 'sourceBuffers',\n ],\n methods: [\n 'addSourceBuffer',\n 'endOfStream',\n 'removeSourceBuffer',\n 'clearLiveSeekableRange',\n 'setLiveSeekableRange',\n ],\n events: [\n 'sourceclose',\n 'sourceended',\n 'sourceopen',\n ],\n },\n sourceBuffer: {\n propertys: [\n 'mode',\n 'updating',\n 'buffered',\n 'timestampOffset',\n 'audioTracks',\n 'videoTracks',\n 'textTracks',\n 'appendWindowStart',\n 'appendWindowEnd',\n 'trackDefaults',\n ],\n methods: [\n 'appendBuffer',\n 'appendStream',\n 'abort',\n 'remove',\n ],\n events: [\n 'abort',\n 'error',\n 'update',\n 'updateend',\n 'updatestart',\n ],\n },\n sourceBufferList: {\n propertys: [\n 'length',\n ],\n events: [\n 'addsourcebuffer',\n 'removesourcebuffer',\n ],\n },\n};\n","import config from './config';\n\nexport default class CreatMediaSource {\n constructor(flv) {\n this.flv = flv;\n this.creatUrl();\n this.eventBind();\n }\n\n creatUrl() {\n const {\n options: { mediaElement },\n events: { destroyEvents },\n } = this.flv;\n this.mediaSource = new MediaSource();\n const url = URL.createObjectURL(this.mediaSource);\n destroyEvents.push(() => {\n URL.revokeObjectURL(url);\n });\n mediaElement.src = url;\n }\n\n eventBind() {\n const {\n events: { proxy },\n } = this.flv;\n\n config.mediaSource.events.forEach(eventName => {\n proxy(this.mediaSource, eventName, event => {\n this.flv.emit(`mediaSource:${event.type}`, event);\n });\n });\n\n config.sourceBufferList.events.forEach(eventName => {\n proxy(this.mediaSource.sourceBuffers, eventName, event => {\n this.flv.emit(`sourceBuffers:${event.type}`, event);\n });\n proxy(this.mediaSource.activeSourceBuffers, eventName, event => {\n this.flv.emit(`activeSourceBuffers:${event.type}`, event);\n });\n });\n }\n}\n","function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","function _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nmodule.exports = _nonIterableRest;","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","import { errorHandle } from '../utils';\n\nexport default function fetchStream(flv, url) {\n flv.emit('flvFetchStart');\n fetch(url).then(response => {\n errorHandle(\n response.ok && response.status >= 200 && response.status <= 299,\n `${response.status} ${response.statusText}`,\n );\n const contentType = response.headers.get('content-type');\n errorHandle(contentType.includes('x-flv'), 'The resource does not seem to be a flv file');\n return new Response(\n new ReadableStream({\n start(controller) {\n const reader = response.body.getReader();\n\n flv.on('destroy', () => {\n reader.cancel();\n });\n\n flv.on('readerCancel', () => {\n reader.cancel();\n });\n\n (function read() {\n reader\n .read()\n .then(({ done, value }) => {\n if (done) {\n flv.emit('flvFetchEnd');\n controller.close();\n return;\n }\n flv.emit('flvFetching', new Uint8Array(value));\n controller.enqueue(value);\n read();\n })\n .catch(error => {\n throw error;\n });\n })();\n },\n cancel() {\n flv.emit('flvFetchCancel');\n },\n }),\n );\n });\n}\n","export default function readFile(flv, file) {\n flv.emit('flvFetchStart');\n const { proxy } = flv.events;\n const reader = new FileReader();\n proxy(reader, 'load', e => {\n const buffer = e.target.result;\n const uint8 = new Uint8Array(buffer);\n flv.emit('flvFetchEnd', uint8);\n });\n reader.readAsArrayBuffer(file);\n}\n","import { getUint8Sum, readUint8, bin2String, bin2Boolean, bin2Float, errorHandle } from '../utils';\n\nexport default function parseScripTag(scripTagBody) {\n const readScripTag = readUint8(scripTagBody);\n const metadata = Object.create(null);\n const amf1 = Object.create(null);\n const amf2 = Object.create(null);\n\n [amf1.type] = readScripTag(1);\n errorHandle(amf1.type === 2, `AMF: [amf1] type expect 2, but got ${amf1.type}`);\n amf1.size = getUint8Sum(readScripTag(2));\n amf1.string = bin2String(readScripTag(amf1.size));\n\n [amf2.type] = readScripTag(1);\n errorHandle(amf2.type === 8, `AMF: [amf1] type expect 8, but got ${amf2.type}`);\n amf2.size = getUint8Sum(readScripTag(4));\n amf2.metaData = Object.create(null);\n\n function getValue(type) {\n let value = null;\n if (type !== undefined) {\n switch (type) {\n case 0:\n value = bin2Float(readScripTag(8));\n break;\n case 1:\n value = bin2Boolean(readScripTag(1)[0]);\n break;\n case 2: {\n const valueLength = getUint8Sum(readScripTag(2));\n value = bin2String(readScripTag(valueLength));\n break;\n }\n case 3: {\n value = Object.create(null);\n let endObject = false;\n while (!endObject && readScripTag.index < scripTagBody.length) {\n const nameLength = getUint8Sum(readScripTag(2));\n const name = bin2String(readScripTag(nameLength));\n const type = readScripTag(1)[0];\n if (name) {\n value[name] = getValue(type);\n }\n if (type === 9) {\n endObject = true;\n }\n }\n break;\n }\n case 8: {\n value = Object.create(null);\n let endArray = false;\n while (!endArray && readScripTag.index < scripTagBody.length) {\n const nameLength = getUint8Sum(readScripTag(2));\n const name = bin2String(readScripTag(nameLength));\n const type = readScripTag(1)[0];\n if (name) {\n value[name] = getValue(type);\n }\n if (type === 9) {\n endArray = true;\n }\n }\n break;\n }\n case 10: {\n const valueLength = getUint8Sum(readScripTag(4));\n value = [];\n for (let index = 0; index < valueLength; index += 1) {\n const itemType = readScripTag(1)[0];\n value.push(getValue(itemType));\n }\n break;\n }\n case 12: {\n const valueLength = getUint8Sum(readScripTag(4));\n value = bin2String(readScripTag(valueLength));\n break;\n }\n default:\n console.log(readScripTag(scripTagBody.length - readScripTag.index - 1));\n errorHandle(false, `AMF: Unknown metaData type: ${type}`);\n break;\n }\n }\n return value;\n }\n\n while (readScripTag.index < scripTagBody.length) {\n const nameLength = getUint8Sum(readScripTag(2));\n const name = bin2String(readScripTag(nameLength));\n const type = readScripTag(1)[0];\n if (name) {\n amf2.metaData[name] = getValue(type);\n }\n }\n\n errorHandle(readScripTag.index === scripTagBody.length, 'AMF: Seems to be incompletely parsed');\n errorHandle(amf2.size === Object.keys(amf2.metaData).length, 'AMF: [amf2] length does not match');\n\n metadata.amf1 = amf1;\n metadata.amf2 = amf2;\n return metadata;\n}\n","import fetchStream from './fetchStream';\nimport readFile from './readFile';\nimport parseScripTag from './parseScripTag';\nimport { mergeTypedArrays, getUint8Sum, bin2String } from '../utils';\n\nexport default class FlvParse {\n constructor(flv) {\n this.flv = flv;\n const { url, debug } = flv.options;\n this.uint8 = new Uint8Array(0);\n this.index = 0;\n this.header = null;\n this.scripTag = null;\n this.tags = [];\n this.done = false;\n\n flv.on('flvFetchStart', () => {\n if (debug) {\n console.log('[flv-fetch-start]', url);\n }\n });\n\n flv.on('flvFetchCancel', () => {\n if (debug) {\n console.log('[flv-fetch-cancel]');\n }\n });\n\n flv.on('flvFetching', uint8 => {\n this.uint8 = mergeTypedArrays(this.uint8, uint8);\n this.parse();\n });\n\n flv.on('flvFetchEnd', uint8 => {\n if (debug) {\n console.log('[flv-fetch-end]');\n }\n this.done = true;\n if (uint8) {\n this.uint8 = uint8;\n this.index = 0;\n this.header = null;\n this.scripTag = null;\n this.tags = [];\n this.parse();\n }\n flv.emit('flvParseDone');\n if (debug) {\n console.log('[flv-parse-done]');\n }\n });\n\n if (typeof url === 'string') {\n fetchStream(flv, url);\n } else {\n readFile(flv, url);\n }\n }\n\n parse() {\n const { debug } = this.flv.options;\n if (this.uint8.length >= 13 && !this.header) {\n const header = Object.create(null);\n header.signature = bin2String(this.read(3));\n [header.version] = this.read(1);\n [header.flags] = this.read(1);\n header.headersize = getUint8Sum(this.read(4));\n this.header = header;\n this.read(4);\n this.flv.emit('flvParseHeader', this.header);\n if (debug) {\n console.log('[flv-parse-header]', this.header);\n }\n }\n\n while (this.index < this.uint8.length) {\n const tag = Object.create(null);\n [tag.tagType] = this.read(1);\n tag.dataSize = getUint8Sum(this.read(3));\n tag.timestamp = this.read(4);\n tag.streamID = this.read(3);\n tag.body = this.read(tag.dataSize);\n this.tags.push(tag);\n this.read(4);\n\n switch (tag.tagType) {\n case 18:\n this.scripTag = parseScripTag(tag.body);\n this.flv.emit('parseScripTag', this.scripTag);\n if (debug) {\n console.log('[flv-parse-scrip-tag]', this.scripTag);\n }\n break;\n default:\n break;\n }\n\n this.flv.emit('flvParseTag', tag);\n }\n }\n\n read(length) {\n const tempUint8 = new Uint8Array(length);\n for (let i = 0; i < length; i += 1) {\n tempUint8[i] = this.uint8[this.index];\n this.index += 1;\n }\n return tempUint8;\n }\n}\n","import Emitter from 'tiny-emitter';\nimport checkSupport from './utils/checkSupport';\nimport EventProxy from './eventProxy';\nimport CreatWorker from './creatWorker';\nimport CreatMediaSource from './creatMediaSource';\nimport FlvParse from './flvParse';\nimport * as utils from './utils';\nimport config from './config';\n\nlet id = 0;\nclass Flv extends Emitter {\n constructor(options) {\n super();\n this.options = Object.assign({}, Flv.DEFAULTS, options);\n checkSupport(this.options);\n this.events = new EventProxy(this);\n this.workers = new CreatWorker(this);\n this.mediaSource = new CreatMediaSource(this);\n this.flvData = new FlvParse(this);\n id += 1;\n this.id = id;\n Flv.instances.push(this);\n }\n\n static get DEFAULTS() {\n return {\n mediaElement: '',\n url: '',\n debug: false,\n };\n }\n\n static get version() {\n return '__VERSION__';\n }\n\n static get config() {\n return config;\n }\n\n static get utils() {\n return utils;\n }\n\n destroy() {\n this.events.destroy();\n this.workers.killAll();\n Flv.instances.splice(Flv.instances.indexOf(this), 1);\n this.emit('destroy');\n }\n}\n\nObject.defineProperty(Flv, 'instances', {\n value: [],\n});\n\nwindow.Flv = Flv;\nexport default Flv;\n"],"names":["_typeof","E","prototype","on","name","callback","ctx","e","push","fn","once","self","listener","off","apply","arguments","_","emit","data","slice","call","evtArr","i","len","length","evts","liveEvents","FlvError","message","context","Error","captureStackTrace","constructor","errorHandle","condition","msg","mergeTypedArrays","a","b","c","set","sleep","ms","Promise","resolve","setTimeout","getUint8Sum","arr","reduce","totle","num","index","string2Bin","str","result","Number","charCodeAt","toString","bin2String","array","String","fromCharCode","bin2Float","view","DataView","ArrayBuffer","forEach","setUint8","getFloat64","bin2Boolean","bin","log","console","readUint8","uint8","read","tempUint8","Uint8Array","checkSupport","options","mediaElement","url","HTMLVideoElement","File","type","MP4H264MimeCodec","canPlay","canPlayType","window","MediaSource","isTypeSupported","fetch","Worker","ReadableStream","EventProxy","destroyEvents","proxy","bind","target","option","addEventListener","removeEventListener","event","CreatWorker","workers","Map","has","create","worker","get","args","post","kill","blob","Blob","fnToStr","objectURL","URL","createObjectURL","revokeObjectURL","terminate","reject","onmessage","onerror","error","postMessage","mediaSource","propertys","methods","events","sourceBuffer","sourceBufferList","CreatMediaSource","flv","creatUrl","eventBind","src","config","eventName","sourceBuffers","activeSourceBuffers","fetchStream","then","response","ok","status","statusText","contentType","headers","includes","Response","start","controller","reader","body","getReader","cancel","done","value","close","enqueue","catch","readFile","file","FileReader","buffer","readAsArrayBuffer","parseScripTag","scripTagBody","readScripTag","metadata","Object","amf1","amf2","size","string","metaData","getValue","undefined","valueLength","endObject","nameLength","endArray","itemType","keys","FlvParse","debug","header","scripTag","tags","parse","signature","version","flags","headersize","tag","tagType","dataSize","timestamp","streamID","id","Flv","assign","DEFAULTS","flvData","instances","destroy","killAll","splice","indexOf","utils","Emitter","defineProperty"],"mappings":"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"} \ No newline at end of file diff --git a/packages/artplayer-plugin-flv/src/config.js b/packages/artplayer-plugin-flv/src/config.js new file mode 100644 index 000000000..901998bf5 --- /dev/null +++ b/packages/artplayer-plugin-flv/src/config.js @@ -0,0 +1,58 @@ +export default { + mediaSource: { + propertys: [ + 'activeSourceBuffers', + 'duration', + 'readyState', + 'sourceBuffers', + ], + methods: [ + 'addSourceBuffer', + 'endOfStream', + 'removeSourceBuffer', + 'clearLiveSeekableRange', + 'setLiveSeekableRange', + ], + events: [ + 'sourceclose', + 'sourceended', + 'sourceopen', + ], + }, + sourceBuffer: { + propertys: [ + 'mode', + 'updating', + 'buffered', + 'timestampOffset', + 'audioTracks', + 'videoTracks', + 'textTracks', + 'appendWindowStart', + 'appendWindowEnd', + 'trackDefaults', + ], + methods: [ + 'appendBuffer', + 'appendStream', + 'abort', + 'remove', + ], + events: [ + 'abort', + 'error', + 'update', + 'updateend', + 'updatestart', + ], + }, + sourceBufferList: { + propertys: [ + 'length', + ], + events: [ + 'addsourcebuffer', + 'removesourcebuffer', + ], + }, +}; diff --git a/packages/artplayer-plugin-flv/src/creatMediaSource.js b/packages/artplayer-plugin-flv/src/creatMediaSource.js new file mode 100644 index 000000000..d04c53314 --- /dev/null +++ b/packages/artplayer-plugin-flv/src/creatMediaSource.js @@ -0,0 +1,43 @@ +import config from './config'; + +export default class CreatMediaSource { + constructor(flv) { + this.flv = flv; + this.creatUrl(); + this.eventBind(); + } + + creatUrl() { + const { + options: { mediaElement }, + events: { destroyEvents }, + } = this.flv; + this.mediaSource = new MediaSource(); + const url = URL.createObjectURL(this.mediaSource); + destroyEvents.push(() => { + URL.revokeObjectURL(url); + }); + mediaElement.src = url; + } + + eventBind() { + const { + events: { proxy }, + } = this.flv; + + config.mediaSource.events.forEach(eventName => { + proxy(this.mediaSource, eventName, event => { + this.flv.emit(`mediaSource:${event.type}`, event); + }); + }); + + config.sourceBufferList.events.forEach(eventName => { + proxy(this.mediaSource.sourceBuffers, eventName, event => { + this.flv.emit(`sourceBuffers:${event.type}`, event); + }); + proxy(this.mediaSource.activeSourceBuffers, eventName, event => { + this.flv.emit(`activeSourceBuffers:${event.type}`, event); + }); + }); + } +} diff --git a/packages/artplayer-plugin-flv/src/creatWorker.js b/packages/artplayer-plugin-flv/src/creatWorker.js new file mode 100644 index 000000000..3593c5ee3 --- /dev/null +++ b/packages/artplayer-plugin-flv/src/creatWorker.js @@ -0,0 +1,58 @@ +export default class CreatWorker { + constructor() { + this.workers = new Map(); + } + + static fnToStr(fn) { + return ` + self.onmessage = event => { + return self.postMessage((${fn}).apply(null, event.data)); + } + `; + } + + static create(fn) { + const blob = new Blob([CreatWorker.fnToStr(fn)], { + type: 'application/javascript', + }); + const objectURL = window.URL.createObjectURL(blob); + const worker = new Worker(objectURL); + worker.kill = () => { + URL.revokeObjectURL(objectURL); + worker.terminate(); + }; + worker.post = args => + new Promise((resolve, reject) => { + worker.onmessage = event => { + resolve(event.data); + }; + worker.onerror = error => { + reject(error); + }; + worker.postMessage(args); + }); + return worker; + } + + add(name, fn) { + if (!this.workers.has(name)) { + this.workers.set(name, CreatWorker.create(fn)); + } + } + + run(name, ...args) { + const worker = this.workers.get(name); + return worker.post(args); + } + + kill(name) { + const worker = this.workers.get(name); + worker.kill(); + } + + killAll() { + this.workers.forEach(worker => { + worker.kill(); + }); + } +} diff --git a/packages/artplayer-plugin-flv/src/eventProxy.js b/packages/artplayer-plugin-flv/src/eventProxy.js new file mode 100644 index 000000000..cc5fbfb75 --- /dev/null +++ b/packages/artplayer-plugin-flv/src/eventProxy.js @@ -0,0 +1,17 @@ +export default class EventProxy { + constructor() { + this.destroyEvents = []; + this.proxy = this.proxy.bind(this); + } + + proxy(target, name, callback, option = {}) { + target.addEventListener(name, callback, option); + this.destroyEvents.push(() => { + target.removeEventListener(name, callback, option); + }); + } + + destroy() { + this.destroyEvents.forEach(event => event()); + } +} \ No newline at end of file diff --git a/packages/artplayer-plugin-flv/src/flv/checkSupport.js b/packages/artplayer-plugin-flv/src/flv/checkSupport.js deleted file mode 100644 index 0a1189e26..000000000 --- a/packages/artplayer-plugin-flv/src/flv/checkSupport.js +++ /dev/null @@ -1,17 +0,0 @@ -import { errorHandle } from './utils'; - -export default class CheckSupport { - constructor() { - const MP4H264MimeCodec = 'video/mp4; codecs="avc1.42001E, mp4a.40.2"'; - const videoElement = window.document.createElement('video'); - const canPlay = videoElement.canPlayType(MP4H264MimeCodec); - errorHandle( - window.MediaSource && - window.MediaSource.isTypeSupported(MP4H264MimeCodec) && - (canPlay === 'probably' || canPlay === 'maybe'), - `Unsupported MIME type or codec: ${MP4H264MimeCodec}`, - ); - errorHandle(typeof window.Promise === 'function', "Unsupported 'Promise' method"); - errorHandle(typeof window.fetch === 'function', "Unsupported 'fetch' method"); - } -} diff --git a/packages/artplayer-plugin-flv/src/flv/creatMediaSource.js b/packages/artplayer-plugin-flv/src/flv/creatMediaSource.js deleted file mode 100644 index ef2b77ec1..000000000 --- a/packages/artplayer-plugin-flv/src/flv/creatMediaSource.js +++ /dev/null @@ -1,7 +0,0 @@ -export default class CreatMediaSource { - constructor(flv) { - this.mediaSource = new MediaSource(); - this.url = URL.createObjectURL(this.mediaSource); - flv.mediaElement.src = this.url; - } -} \ No newline at end of file diff --git a/packages/artplayer-plugin-flv/src/flv/index.js b/packages/artplayer-plugin-flv/src/flv/index.js deleted file mode 100644 index a4481c772..000000000 --- a/packages/artplayer-plugin-flv/src/flv/index.js +++ /dev/null @@ -1,24 +0,0 @@ -import Emitter from 'tiny-emitter'; -import CheckSupport from './checkSupport'; -import CreatMediaSource from './creatMediaSource'; - -class Flv extends Emitter { - constructor(mediaElement, url) { - super(); - this.mediaElement = mediaElement; - this.url = url; - this.support = new CheckSupport(this); - this.mediaSource = new CreatMediaSource(this); - } - - load() { - console.log(this); - } - - destroy() { - console.log(this); - } -} - -window.Flv = Flv; -export default Flv; diff --git a/packages/artplayer-plugin-flv/src/flvParse/fetchStream.js b/packages/artplayer-plugin-flv/src/flvParse/fetchStream.js new file mode 100644 index 000000000..1853d7ae8 --- /dev/null +++ b/packages/artplayer-plugin-flv/src/flvParse/fetchStream.js @@ -0,0 +1,49 @@ +import { errorHandle } from '../utils'; + +export default function fetchStream(flv, url) { + flv.emit('flvFetchStart'); + fetch(url).then(response => { + errorHandle( + response.ok && response.status >= 200 && response.status <= 299, + `${response.status} ${response.statusText}`, + ); + const contentType = response.headers.get('content-type'); + errorHandle(contentType.includes('x-flv'), 'The resource does not seem to be a flv file'); + return new Response( + new ReadableStream({ + start(controller) { + const reader = response.body.getReader(); + + flv.on('destroy', () => { + reader.cancel(); + }); + + flv.on('readerCancel', () => { + reader.cancel(); + }); + + (function read() { + reader + .read() + .then(({ done, value }) => { + if (done) { + flv.emit('flvFetchEnd'); + controller.close(); + return; + } + flv.emit('flvFetching', new Uint8Array(value)); + controller.enqueue(value); + read(); + }) + .catch(error => { + throw error; + }); + })(); + }, + cancel() { + flv.emit('flvFetchCancel'); + }, + }), + ); + }); +} diff --git a/packages/artplayer-plugin-flv/src/flvParse/index.js b/packages/artplayer-plugin-flv/src/flvParse/index.js new file mode 100644 index 000000000..a4267816b --- /dev/null +++ b/packages/artplayer-plugin-flv/src/flvParse/index.js @@ -0,0 +1,110 @@ +import fetchStream from './fetchStream'; +import readFile from './readFile'; +import parseScripTag from './parseScripTag'; +import { mergeTypedArrays, getUint8Sum, bin2String } from '../utils'; + +export default class FlvParse { + constructor(flv) { + this.flv = flv; + const { url, debug } = flv.options; + this.uint8 = new Uint8Array(0); + this.index = 0; + this.header = null; + this.scripTag = null; + this.tags = []; + this.done = false; + + flv.on('flvFetchStart', () => { + if (debug) { + console.log('[flv-fetch-start]', url); + } + }); + + flv.on('flvFetchCancel', () => { + if (debug) { + console.log('[flv-fetch-cancel]'); + } + }); + + flv.on('flvFetching', uint8 => { + this.uint8 = mergeTypedArrays(this.uint8, uint8); + this.parse(); + }); + + flv.on('flvFetchEnd', uint8 => { + if (debug) { + console.log('[flv-fetch-end]'); + } + this.done = true; + if (uint8) { + this.uint8 = uint8; + this.index = 0; + this.header = null; + this.scripTag = null; + this.tags = []; + this.parse(); + } + flv.emit('flvParseDone'); + if (debug) { + console.log('[flv-parse-done]'); + } + }); + + if (typeof url === 'string') { + fetchStream(flv, url); + } else { + readFile(flv, url); + } + } + + parse() { + const { debug } = this.flv.options; + if (this.uint8.length >= 13 && !this.header) { + const header = Object.create(null); + header.signature = bin2String(this.read(3)); + [header.version] = this.read(1); + [header.flags] = this.read(1); + header.headersize = getUint8Sum(this.read(4)); + this.header = header; + this.read(4); + this.flv.emit('flvParseHeader', this.header); + if (debug) { + console.log('[flv-parse-header]', this.header); + } + } + + while (this.index < this.uint8.length) { + const tag = Object.create(null); + [tag.tagType] = this.read(1); + tag.dataSize = getUint8Sum(this.read(3)); + tag.timestamp = this.read(4); + tag.streamID = this.read(3); + tag.body = this.read(tag.dataSize); + this.tags.push(tag); + this.read(4); + + switch (tag.tagType) { + case 18: + this.scripTag = parseScripTag(tag.body); + this.flv.emit('parseScripTag', this.scripTag); + if (debug) { + console.log('[flv-parse-scrip-tag]', this.scripTag); + } + break; + default: + break; + } + + this.flv.emit('flvParseTag', tag); + } + } + + read(length) { + const tempUint8 = new Uint8Array(length); + for (let i = 0; i < length; i += 1) { + tempUint8[i] = this.uint8[this.index]; + this.index += 1; + } + return tempUint8; + } +} diff --git a/packages/artplayer-plugin-flv/src/flvParse/parseScripTag.js b/packages/artplayer-plugin-flv/src/flvParse/parseScripTag.js new file mode 100644 index 000000000..3ddb9a22c --- /dev/null +++ b/packages/artplayer-plugin-flv/src/flvParse/parseScripTag.js @@ -0,0 +1,104 @@ +import { getUint8Sum, readUint8, bin2String, bin2Boolean, bin2Float, errorHandle } from '../utils'; + +export default function parseScripTag(scripTagBody) { + const readScripTag = readUint8(scripTagBody); + const metadata = Object.create(null); + const amf1 = Object.create(null); + const amf2 = Object.create(null); + + [amf1.type] = readScripTag(1); + errorHandle(amf1.type === 2, `AMF: [amf1] type expect 2, but got ${amf1.type}`); + amf1.size = getUint8Sum(readScripTag(2)); + amf1.string = bin2String(readScripTag(amf1.size)); + + [amf2.type] = readScripTag(1); + errorHandle(amf2.type === 8, `AMF: [amf1] type expect 8, but got ${amf2.type}`); + amf2.size = getUint8Sum(readScripTag(4)); + amf2.metaData = Object.create(null); + + function getValue(type) { + let value = null; + if (type !== undefined) { + switch (type) { + case 0: + value = bin2Float(readScripTag(8)); + break; + case 1: + value = bin2Boolean(readScripTag(1)[0]); + break; + case 2: { + const valueLength = getUint8Sum(readScripTag(2)); + value = bin2String(readScripTag(valueLength)); + break; + } + case 3: { + value = Object.create(null); + let endObject = false; + while (!endObject && readScripTag.index < scripTagBody.length) { + const nameLength = getUint8Sum(readScripTag(2)); + const name = bin2String(readScripTag(nameLength)); + const type = readScripTag(1)[0]; + if (name) { + value[name] = getValue(type); + } + if (type === 9) { + endObject = true; + } + } + break; + } + case 8: { + value = Object.create(null); + let endArray = false; + while (!endArray && readScripTag.index < scripTagBody.length) { + const nameLength = getUint8Sum(readScripTag(2)); + const name = bin2String(readScripTag(nameLength)); + const type = readScripTag(1)[0]; + if (name) { + value[name] = getValue(type); + } + if (type === 9) { + endArray = true; + } + } + break; + } + case 10: { + const valueLength = getUint8Sum(readScripTag(4)); + value = []; + for (let index = 0; index < valueLength; index += 1) { + const itemType = readScripTag(1)[0]; + value.push(getValue(itemType)); + } + break; + } + case 12: { + const valueLength = getUint8Sum(readScripTag(4)); + value = bin2String(readScripTag(valueLength)); + break; + } + default: + console.log(readScripTag(scripTagBody.length - readScripTag.index - 1)); + errorHandle(false, `AMF: Unknown metaData type: ${type}`); + break; + } + } + return value; + } + + while (readScripTag.index < scripTagBody.length) { + const nameLength = getUint8Sum(readScripTag(2)); + const name = bin2String(readScripTag(nameLength)); + const type = readScripTag(1)[0]; + if (name) { + amf2.metaData[name] = getValue(type); + } + } + + errorHandle(readScripTag.index === scripTagBody.length, 'AMF: Seems to be incompletely parsed'); + errorHandle(amf2.size === Object.keys(amf2.metaData).length, 'AMF: [amf2] length does not match'); + + metadata.amf1 = amf1; + metadata.amf2 = amf2; + return metadata; +} diff --git a/packages/artplayer-plugin-flv/src/flvParse/readFile.js b/packages/artplayer-plugin-flv/src/flvParse/readFile.js new file mode 100644 index 000000000..d7ddbcc39 --- /dev/null +++ b/packages/artplayer-plugin-flv/src/flvParse/readFile.js @@ -0,0 +1,11 @@ +export default function readFile(flv, file) { + flv.emit('flvFetchStart'); + const { proxy } = flv.events; + const reader = new FileReader(); + proxy(reader, 'load', e => { + const buffer = e.target.result; + const uint8 = new Uint8Array(buffer); + flv.emit('flvFetchEnd', uint8); + }); + reader.readAsArrayBuffer(file); +} diff --git a/packages/artplayer-plugin-flv/src/index.js b/packages/artplayer-plugin-flv/src/index.js index f02d89db9..ebada3ad8 100644 --- a/packages/artplayer-plugin-flv/src/index.js +++ b/packages/artplayer-plugin-flv/src/index.js @@ -1,22 +1,58 @@ -import Flv from './flv'; +import Emitter from 'tiny-emitter'; +import checkSupport from './utils/checkSupport'; +import EventProxy from './eventProxy'; +import CreatWorker from './creatWorker'; +import CreatMediaSource from './creatMediaSource'; +import FlvParse from './flvParse'; +import * as utils from './utils'; +import config from './config'; -function artplayerPluginFlv(art) { - let flv = null; +let id = 0; +class Flv extends Emitter { + constructor(options) { + super(); + this.options = Object.assign({}, Flv.DEFAULTS, options); + checkSupport(this.options); + this.events = new EventProxy(this); + this.workers = new CreatWorker(this); + this.mediaSource = new CreatMediaSource(this); + this.flvData = new FlvParse(this); + id += 1; + this.id = id; + Flv.instances.push(this); + } - art.on('destroy', () => { - if (flv) { - flv.destroy(); - } - }); + static get DEFAULTS() { + return { + mediaElement: '', + url: '', + debug: false, + }; + } - return { - flv, - init: (mediaElement, url) => { - flv = new Flv(mediaElement, url); - flv.load(); - }, - }; + static get version() { + return '__VERSION__'; + } + + static get config() { + return config; + } + + static get utils() { + return utils; + } + + destroy() { + this.events.destroy(); + this.workers.killAll(); + Flv.instances.splice(Flv.instances.indexOf(this), 1); + this.emit('destroy'); + } } -window.artplayerPluginFlv = artplayerPluginFlv; -export default artplayerPluginFlv; +Object.defineProperty(Flv, 'instances', { + value: [], +}); + +window.Flv = Flv; +export default Flv; diff --git a/packages/artplayer-plugin-flv/src/utils/checkSupport.js b/packages/artplayer-plugin-flv/src/utils/checkSupport.js new file mode 100644 index 000000000..060be1956 --- /dev/null +++ b/packages/artplayer-plugin-flv/src/utils/checkSupport.js @@ -0,0 +1,24 @@ +import { errorHandle } from '.'; + +export default function checkSupport(options) { + const { mediaElement, url } = options; + errorHandle(mediaElement instanceof HTMLVideoElement, 'The first parameter is not a video tag element'); + errorHandle( + typeof url === 'string' || (url instanceof File && url.type === 'video/x-flv'), + 'The second parameter is not a string type or flv file', + ); + + const MP4H264MimeCodec = 'video/mp4; codecs="avc1.42001E, mp4a.40.2"'; + const canPlay = mediaElement.canPlayType(MP4H264MimeCodec); + errorHandle( + window.MediaSource && + window.MediaSource.isTypeSupported(MP4H264MimeCodec) && + (canPlay === 'probably' || canPlay === 'maybe'), + `Unsupported MIME type or codec: ${MP4H264MimeCodec}`, + ); + + errorHandle(typeof window.Promise === 'function', "Unsupported 'Promise' method"); + errorHandle(typeof window.fetch === 'function', "Unsupported 'fetch' method"); + errorHandle(typeof window.Worker === 'function', "Unsupported 'Worker' method"); + errorHandle(typeof window.ReadableStream === 'function', "Unsupported 'ReadableStream' method"); +} diff --git a/packages/artplayer-plugin-flv/src/flv/utils.js b/packages/artplayer-plugin-flv/src/utils/flvError.js similarity index 61% rename from packages/artplayer-plugin-flv/src/flv/utils.js rename to packages/artplayer-plugin-flv/src/utils/flvError.js index d7a372e91..9e04b1e8a 100644 --- a/packages/artplayer-plugin-flv/src/flv/utils.js +++ b/packages/artplayer-plugin-flv/src/utils/flvError.js @@ -1,4 +1,4 @@ -export class FlvError extends Error { +export default class FlvError extends Error { constructor(message, context) { super(message); if (typeof Error.captureStackTrace === 'function') { @@ -6,10 +6,4 @@ export class FlvError extends Error { } this.name = 'FlvError'; } -} - -export function errorHandle(condition, msg) { - if (!condition) { - throw new FlvError(msg); - } -} \ No newline at end of file +} \ No newline at end of file diff --git a/packages/artplayer-plugin-flv/src/utils/index.js b/packages/artplayer-plugin-flv/src/utils/index.js new file mode 100644 index 000000000..ea8f2a2e2 --- /dev/null +++ b/packages/artplayer-plugin-flv/src/utils/index.js @@ -0,0 +1,63 @@ +import FlvError from './flvError'; + +export function errorHandle(condition, msg) { + if (!condition) { + throw new FlvError(msg); + } +} + +export function mergeTypedArrays(a, b) { + const c = new a.constructor(a.length + b.length); + c.set(a); + c.set(b, a.length); + return c; +} + +export function sleep(ms = 0) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +export function getUint8Sum(arr) { + return arr.reduce((totle, num, index) => totle + num * 256 ** (arr.length - index - 1), 0); +} + +export function string2Bin(str) { + const result = []; + for (let i = 0; i < str.length; i += 1) { + result.push(Number(str.charCodeAt(i).toString(10))); + } + return result; +} + +export function bin2String(array) { + return String.fromCharCode.call(String, ...array); +} + +export function bin2Float(array) { + const view = new DataView(new ArrayBuffer(array.length)); + array.forEach((b, i) => { + view.setUint8(i, b); + }); + return view.getFloat64(0); +} + +export function bin2Boolean(bin) { + return bin === 1; +} + +export function log(name, msg = '') { + console.log(`[${name}] ${msg}`); +} + +export function readUint8(uint8) { + let index = 0; + return function read(length) { + const tempUint8 = new Uint8Array(length); + for (let i = 0; i < length; i += 1) { + tempUint8[i] = uint8[index]; + index += 1; + } + read.index = index; + return tempUint8; + }; +}