(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (factory((global['artplayer-plugin-flv'] = {}))); }(this, (function (exports) { 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var classCallCheck = _classCallCheck; function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var createClass = _createClass; function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var _typeof_1 = createCommonjsModule(function (module) { 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); } function _typeof(obj) { if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") { module.exports = _typeof = function _typeof(obj) { return _typeof2(obj); }; } else { module.exports = _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj); }; } return _typeof(obj); } module.exports = _typeof; }); function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } var assertThisInitialized = _assertThisInitialized; function _possibleConstructorReturn(self, call) { if (call && (_typeof_1(call) === "object" || typeof call === "function")) { return call; } return assertThisInitialized(self); } var possibleConstructorReturn = _possibleConstructorReturn; var getPrototypeOf = createCommonjsModule(function (module) { function _getPrototypeOf(o) { module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } module.exports = _getPrototypeOf; }); var setPrototypeOf = createCommonjsModule(function (module) { function _setPrototypeOf(o, p) { module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } module.exports = _setPrototypeOf; }); function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) setPrototypeOf(subClass, superClass); } var inherits = _inherits; function E() {// Keep this empty so it's easier to inherit from // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) } E.prototype = { on: function on(name, callback, ctx) { var e = this.e || (this.e = {}); (e[name] || (e[name] = [])).push({ fn: callback, ctx: ctx }); return this; }, once: function once(name, callback, ctx) { var self = this; function listener() { self.off(name, listener); callback.apply(ctx, arguments); } listener._ = callback; return this.on(name, listener, ctx); }, emit: function emit(name) { var data = [].slice.call(arguments, 1); var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); var i = 0; var len = evtArr.length; for (i; i < len; i++) { evtArr[i].fn.apply(evtArr[i].ctx, data); } return this; }, off: function off(name, callback) { var e = this.e || (this.e = {}); var evts = e[name]; var liveEvents = []; if (evts && callback) { for (var i = 0, len = evts.length; i < len; i++) { if (evts[i].fn !== callback && evts[i].fn._ !== callback) liveEvents.push(evts[i]); } } // Remove event from queue to prevent memory leak // Suggested by https://github.com/lazd // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 liveEvents.length ? e[name] = liveEvents : delete e[name]; return this; } }; var tinyEmitter = E; function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } var isNativeFunction = _isNativeFunction; var construct = createCommonjsModule(function (module) { function isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _construct(Parent, args, Class) { if (isNativeReflectConstruct()) { module.exports = _construct = Reflect.construct; } else { module.exports = _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } module.exports = _construct; }); var wrapNativeSuper = createCommonjsModule(function (module) { function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return construct(Class, arguments, getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } module.exports = _wrapNativeSuper; }); var FlvError = /*#__PURE__*/ function (_Error) { inherits(FlvError, _Error); function FlvError(message, context) { var _this; classCallCheck(this, FlvError); _this = possibleConstructorReturn(this, getPrototypeOf(FlvError).call(this, message)); if (typeof Error.captureStackTrace === 'function') { Error.captureStackTrace(assertThisInitialized(assertThisInitialized(_this)), context || _this.constructor); } _this.name = 'FlvError'; return _this; } return FlvError; }(wrapNativeSuper(Error)); function errorHandle(condition, msg) { if (!condition) { throw new FlvError(msg); } } var utils = /*#__PURE__*/Object.freeze({ FlvError: FlvError, errorHandle: errorHandle }); function checkSupport(mediaElement, 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 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"); } 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 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 = /*#__PURE__*/ function () { function CreatMediaSource(flv) { classCallCheck(this, CreatMediaSource); this.flv = flv; this.creatUrl(); this.eventBind(); } createClass(CreatMediaSource, [{ key: "creatUrl", value: function creatUrl() { var _this$flv = this.flv, mediaElement = _this$flv.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; }(); var LoadFile = /*#__PURE__*/ function () { function LoadFile(flv) { classCallCheck(this, LoadFile); this.flv = flv; this.uint8 = []; this.index = 0; this.header = {}; this.tags = []; if (typeof flv.url === 'string') { this.fromNetwork(flv.url); } else { this.fromLocal(flv.url); } } createClass(LoadFile, [{ key: "fromNetwork", value: function fromNetwork(url) { console.log(this.flv.url); } }, { key: "fromLocal", value: function fromLocal(file) { var _this = this; var proxy = this.flv.events.proxy; var reader = new FileReader(); proxy(reader, 'load', function (e) { var buffer = e.target.result; _this.uint8 = new Uint8Array(buffer); _this.parse(); }); reader.readAsArrayBuffer(file); } }, { key: "parse", value: function parse() { this.header.signature = this.read(3); this.header.version = this.read(1); this.header.flags = this.read(1); this.header.headersize = this.read(4); this.read(4); while (this.index < this.uint8.length) { var tag = {}; tag.tagType = this.read(1); tag.dataSize = this.read(3); tag.Timestamp = this.read(4); tag.StreamID = this.read(3); tag.body = this.read(LoadFile.getBodySum(tag.dataSize)); this.tags.push(tag); this.read(4); } } }, { key: "read", value: function read(length) { var tempUint8 = []; for (var i = 0; i < length; i += 1) { tempUint8.push(this.uint8[this.index]); this.index += 1; } return tempUint8; } }], [{ key: "getBodySum", value: function getBodySum(arr) { return arr[0] * Math.pow(256, 2) + arr[1] * 256 + arr[2]; } }]); return LoadFile; }(); var id = 0; var Flv = /*#__PURE__*/ function (_Emitter) { inherits(Flv, _Emitter); function Flv(mediaElement, url) { var _this; classCallCheck(this, Flv); _this = possibleConstructorReturn(this, getPrototypeOf(Flv).call(this)); checkSupport(mediaElement, url); _this.mediaElement = mediaElement; _this.url = url; id += 1; _this.id = id; Flv.instances.push(assertThisInitialized(assertThisInitialized(_this))); return _this; } createClass(Flv, [{ key: "load", value: function load() { this.events = new EventProxy(this); this.mediaSource = new CreatMediaSource(this); this.file = new LoadFile(this); this.emit('load'); } }, { key: "destroy", value: function destroy() { this.events.destroy(); Flv.instances.splice(Flv.instances.indexOf(this), 1); this.emit('destroy'); } }], [{ 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; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=artplayer-plugin-flv.js.map