${icons.loading}
@@ -8997,3213 +9024,3215 @@
` : ''}
`);
- Object.defineProperty(control, '$poster', {
- value: player.$container.querySelector('.jessibuca-poster')
- });
- Object.defineProperty(control, '$loading', {
- value: player.$container.querySelector('.jessibuca-loading')
- });
- Object.defineProperty(control, '$play', {
- value: player.$container.querySelector('.jessibuca-play')
- });
- Object.defineProperty(control, '$playBig', {
- value: player.$container.querySelector('.jessibuca-play-big')
- });
- Object.defineProperty(control, '$pause', {
- value: player.$container.querySelector('.jessibuca-pause')
- });
- Object.defineProperty(control, '$controls', {
- value: player.$container.querySelector('.jessibuca-controls')
- });
- Object.defineProperty(control, '$fullscreen', {
- value: player.$container.querySelector('.jessibuca-fullscreen')
- });
- Object.defineProperty(control, '$fullscreen', {
- value: player.$container.querySelector('.jessibuca-fullscreen')
- });
- Object.defineProperty(control, '$volume', {
- value: player.$container.querySelector('.jessibuca-volume')
- });
- Object.defineProperty(control, '$volumePanelWrap', {
- value: player.$container.querySelector('.jessibuca-volume-panel-wrap')
- });
- Object.defineProperty(control, '$volumePanelText', {
- value: player.$container.querySelector('.jessibuca-volume-panel-text')
- });
- Object.defineProperty(control, '$volumePanel', {
- value: player.$container.querySelector('.jessibuca-volume-panel')
- });
- Object.defineProperty(control, '$volumeHandle', {
- value: player.$container.querySelector('.jessibuca-volume-panel-handle')
- });
- Object.defineProperty(control, '$volumeOn', {
- value: player.$container.querySelector('.jessibuca-icon-audio')
- });
- Object.defineProperty(control, '$volumeOff', {
- value: player.$container.querySelector('.jessibuca-icon-mute')
- });
- Object.defineProperty(control, '$fullscreen', {
- value: player.$container.querySelector('.jessibuca-fullscreen')
- });
- Object.defineProperty(control, '$fullscreenExit', {
- value: player.$container.querySelector('.jessibuca-fullscreen-exit')
- });
- Object.defineProperty(control, '$record', {
- value: player.$container.querySelector('.jessibuca-record')
- });
- Object.defineProperty(control, '$recordStop', {
- value: player.$container.querySelector('.jessibuca-record-stop')
- });
- Object.defineProperty(control, '$screenshot', {
- value: player.$container.querySelector('.jessibuca-screenshot')
- });
- Object.defineProperty(control, '$speed', {
- value: player.$container.querySelector('.jessibuca-speed')
- });
- });
-
- var observer$1 = ((player, control) => {
- const {
- events: {
- proxy
- }
- } = player;
- const object = document.createElement('object');
- object.setAttribute('aria-hidden', 'true');
- object.setAttribute('tabindex', -1);
- object.type = 'text/html';
- object.data = 'about:blank';
- setStyle(object, {
- display: 'block',
- position: 'absolute',
- top: '0',
- left: '0',
- height: '100%',
- width: '100%',
- overflow: 'hidden',
- pointerEvents: 'none',
- zIndex: '-1'
- });
- let playerWidth = player.width;
- let playerHeight = player.height;
- proxy(object, 'load', () => {
- proxy(object.contentDocument.defaultView, 'resize', () => {
- if (player.width !== playerWidth || player.height !== playerHeight) {
- playerWidth = player.width;
- playerHeight = player.height;
- player.emit(EVENTS.resize);
- }
- });
- });
- player.$container.appendChild(object);
- player.on(EVENTS.destroy, () => {
- player.$container.removeChild(object);
- });
-
- function setVolumeHandle(percentage) {
- if (percentage === 0) {
- setStyle(control.$volumeOn, 'display', 'none');
- setStyle(control.$volumeOff, 'display', 'flex');
- setStyle(control.$volumeHandle, 'top', `${48}px`);
- } else {
- if (control.$volumeHandle && control.$volumePanel) {
- const panelHeight = getStyle(control.$volumePanel, 'height') || 60;
- const handleHeight = getStyle(control.$volumeHandle, 'height');
- const top = panelHeight - (panelHeight - handleHeight) * percentage - handleHeight;
- setStyle(control.$volumeHandle, 'top', `${top}px`);
- setStyle(control.$volumeOn, 'display', 'flex');
- setStyle(control.$volumeOff, 'display', 'none');
- }
- }
-
- control.$volumePanelText && (control.$volumePanelText.innerHTML = parseInt(percentage * 100));
- }
-
- player.on(EVENTS.volumechange, () => {
- setVolumeHandle(player.volume);
- });
- player.on(EVENTS.loading, flag => {
- setStyle(control.$loading, 'display', flag ? 'flex' : 'none');
- setStyle(control.$poster, 'display', 'none');
-
- if (flag) {
- setStyle(control.$playBig, 'display', 'none');
- }
- });
-
- const screenfullChange = fullscreen => {
- let isFullScreen = isBoolean(fullscreen) ? fullscreen : player.fullscreen;
- setStyle(control.$fullscreenExit, 'display', isFullScreen ? 'flex' : 'none');
- setStyle(control.$fullscreen, 'display', isFullScreen ? 'none' : 'flex'); // control.autoSize();
- };
-
- try {
- screenfull.on('change', screenfullChange);
- player.events.destroys.push(() => {
- screenfull.off('change', screenfullChange);
- });
- } catch (error) {//
- } //
-
-
- player.on(EVENTS.webFullscreen, value => {
- screenfullChange(value);
- });
- player.on(EVENTS.recording, () => {
- setStyle(control.$record, 'display', player.recording ? 'none' : 'flex');
- setStyle(control.$recordStop, 'display', player.recording ? 'flex' : 'none');
- }); //
-
- player.on(EVENTS.recordingTimestamp, timestamp => {// console.log(timestamp);
- });
- player.on(EVENTS.playing, flag => {
- setStyle(control.$play, 'display', flag ? 'none' : 'flex');
- setStyle(control.$playBig, 'display', flag ? 'none' : 'block');
- setStyle(control.$pause, 'display', flag ? 'flex' : 'none');
- setStyle(control.$screenshot, 'display', flag ? 'flex' : 'none');
- setStyle(control.$record, 'display', flag ? 'flex' : 'none');
- setStyle(control.$fullscreen, 'display', flag ? 'flex' : 'none'); // 不在播放
-
- if (!flag) {
- control.$speed && (control.$speed.innerHTML = bpsSize(''));
- }
- });
- player.on(EVENTS.kBps, rate => {
- const bps = bpsSize(rate);
- control.$speed && (control.$speed.innerHTML = bps);
- });
- });
-
- var property = ((player, control) => {
- Object.defineProperty(control, 'controlsRect', {
- get: () => {
- return control.$controls.getBoundingClientRect();
- }
- });
- });
-
- var events = ((player, control) => {
- const {
- events: {
- proxy
- },
- debug
- } = player;
-
- function volumeChangeFromEvent(event) {
- const {
- bottom: panelBottom,
- height: panelHeight
- } = control.$volumePanel.getBoundingClientRect();
- const {
- height: handleHeight
- } = control.$volumeHandle.getBoundingClientRect();
- let moveLen = event.y; // if (isMobile() && player.fullscreen) {
- // moveLen = event.x;
- // }
-
- const percentage = clamp(panelBottom - moveLen - handleHeight / 2, 0, panelHeight - handleHeight / 2) / (panelHeight - handleHeight);
- return percentage;
- } //
-
-
- proxy(window, ['click', 'contextmenu'], event => {
- if (event.composedPath().indexOf(player.$container) > -1) {
- control.isFocus = true;
- } else {
- control.isFocus = false;
- }
- }); //
-
- proxy(window, 'orientationchange', () => {
- setTimeout(() => {
- player.resize();
- }, 300);
- });
- proxy(control.$controls, 'click', e => {
- e.stopPropagation();
- });
- proxy(control.$pause, 'click', e => {
- player.pause();
- }); // 监听 play 方法
-
- proxy(control.$play, 'click', e => {
- player.play();
- }); // 监听 play 方法
-
- proxy(control.$playBig, 'click', e => {
- player.play();
- });
- proxy(control.$volume, 'mouseover', () => {
- control.$volumePanelWrap.classList.add('jessibuca-volume-panel-wrap-show');
- });
- proxy(control.$volume, 'mouseout', () => {
- control.$volumePanelWrap.classList.remove('jessibuca-volume-panel-wrap-show');
- });
- proxy(control.$volumeOn, 'click', e => {
- e.stopPropagation();
- setStyle(control.$volumeOn, 'display', 'none');
- setStyle(control.$volumeOff, 'display', 'block');
- player.lastVolume = player.volume;
- player.volume = 0;
- });
- proxy(control.$volumeOff, 'click', e => {
- e.stopPropagation();
- setStyle(control.$volumeOn, 'display', 'block');
- setStyle(control.$volumeOff, 'display', 'none');
- player.volume = player.lastVolume || 0.5;
- });
- proxy(control.$screenshot, 'click', e => {
- e.stopPropagation();
- player.video.screenshot();
- });
- proxy(control.$volumePanel, 'click', event => {
- event.stopPropagation();
- player.volume = volumeChangeFromEvent(event);
- });
- proxy(control.$volumeHandle, 'mousedown', () => {
- control.isVolumeDroging = true;
- });
- proxy(control.$volumeHandle, 'mousemove', event => {
- if (control.isVolumeDroging) {
- player.volume = volumeChangeFromEvent(event);
- }
- });
- proxy(document, 'mouseup', () => {
- if (control.isVolumeDroging) {
- control.isVolumeDroging = false;
- }
- });
- proxy(control.$record, 'click', e => {
- e.stopPropagation();
- player.recording = true;
- });
- proxy(control.$recordStop, 'click', e => {
- e.stopPropagation();
- player.recording = false;
- });
- proxy(control.$fullscreen, 'click', e => {
- e.stopPropagation();
- player.fullscreen = true;
- });
- proxy(control.$fullscreenExit, 'click', e => {
- e.stopPropagation();
- player.fullscreen = false;
- });
-
- if (player._opt.hasControl && player._opt.controlAutoHide) {
- //
- proxy(player.$container, 'mouseover', () => {
- if (!player.fullscreen) {
- setStyle(control.$controls, 'display', 'block');
- }
- });
- proxy(player.$container, 'mouseout', () => {
- setStyle(control.$controls, 'display', 'none');
- });
- }
- });
-
- function styleInject(css, ref) {
- if ( ref === void 0 ) ref = {};
- var insertAt = ref.insertAt;
-
- if (!css || typeof document === 'undefined') { return; }
-
- var head = document.head || document.getElementsByTagName('head')[0];
- var style = document.createElement('style');
- style.type = 'text/css';
-
- if (insertAt === 'top') {
- if (head.firstChild) {
- head.insertBefore(style, head.firstChild);
- } else {
- head.appendChild(style);
- }
- } else {
- head.appendChild(style);
- }
-
- if (style.styleSheet) {
- style.styleSheet.cssText = css;
- } else {
- style.appendChild(document.createTextNode(css));
- }
- }
-
- var css_248z$1 = "@keyframes rotation{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}.jessibuca-container .jessibuca-icon{cursor:pointer;width:16px;height:16px}.jessibuca-container .jessibuca-poster{position:absolute;z-index:10;left:0;top:0;right:0;bottom:0;height:100%;width:100%;background-position:50%;background-repeat:no-repeat;background-size:contain;pointer-events:none}.jessibuca-container .jessibuca-play-big{position:absolute;display:none;height:100%;width:100%;background:rgba(0,0,0,.4)}.jessibuca-container .jessibuca-play-big:after{cursor:pointer;content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:block;width:48px;height:48px;background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACgklEQVRoQ+3ZPYsTQRjA8eeZZCFlWttAwCIkZOaZJt8hlvkeHrlccuAFT6wEG0FQOeQQLCIWih6chQgKgkkKIyqKCVYip54IWmiQkTmyYhFvd3Zn3yDb7szu/7cv7GaDkPEFM94PK0DSZ9DzDAyHw7uI2HRDlVJX5/N5r9FoHCYdr/fvCRiNRmpJ6AEidoUQ15NG+AH8BgD2n9AHANAmohdJQfwAfgGA4xF4bjabnW21Whob62ILoKNfAsAGEd2PU2ATcNSNiDf0/cE5/xAHxDpgEf0NADaJ6HLUiKgAbvcjpdSGlPJZVJCoAUfdSqkLxWLxTLlc/mkbEgtgET1TSnWklLdtIuIEuN23crlcp16vv7cBSQKgu38AwBYRXQyLSArg3hsjRDxNRE+CQhIF/BN9qVAobFYqle+mkLQAdLd+8K0T0U0TRJoAbvc9fVkJId75gaQRoLv1C2STiPTb7rFLWgE6+g0RncwyYEJEtawCvjDGmpzzp5kD6NfxfD7frtVqB17xen2a7oG3ALBm+oMoFQBEPD+dTvtBfpImDXjIGFvjnD/3c7ksG5MU4HDxWeZa0HB3XhKAXcdxOn5vUi9gnIDXSqm2lHLPK8pkfVyAbSLqm4T5HRs1YB8RO0KIid8g03FRAT4rpbpSyh3TINPxUQB2GGM9zvkn05gg420CJovLZT9ISNA5tgB9ItoOGhFmnh/AcZ/X9xhj65zzV2Eiwsz1A1j2B8dHAOgS0W6YnduY6wkYj8d3lFKn/j66Ea84jtOrVqtfbQSE3YYnYDAY5Eql0hYAnNDv6kKIx2F3anO+J8DmzqLY1goQxVE12ebqDJgcrSjGrs5AFEfVZJt/AF0m+jHzUTtnAAAAAElFTkSuQmCC\");background-repeat:no-repeat;background-position:50%}.jessibuca-container .jessibuca-play-big:hover:after{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACEElEQVRoQ+2ZXStEQRjH/3/yIXwDdz7J+i7kvdisXCk3SiFJW27kglBcSFFKbqwQSa4krykuKB09Naf2Yndn5jgzc06d53Znd36/mWfeniVyHsw5PwqB0DOonYEoijYBlOpAFwCMkHwLDS/9mwhEDUCfAAyTXA4tYSLwC6CtCegegH6S56FETAR+AHRoACcBTJAUWa+RloBAXwAYIrnt0yBNgZi7qtbHgw8RFwLC/QFglOScawlXAjH3gUqrE1cirgVi7mkAYyS/0xbxJSDcdwAGSa6nKeFTIOZeUyL3aYiEEBDuLwDjJGf+KxFKIOY+BdBL8iipSGiBmHtWbbuftiJZERBuOfgGSK7aSGRJIObeUml1ayKSRQHhlgtkiaTcdltGVgUE+ppkV54FaiS78yrwqlLoOI8Cch2XV548W7WRpTVwA6DP9kGUFYEpAOUkT9LQAvtq1M+0udKkQSgBqSlJWWYxKXj8vRACK+o6bbRIdYI+Ba7U7rKjg7L53JdAhWTZBsy0rWuBXZUuNVMg23auBF7UIl2yBbJt70JAoKV6/WwLk6R9mgKSJlJ1kLTxFmkJyCla8UZd15GJQKvyumyJ8gy8DAEvfZoINPqD41EtUjmUgoaJwAaAnjrKebVI34OSq85NBNqlCAWgE0CV5GEWwI3vQlmCbcSinYFCwPEIFDPgeIC1P1/MgHaIHDf4Aydx2TF7wnKeAAAAAElFTkSuQmCC\")}.jessibuca-container .jessibuca-loading{display:none;flex-direction:column;justify-content:center;align-items:center;position:absolute;z-index:20;left:0;top:0;right:0;bottom:0;width:100%;height:100%;pointer-events:none}.jessibuca-container .jessibuca-loading-text{line-height:20px;font-size:13px;color:#fff;margin-top:10px}.jessibuca-container .jessibuca-controls{background-color:#161616;box-sizing:border-box;display:flex;flex-direction:column;justify-content:flex-end;position:absolute;z-index:40;left:0;right:0;bottom:0;height:38px;padding-left:13px;padding-right:13px;font-size:14px;color:#fff;opacity:0;visibility:hidden;transition:all .2s ease-in-out;-webkit-user-select:none;user-select:none;transition:width .5s ease-in}.jessibuca-container .jessibuca-controls .jessibuca-controls-item{position:relative;display:flex;justify-content:center;padding:0 8px}.jessibuca-container .jessibuca-controls .jessibuca-controls-item:hover .icon-title-tips{visibility:visible;opacity:1}.jessibuca-container .jessibuca-controls .jessibuca-fullscreen,.jessibuca-container .jessibuca-controls .jessibuca-fullscreen-exit,.jessibuca-container .jessibuca-controls .jessibuca-icon-audio,.jessibuca-container .jessibuca-controls .jessibuca-microphone-close,.jessibuca-container .jessibuca-controls .jessibuca-pause,.jessibuca-container .jessibuca-controls .jessibuca-play,.jessibuca-container .jessibuca-controls .jessibuca-record,.jessibuca-container .jessibuca-controls .jessibuca-record-stop,.jessibuca-container .jessibuca-controls .jessibuca-screenshot{display:none}.jessibuca-container .jessibuca-controls .jessibuca-icon-audio,.jessibuca-container .jessibuca-controls .jessibuca-icon-mute{z-index:1}.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom{display:flex;justify-content:space-between;height:100%}.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom .jessibuca-controls-left,.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom .jessibuca-controls-right{display:flex;align-items:center}.jessibuca-container.jessibuca-controls-show .jessibuca-controls{opacity:1;visibility:visible}.jessibuca-container.jessibuca-controls-show-auto-hide .jessibuca-controls{opacity:.8;visibility:visible;display:none}.jessibuca-container.jessibuca-hide-cursor *{cursor:none!important}.jessibuca-container .jessibuca-icon-loading{width:50px;height:50px;background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%;animation:rotation 1s linear infinite}.jessibuca-container .jessibuca-icon-screenshot{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAE5UlEQVRoQ+1YW2sdVRT+1s7JxbsoVkEUrIIX0ouz15zYNA+N1RdtQfCltlUfvLbqL/BCwZ8grbHtizQqPojgBSr0JkiMmT2nxgapqBURtPVCq7HxJCeZJVPmxDlzZubMmXOSEsnAvOy917fXt9e39tp7E5b4R0vcfywTuNgRbBgBx3HuJqLVzPzmYjprjHkcwAlmLqXNm4XAISLaSESPaq2HF4OE67rbRGRYRA7btn1fbgLGmKsA/Azg0gBkGzO/vZAkHMd5hIiqc5wHcCMz/5k0Z2oExsfHV1QqldPAf8lORNu11m8tBAljzFYAYWxRSl1vWdZvuQj4RsYYF4AVBlgIOVVlE55HRIxt23ZuCfmGjuOsJ6LPoiAistW27XfaEYmIbOYhPc9bXywWR1oiEJDYQkR1zrYjEjGyqfqbKd8a7kJVtLgQ+30i8pht2wfyRKIdmJkJBPkQTbILfudJ7CTZNBvVpggEcgpvc/ML38zESbLJsxBNE/A9biX0rdjGyTQXgbxyapdsarb0PMlXtWnGoXbKpm0Essqp3bJpK4E0OXmed3+hUBDP8w5FI91M0rdcyLLILElOCbaZilSWeXMncRx4klTCY1spfG3dhZJWx3GcDUR0EEB3ZMw0ET2gtT6SZWWzjmlrBIJCl0hAKfWgZVmHszqXZVxbCSxpCS2JJA6umIhe8ZKKVLPbaBJ+S9toqVRa53nedgAbAKwIwH4FcAzAa0R0l4i8F7PPz189k6RFRA+LyNcAXojDV0oNW5b1eW4Cxpg9AHZkSaaa6hhzb065uDSCH2LmRB8Sk9gY4293g43Qo/1pV80m8yQMfZSZ781cB1zXHRKRZ2IMpgD8A+DamL4ZItqitX4/jbQx5iEA7wLoihn3V/ACckWMJN/QWj9b1x5tGBsbW6uUOh5pPy0iL3Z2dn6ilJqanp5ep5TaJSLhF4NppdRNaU8gPmapVLrO87yfIoXuWyJ6uVKp+HmFjo6OQSJ6FcBtYT+UUmstyxqvkWuUgDFmP4AnQu2/e563qlgs+u9DNZ8xZhRAX7VRRPbath0XuXk7Y8xeAE+FgL6fnJzsHRwcLIfBR0ZGLunq6poAsDLUvp+Zw7b1r9PGmJMAbg8Z7WDmoThZuK67WkS+DD18fcPMdzSQUBR/EzN/nIC/SUQ+DPXV4dclsTHmHAD/SfHCNzc3t7Kvr++HJKeMMacA3BL0nyuXyzcPDAxMxo0fHR29slAo/Ajg6qD/fE9Pzw29vb1/x42fmJi4vFwu+5G/LOg/y8zXNJLQ2dAES5JANMQ7mfn1jBI6ycx3NiMhItqstf4oAX+ziHwQ6qvDj5NQNIn/ALCKmX+JSeIvABRD7fuY+ekGBPYBeDI05tTMzExvf3+/vz2Hk91/ET8RSeI6/DoCpVJpjed5fmKGvzMAXpqdnT3oed5Ud3d3v4jsAqBr9Ei0Rmv9VRqBBPzvROQVETnq2xJRdRu9tRF+bCVOKWT+Kvl/TSIFk6SW/LAjKfjV5K8rZABi8dOOEv7FI7Z8x6zwEWbemLbyMfJr5qiSiJ96oclymBOR3bZtP9+M89WxxpjdAHY2sN3DzM8ljWl4I3Nd9x7/OE1ENcdpETnmH3e11n41zv0l4J8RkU+J6AAz+xtF4teQQG7PFslwmcAiLfSyhC72Qv9/I/Avns2OT7QJskoAAAAASUVORK5CYII=\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-screenshot:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAED0lEQVRoQ+2ZycsdRRTFf2ejqHFAMQqiYBTUoElUHLNx3GgCgpuYRF2o0UT9CxwQ/BMkMSbZSKLiQgQHUDCJgjiAxiEiESdEcJbEedgcKaj3UV+/6q7u/jovPPkK3qbr1ql76p5bt6qemPKmKfefeQKHOoLFCNg+H1gi6fFJOmv7VmCvpD1N87Yh8ApwNXCzpB2TIGF7DRDm2inpmt4EbB8LfAMcGUHWSHryYJKwfRMwmuMP4BRJv9TN2RgB2wuB72BWsq+V9MTBIGF7NZBiGzhJ0o+9CIRBtt8FLqgADC6nRDbpVO9Iuqi3hCKB5cDrGZDVkp4aIhIV2aSQyyW9MScCkcQqIOfsnCORkc3I31b5VtyFRmg1IQ7dt0ja3icSQ2C2JhAjUU2ykd+dE7tBNp2i2olAJJFuc+nCt564QTadF6IzgUhiVGiqyinKaQjZpJP2ItBXTkPJZhACXeU0pGwGI9BWTkPLZlACBTldG4o5EA6E1dY66edcyNrs8Q36zg1vVaTazNs7iXPgDVJJzYs7VRvHRzaDEohyugJ4CTi84sg/wHWSdnVxsGQ7aQLXS9pZcqpL/6AEplpCU5HE8YpJ9YrXUKQ6baN1+HPaRm1fBqwFQnKGK2ZoPwCvAo8Ai4FnMpPMHMwapHUj8DFwbw3+Dklv9iZgexOwvktSRduxU2VDlErwmyXV+lCbxLbDdndlCT3TX3vV7JgnKfRuSVflfMkSsL0ZuDMz4E/gL+CETN+/wCpJzzaRtn0D8DRwWMbu1/gCcnSm7zFJd1W/jxGwvQx4r2IYnlbuA14GAomQFw8B6YtBKFSnNj2BxEJ3IvB1pdB9CjwQ8yqYhcg/DJxZ8WOZpA/SbzkC24DbEqOfgPMkBRKzmu23gEuSj1sk5SI3Y2J7C3BHMuZz4FxJf6fgto8APgIWJd+3SUrHjr9O294HnJUMWi8pSGqs2V4CvJ88fH0i6eyChKr4KyS9WIO/Ang+6RvDz0XgABCeFEdtkaQv65yy/QVweuwPY0+T9FuNQ8cAXwHHxf7wdHiypN9r7BfEl8GjYv9+SceXJLQ/mSDYTh2Baog3SHq0pYT2STqno4RWSnqhBn8l8FzSN4bfJol/jkn8bXUS228DFyfft0paVyCwFbg9sQkSDEkctueZZju8iO+tJPEYfo7A0piYKd73wP3xnB+20cvjNnphxdmlkj4sEMjhfwY8COyOY0fb6Bkl/K6FLKxS+M1KpDhJY8mvrG5doRwlf66QZfGbjhLh4pEt35kV3iUp/IvTunU8qtTil/7gaHOY2yjpntaez9b5RmBDYewmSXfX2RRvZLYvbThOh+NuqMa9Ww1+yLnXgO2SwkZR24oEens2oYHzBCa00PMSOtQL/f+NwH+Hg8hAnbrYgQAAAABJRU5ErkJggg==\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-play{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACgklEQVRoQ+3ZPYsTQRjA8eeZZCFlWttAwCIkZOaZJt8hlvkeHrlccuAFT6wEG0FQOeQQLCIWih6chQgKgkkKIyqKCVYip54IWmiQkTmyYhFvd3Zn3yDb7szu/7cv7GaDkPEFM94PK0DSZ9DzDAyHw7uI2HRDlVJX5/N5r9FoHCYdr/fvCRiNRmpJ6AEidoUQ15NG+AH8BgD2n9AHANAmohdJQfwAfgGA4xF4bjabnW21Whob62ILoKNfAsAGEd2PU2ATcNSNiDf0/cE5/xAHxDpgEf0NADaJ6HLUiKgAbvcjpdSGlPJZVJCoAUfdSqkLxWLxTLlc/mkbEgtgET1TSnWklLdtIuIEuN23crlcp16vv7cBSQKgu38AwBYRXQyLSArg3hsjRDxNRE+CQhIF/BN9qVAobFYqle+mkLQAdLd+8K0T0U0TRJoAbvc9fVkJId75gaQRoLv1C2STiPTb7rFLWgE6+g0RncwyYEJEtawCvjDGmpzzp5kD6NfxfD7frtVqB17xen2a7oG3ALBm+oMoFQBEPD+dTvtBfpImDXjIGFvjnD/3c7ksG5MU4HDxWeZa0HB3XhKAXcdxOn5vUi9gnIDXSqm2lHLPK8pkfVyAbSLqm4T5HRs1YB8RO0KIid8g03FRAT4rpbpSyh3TINPxUQB2GGM9zvkn05gg420CJovLZT9ISNA5tgB9ItoOGhFmnh/AcZ/X9xhj65zzV2Eiwsz1A1j2B8dHAOgS0W6YnduY6wkYj8d3lFKn/j66Ea84jtOrVqtfbQSE3YYnYDAY5Eql0hYAnNDv6kKIx2F3anO+J8DmzqLY1goQxVE12ebqDJgcrSjGrs5AFEfVZJt/AF0m+jHzUTtnAAAAAElFTkSuQmCC\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-play:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACEElEQVRoQ+2ZXStEQRjH/3/yIXwDdz7J+i7kvdisXCk3SiFJW27kglBcSFFKbqwQSa4krykuKB09Naf2Yndn5jgzc06d53Znd36/mWfeniVyHsw5PwqB0DOonYEoijYBlOpAFwCMkHwLDS/9mwhEDUCfAAyTXA4tYSLwC6CtCegegH6S56FETAR+AHRoACcBTJAUWa+RloBAXwAYIrnt0yBNgZi7qtbHgw8RFwLC/QFglOScawlXAjH3gUqrE1cirgVi7mkAYyS/0xbxJSDcdwAGSa6nKeFTIOZeUyL3aYiEEBDuLwDjJGf+KxFKIOY+BdBL8iipSGiBmHtWbbuftiJZERBuOfgGSK7aSGRJIObeUml1ayKSRQHhlgtkiaTcdltGVgUE+ppkV54FaiS78yrwqlLoOI8Cch2XV548W7WRpTVwA6DP9kGUFYEpAOUkT9LQAvtq1M+0udKkQSgBqSlJWWYxKXj8vRACK+o6bbRIdYI+Ba7U7rKjg7L53JdAhWTZBsy0rWuBXZUuNVMg23auBF7UIl2yBbJt70JAoKV6/WwLk6R9mgKSJlJ1kLTxFmkJyCla8UZd15GJQKvyumyJ8gy8DAEvfZoINPqD41EtUjmUgoaJwAaAnjrKebVI34OSq85NBNqlCAWgE0CV5GEWwI3vQlmCbcSinYFCwPEIFDPgeIC1P1/MgHaIHDf4Aydx2TF7wnKeAAAAAElFTkSuQmCC\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-pause{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABA0lEQVRoQ+1YwQqCUBAcfWXXsLr2AXWTPXno8yVB8AP6Aa3oHI+kCDqYaawJljSe133uzO44bx0M/HEG/v1gAd9mkAyQgY4I/F8LJUlyrQFtD2AtIkcNoFEU+Z7n7QD4DfFHEVlocrVmgAUAIAOl3mILPcDgEFcUhyrUKMGUUcroc3NQRimj9XJBGaWMvvPydKN0o6/9QTdKN6rZANxj6EbpRulGuZnjYqs8BbyR8Ub2Izeys+u6yyAIDpo/ehzHM2NMDsA0xFsRmWhyfTIDWSXxCEBmrd2EYXjSHJqm6bQoii2AOYBL5Z0xgFxEVppcrQvQJO0zhgX0iXbdWWSADHRE4AZQ731AhEUeNwAAAABJRU5ErkJggg==\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-pause:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAA7klEQVRoQ+2YSwrCQBBEX6HiVvxsPYDewfN7By/gD9ciQkvERQwJdBSiYs0mEDo96aruombEjy/9+P/jAj7NoBkwA28i8H8tFBFRA9oeWEo6ZgCNiDGwAYpn3TpKmmVytWbABQBmoNRbbqEHGB7iiuJYhRol2DJqGX1uDsuoZdRmLuNZSzGWUcuoZdRHSp/IylNgK2ErYSthK3FHwLcSvpXIjoLt9Jfa6TMwl3TIMBkRE2AH9BriL5KGmVyvWIltJXEfKN6tJJ0ym0bECFgDU+Ba+WZQFCdpkcnVuoBM0i5jXECXaNftZQbMwJsI3AAPN3dAQflHegAAAABJRU5ErkJggg==\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-record{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC+UlEQVRoQ+1ZS2sTURT+zlDJYE3XSq219QHVuEjnJDT+Bff9Abqw2voAEfGxqygUqWhVFHGl/yMLu9BwByxk5SNI66ML6U7axjhHbmhgWiftncxoOiV3FcI53z3f/e65594zhIQPSnj86BBot4IdBToKRFyBnbeFlFIScVEiuYvIWC6Xe2YK8pcC7SYA4CMzH4mDQBXAqilQBDsLQLfPf9FxnF4i8kwwmypARI+Wl5dvmIBEsUmlUkNE9NaHsVCpVAZGR0d/m+A2JSAid3K53E0TkCg2pVKpz7KseR/GfKVSGYxMAMA0M1+JEpyJb6lUOm5ZVnkrAsVisaunp+esiByr1Wp3R0ZGvmifzZK4XQQWHMc52MgBpdQuAOcAXABwuB400ZTjONdaIjA7O5u2bVsnWU1EujzP+5nP5xdMVjvIJkCBD8x8VCm1G8AYgAkAAxt8Z5j5YmgCSqlTAJ4D2OcD/AXgATNfbYVEAIFPIvKKiE4D6GuCea8xX6gtpJT6DmBvECgRFRzHeROWRAABE4iWCbwHEFhkPM/L5vP5dyaz+23+KwHXdR3P854S0YG1ILSCuthNMfNM2OC1/RYENLY+ygcBnPfht6ZAA6BYLNr6dyqVokKhsGpaNQ2TWJstreXaE2aed133sojcj41AKyvdzCdAgSXLsk4MDw9/a/i4rntbRPxFNZoC/5jAV2be759DKTUJ4FZSFFi0bbs/k8noy2R9dAjEuWU2YgXkQOK3kD6BMsysi2Z9JC2Jdcw/ALzwPO+xvmcl7Rj177JVEbkO4BARjSflFDJJuW1dBxJPoCIiL4noDIB1BS0pW6j+oJmbm+uuVqvjRKQfLr0bZHnIzJf0f6HeAybahrUJqAPruhLlcnnPysqKfpXp11n/Gv62zoHAroS+AafT6QkiGrIsazKbzX7eVIHEt1US39gCkOzWYthkjNE+tuZujDGZQ8XRXn8N4KT5lLFZ6uaYPt+nwyDuvC80YdhvB9uOAu1WoaNAR4GIK/AHvdr+QAexB7EAAAAASUVORK5CYII=\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-record:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACfUlEQVRoQ+2ZSYsUQRCFvycK4nJXXEbHBdwO4kn/gv9CD467ICIutxEFkREdFUU86T/xojcPntyQcT2INw+uISFVkD1Wd2dWlU7nUHlqisiX+fJFZGREi8yHMt8/HYG5VrBToFOg4QnMPxcyM2t4KE2nT0i6EwvylwIjQOCFpE1tEPgGfI0FamC3AFgazP8IrJL0KwZzkAI3gLMxIA1ttgCPA4w3wHpJP2NwBxG4KOlcDEgTGzNbA8wEGP57vA0CU5JONtlczFwz2wY8HUbAzBYCB4CtwCVJb33OIAXmioC70LoyBsxsEXAQOApsLIhelnS6FgEzW+5BBvwA/FS+SPJFa40KBZ5L2mxmS4AJ4IjHxCzwaUnHkgmY2V7gLrAyAPwOXJN0qg6DCgIvgQfAPsDjo2pcKddLciEz+wCs6AO6W9KjVBIVBGIgahN4BvRLMjslPYlZPbT53wR2AbeBtcUmXEFPdh5U06mbd/shBBzbr/Jx4FCAX0+BEsDMFocEYrNmFcE+BD4XsXZL0oyZnQCutkagzkn3m1NBwDe/Q9L74MAuFEqUn5op8I8JvJO0elacTALnc1HAH3Njkvwx+WeYWUegTa/pwaqIgexdyIN4uyRPmqULZRXEvulPwD3gpr+zcrtGQxfzRHYG2AAczuUWiom3kc4D2RN4BdwH9gM9CS0XFyoLGu9UuN974eIFVDiuSzruH5LqgRhtU20q8kBPV8LMlhVVmVdnYwX+SMdAZVeieAF7eeltmElJr4cpkH1bJfvGVvatxdR4bMu+teZuWxtKxWncXn8I7EldtQV7vz79fp9KwZp//9CksB8F206BuVahU6BToOEJ/Ab7+KdABdTt8AAAAABJRU5ErkJggg==\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-recordStop{background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-recordStop:hover{background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreen{background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreen:hover{background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreenExit{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAADd0lEQVRoQ+2Zz2sdVRTHv+fJBDW6anDVXen6wZszYxYBiYgtFGst3VSDunKjpS0GpUlqfjVpsVVs6aaL0or4YxMVFCJZ2ZLdPUP+gq5bQnTxtNAkfTnlhnnlkmQy9yV9780rudt77tzv5/y4v4bQ4Y06XD/2ANodwec/AiJygJnvtdvTWfPnRkBEJAiCN8rl8kMfiPn5+Ve7u7v3rays0Orq6lJfX99/PuN2auMDoAD+BvA2M6/mTWSMOUtE48D6AjHGzN/kjdlNvy+AnWOOmQ/lTSYiEwDOWzsimgrDcCRvzG76GwGw8/zJzO9sN6GInAMwbW1UdSSKoqndCMwb6wNwGsB39Q+p6h/M/C4R2dTa1AoHYBWKyCkA1+pqiWi2Wq0e7e/vf7yRoJAAKcQggMtuJKIoOtoxACnE0/xOi/SXMAxPuhCFjUBdpIjYVWXSEf0TM3/g9BeriDMKdSPEz8z8vrU1xgwT0YXCrEJZy1iSJKOqOub0/8jMA0mSfKKqNwoPkHp7ioiGHIhRIvpHVa93BEBa2JcAfOlALAHo6RgAKzRJkk9V1S6xL7kpV4idOM31taxaIKJHqmpPnMMA9hcOQES2PDJkAT1XAAC+ZebPfWB3auNzmLObVsNRUNUXVHUujuM7OxXnMy4XwOcj29mIyOuq+lapVGrYCelKpkEQ3CyXy4tbzdN0AGPMxr2iYZ+sra3FcRybtgCIiK2BKw2rdgaUSqWoUqlIkQAepFDdAF7cBq5ERI9rtdr1OI7tmE2t6SmUEYFHAEaexYW/1QC2EF+ru5GIvg7D0D2GNJxprQY4o6qv1I/b6SpzOYqiLxpWng5oOQAzXxWRWwA+dkRfYOb1p5hGW6sBJpn5KytSRG4D+KguWFXHoyhy7xdeLC0F2ChSRL4H8OFuINoKYIUbY34gogHH3eeZef1K6tPaDpCm068A3nMEDzHzxY4BUNWSiPxORO6z5aDPPlGICNQ9bYyZIaLjjudzIQoFkKbTbwCO+UI0HcB9J/LdeY0xs0R02IGYYObRrWqiFQCfEZEtSHsfmGZm+4qxbbM/hQD8BeBNa0hEM2EYnmgLgP3lFARBT1dXly4vL//b29tbzQNIU+llAHeJaLFSqRzJes5vegR8xGbZLCwsHKzVav8z8/0sm0ID+MDvAfh4qZk2exFopnd9vv0ELrXBQO7fD10AAAAASUVORK5CYII=\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreenExit:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC/ElEQVRoQ+2Zy49NQRCHvx+ReK6IlZ34E7CUiCAR4xEbTLCyQRATYswwb2IQZDYWgojHZpCQECts+ResiQwLj0RClNSkb9Lu3HtPz7mZc8+V6eXt6tP1VVV3VdcVbT7U5vozC9BqD/7/HjCzlZLet9rS9fbP9ICZvQPWSfqRAmFmS4ClMHm+JiR9S1mXVyYFwIBXwEZJv7I2MrPjQH8A6JN0OWtNM/OpAL7HS0mbsjYzswGgN8gNS+rJWtPM/HQAfJ9nkrY22tDMTgMjQaZH0nAzCmatTQE4ClyNPvQU2CbJQ2vKKB2Aa2hmR4DrkbbPgQ5Jv6sJSgkQILqA0dgTkjraBiBAxPHtPz2UtDuGKK0HKkqamd8qg5HS9yXtjebLdYjrHNRqiAeS9gQvnQGGSnML1bvGzOwc0BfN35PUaWYHgRulBwjW9ju+O4JwqM/AWFsABIgLwKkIYgJY1jYAAeJQuGIXVIVcKTKxh8WfBin9J+AVpx/eFWUEqFkyNACKp0rhgWYArkg6kQibSyylmPOklQdibijBX+fSLHFRJkDid+qKmdlaYENOI0zeEcBNSZ9qbVIEQHWuyGOTNZLetgrAz8ClPFpHa1ZL8rf5lFGEB2oBfAxQi4D5DeDmAP7mGJPka0oD4LnDr9imH/xFe8AP4vLIjBclxWXItCOtaIBjwOKo3HaFRyWdnLbmYUHhAJKumdkt4ECk9JCkSitmWixFAwxKOjt5uZvdBvZH2vZLit8XSSBFA/yjpJndAfY1A9FSgOCJu0BnBNErqfIkzfRCywECxCNgR6Rtt6TzmdqHBmyKXG4ZM4sTWc04NzNPWE+AuG3ZlZInSuGBinXMbBzYGVkrE6JUACGcHgPbUyGKAIj7REmZ18y897o5ghiQ5E/bltRChwE/kF7Xj0jyLkbDYWbzgBfA+iA4LmlXqwD8LydvszjAF0lfswBCKC0E3gBeP22p186f8RBKUbaejJmtAr5L+lBPptQAKfCzAClWmkmZWQ/MpHVTvv0X9iFAQGQyevIAAAAASUVORK5CYII=\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-audio{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACrUlEQVRoQ+2ZPYgTURCAZzbBXJnCeL2Cnb87b9MEtPBUrrMQFAtrtT5/ClGs9LBWWz0RtbBUFCF4oJDsbO68wsLA2YqQSmLlvpEHu7IuMdlLcus+yUKKhJfZ+ebnvZl5CJY/aLn+MAP41x7M1QPMfFtr/crzvHfTAs8FoNPp1LTWzwHgqIg0lFLvrQHwfX8BER8DwC6jNCIecF13wwoA3/dvIuKNpLJa60Oe560XGoCZd4rICiKeTCtaeABmPg4AJmRqg6xcaABmvg4At4aFRyEBhoVM4UMoCplHADCfJTEL5YEsIVNID5iQAYCHALCYxeq5b6PMfF5EBAAEESthGK7W6/XPRpFWq7W3VCqtZg2ZcT3g+/6i4zjzIlLSWn/yPO/DIGMNLCWY2Sj/+xGRK0qpZfNDEASnROTFVi0fr8+aA8z8Ld6KEfGt67oLYwMAwEUium8EREn7OgeAjwCwPyo/nrque3YSgAtE9GDaAM1mc65arc4Zuf1+P2w0Gt9jJZl5DQAORt+fENG5wgEw8zUAMB/zbBBRwyqAIAjuiMjlSOlNItpjFUCqWl0josMzgChR/9hGAWBbknjmAdPhDdqa0gfZzAMJKyVP4v8hhJYRcSni+0JEu63ahZj5anyQici6UuqIVQDdbrfS6/UqRulyufyTiH5sF8AlIro37VpoWEHIzGZ2tM+sEZFnSqkzk9RCS0R01wjIsZz+mug53hDRia0AnI4bGgDYISItz/M2jYC8Gpp2u30MEWuO4zha665Sqp0ZYFStX/iWchRAItFGzoHSsrJ2ZFl1mHg6bfVYJeGJv85CC++BpIJZ5kSFC6G0ha0e7mYJqcJ7IOkRay84UhD2XjHFIFZf8iW9YcYoYRi+tO6aNeupOs66iU/icV46zf/MAKZpzXFk/QL+JG1PUPhRiQAAAABJRU5ErkJggg==\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-audio:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACSElEQVRoQ+2Zu4sUQRCHf5+C+gf4yBXMfMYHGvjCzEBQDIzV+HwEohipGKupD0QNDE8UEwUFTe68wEDhTMVUMFJ+0tArzbjs9u3Ojt0wBR0M9MzUV1XdXVWNKhcq1189wP/2YKcesH1d0nPgdVvgnQDY3iTpqaT9kuaAt9UA2D4o6aGkzVHpXcByFQC2r0q60lB2D7BUNIDtjZIeSDoyRNGyAWwfiiET4n6YlAtg+7Kka2PCozyAMSHT5CkLIIbMfUlbMhdmOQCZIVOeB2LI3JN0NNPq6bTZe8D2aUmOY72kN8DnoIXt7eF5FSEzkQdsB+OEsFwr6RPwbpixhqYStoPyqVwAbkaAY5KeTWD5wStZHrD9XdJgK34FhBP9H8kFOAvciQBhn3/RAcBHSTvjfx4DJ6cBOAPcbRvA9gZJYQT5DfwYKGl7UdLu+PwIOFUiwCVJYQRZBuZqA7gh6XxUegXYVhtAmq0uAnt7gLhQm9vorBZx74Hcc6D3QLKH/z2JGyVnlYs4pCfzEe4rsLW2XehicpAtAftqAwiZbhhBfgE/ZwVwDrjddi40KiG0HXpHO+KcJ8CJaXKheeBWBOgqnf6W1BwvgcOrATieFDTrJL0HViJAVwXNgVgPrJH0BfiQDTDKtREiNK7KLSnHASQLLacP1PxcVkWWq8PU3emq2yqJJ0b1Qsv2QKpdZp+orBBqmrfq5m5mSJXtgUZI1XnB0YCo94opCal6L/ka3ghtlIXqrllzT9VJ5k19Ek/y0zbf6QHatOYk3/oDujC8QMWgjf4AAAAASUVORK5CYII=\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-mute{background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-mute:hover{background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-text{font-size:14px;width:30px}.jessibuca-container .jessibuca-speed{font-size:14px;color:#fff}.jessibuca-container .jessibuca-quality-menu-list{position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%);transition:visibility .3s,opacity .3s;background-color:rgba(0,0,0,.5);border-radius:4px}.jessibuca-container .jessibuca-quality-menu-list.jessibuca-quality-menu-shown{visibility:visible;opacity:1}.jessibuca-container .icon-title-tips{pointer-events:none;position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%);transition:visibility .3s ease 0s,opacity .3s ease 0s;background-color:rgba(0,0,0,.5);border-radius:4px}.jessibuca-container .icon-title{display:inline-block;padding:5px 10px;font-size:12px;white-space:nowrap;color:#fff}.jessibuca-container .jessibuca-quality-menu{padding:8px 0}.jessibuca-container .jessibuca-quality-menu-item{display:block;height:25px;margin:0;padding:0 10px;cursor:pointer;font-size:14px;text-align:center;width:50px;color:hsla(0,0%,100%,.5);transition:color .3s,background-color .3s}.jessibuca-container .jessibuca-quality-menu-item:hover{background-color:hsla(0,0%,100%,.2)}.jessibuca-container .jessibuca-quality-menu-item:focus{outline:none}.jessibuca-container .jessibuca-quality-menu-item.jessibuca-quality-menu-item-active{color:#2298fc}.jessibuca-container .jessibuca-volume-panel-wrap{position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%) translateY(22%);transition:visibility .3s,opacity .3s;background-color:rgba(0,0,0,.5);border-radius:4px;height:120px;width:50px;overflow:hidden}.jessibuca-container .jessibuca-volume-panel-wrap.jessibuca-volume-panel-wrap-show{visibility:visible;opacity:1}.jessibuca-container .jessibuca-volume-panel{cursor:pointer;position:absolute;top:21px;height:60px;width:50px;overflow:hidden}.jessibuca-container .jessibuca-volume-panel-text{position:absolute;left:0;top:0;width:50px;height:20px;line-height:20px;text-align:center;color:#fff;font-size:12px}.jessibuca-container .jessibuca-volume-panel-handle{position:absolute;top:48px;left:50%;width:12px;height:12px;border-radius:12px;margin-left:-6px;background:#fff}.jessibuca-container .jessibuca-volume-panel-handle:before{bottom:-54px;background:#fff}.jessibuca-container .jessibuca-volume-panel-handle:after{bottom:6px;background:hsla(0,0%,100%,.2)}.jessibuca-container .jessibuca-volume-panel-handle:after,.jessibuca-container .jessibuca-volume-panel-handle:before{content:\"\";position:absolute;display:block;left:50%;width:3px;margin-left:-1px;height:60px}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-controls{width:100vh;transform:translateX(-13vw) translateY(-47.8vh) rotate(270deg);transition:width .5s ease-in}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-play-big:after{transform:rotate(270deg)}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-loading{flex-direction:row}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-loading-text{transform:rotate(270deg)}\n/*# sourceMappingURL=data:application/json;base64,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Q1osVUFBVyxDQUNYLGVBQWtCLENBRXBCLGtEQUNFLGlCQUFrQixDQUNsQixNQUFPLENBQ1AsS0FBTSxDQUNOLFVBQVcsQ0FDWCxXQUFZLENBQ1osZ0JBQWlCLENBQ2pCLGlCQUFrQixDQUNsQixVQUFXLENBQ1gsY0FBaUIsQ0FFbkIsb0RBQ0UsaUJBQWtCLENBQ2xCLFFBQVMsQ0FDVCxRQUFTLENBQ1QsVUFBVyxDQUNYLFdBQVksQ0FDWixrQkFBbUIsQ0FDbkIsZ0JBQWlCLENBQ2pCLGVBQWtCLENBQ2xCLDJEQUNFLFlBQWEsQ0FDYixlQUFrQixDQUNwQiwwREFDRSxVQUFXLENBQ1gsNkJBQXNDLENBQ3hDLHFIQUNFLFVBQVcsQ0FDWCxpQkFBa0IsQ0FDbEIsYUFBYyxDQUNkLFFBQVMsQ0FDVCxTQUFVLENBQ1YsZ0JBQWlCLENBQ2pCLFdBQWMsQ0FFbEIsa0VBQ0UsV0FBWSxDQUNaLDhEQUErRCxDQUMvRCw0QkFBK0IsQ0FFakMsd0VBQ0Usd0JBQTJCLENBRTdCLGlFQUNFLGtCQUFxQixDQUV2QixzRUFDRSx3QkFBMkIiLCJmaWxlIjoic3R5bGUuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbIkBrZXlmcmFtZXMgcm90YXRpb24ge1xuICBmcm9tIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XG4gIHRvIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0gfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWljb24ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHdpZHRoOiAxNnB4O1xuICBoZWlnaHQ6IDE2cHg7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1wb3N0ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDEwO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICBib3R0b206IDA7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1wbGF5LWJpZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZGlzcGxheTogbm9uZTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTAwJTtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQpOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtcGxheS1iaWc6YWZ0ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb250ZW50OiAnJztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogNTAlO1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiA0OHB4O1xuICAgIGhlaWdodDogNDhweDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIuLi9hc3NldHMvcGxheS5wbmdcIik7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1wbGF5LWJpZzpob3ZlcjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiLi4vYXNzZXRzL3BsYXktaG92ZXIucG5nXCIpOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtbG9hZGluZyB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDIwO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICBib3R0b206IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtbG9hZGluZy10ZXh0IHtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6ICNmZmY7XG4gIG1hcmdpbi10b3A6IDEwcHg7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1jb250cm9scyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxNjE2MTY7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogNDA7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICBib3R0b206IDA7XG4gIGhlaWdodDogMzhweDtcbiAgcGFkZGluZy1sZWZ0OiAxM3B4O1xuICBwYWRkaW5nLXJpZ2h0OiAxM3B4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgdHJhbnNpdGlvbjogd2lkdGggLjVzIGVhc2UtaW47IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1jb250cm9scyAuamVzc2lidWNhLWNvbnRyb2xzLWl0ZW0ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIHBhZGRpbmc6IDAgOHB4OyB9XG4gICAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1jb250cm9scyAuamVzc2lidWNhLWNvbnRyb2xzLWl0ZW06aG92ZXIgLmljb24tdGl0bGUtdGlwcyB7XG4gICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgICAgb3BhY2l0eTogMTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtbWljcm9waG9uZS1jbG9zZSB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtaWNvbi1hdWRpbyB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtcGxheSB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtcGF1c2Uge1xuICAgIGRpc3BsYXk6IG5vbmU7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1jb250cm9scyAuamVzc2lidWNhLWZ1bGxzY3JlZW4tZXhpdCB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2Etc2NyZWVuc2hvdCB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtcmVjb3JkIHtcbiAgICBkaXNwbGF5OiBub25lOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtY29udHJvbHMgLmplc3NpYnVjYS1mdWxsc2NyZWVuIHtcbiAgICBkaXNwbGF5OiBub25lOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtY29udHJvbHMgLmplc3NpYnVjYS1yZWNvcmQtc3RvcCB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtaWNvbi1hdWRpbywgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1jb250cm9scyAuamVzc2lidWNhLWljb24tbXV0ZSB7XG4gICAgei1pbmRleDogMTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtY29udHJvbHMtYm90dG9tIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBoZWlnaHQ6IDEwMCU7IH1cbiAgICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtY29udHJvbHMtYm90dG9tIC5qZXNzaWJ1Y2EtY29udHJvbHMtbGVmdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgfVxuICAgIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtY29udHJvbHMgLmplc3NpYnVjYS1jb250cm9scy1ib3R0b20gLmplc3NpYnVjYS1jb250cm9scy1yaWdodCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lci5qZXNzaWJ1Y2EtY29udHJvbHMtc2hvdyAuamVzc2lidWNhLWNvbnRyb2xzIHtcbiAgb3BhY2l0eTogMTtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lci5qZXNzaWJ1Y2EtY29udHJvbHMtc2hvdy1hdXRvLWhpZGUgLmplc3NpYnVjYS1jb250cm9scyB7XG4gIG9wYWNpdHk6IDAuODtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgZGlzcGxheTogbm9uZTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lci5qZXNzaWJ1Y2EtaGlkZS1jdXJzb3IgKiB7XG4gIGN1cnNvcjogbm9uZSAhaW1wb3J0YW50OyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1sb2FkaW5nIHtcbiAgd2lkdGg6IDUwcHg7XG4gIGhlaWdodDogNTBweDtcbiAgYmFja2dyb3VuZDogdXJsKFwiLi4vYXNzZXRzL2xvYWRpbmcucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xuICBhbmltYXRpb246IHJvdGF0aW9uIDFzIGxpbmVhciBpbmZpbml0ZTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWljb24tc2NyZWVuc2hvdCB7XG4gIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9zY3JlZW5zaG90LnBuZ1wiKSBuby1yZXBlYXQgY2VudGVyO1xuICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWljb24tc2NyZWVuc2hvdDpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogdXJsKFwiLi4vYXNzZXRzL3NjcmVlbnNob3QtaG92ZXIucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLXBsYXkge1xuICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvcGxheS5wbmdcIikgbm8tcmVwZWF0IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLXBsYXk6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9wbGF5LWhvdmVyLnBuZ1wiKSBuby1yZXBlYXQgY2VudGVyO1xuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1wYXVzZSB7XG4gIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9wYXVzZS5wbmdcIikgbm8tcmVwZWF0IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLXBhdXNlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvcGF1c2UtaG92ZXIucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLXJlY29yZCB7XG4gIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9yZWNvcmQucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1yZWNvcmQ6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9yZWNvcmQtaG92ZXIucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLXJlY29yZFN0b3Age1xuICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvcmVjb3JkLXN0b3AucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1yZWNvcmRTdG9wOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvcmVjb3JkLXN0b3AtaG92ZXIucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLWZ1bGxzY3JlZW4ge1xuICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvZnVsbHNjcmVlbi5wbmdcIikgbm8tcmVwZWF0IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLWZ1bGxzY3JlZW46aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9mdWxsc2NyZWVuLWhvdmVyLnBuZ1wiKSBuby1yZXBlYXQgY2VudGVyO1xuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1mdWxsc2NyZWVuRXhpdCB7XG4gIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9leGl0LWZ1bGxzY3JlZW4ucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1mdWxsc2NyZWVuRXhpdDpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogdXJsKFwiLi4vYXNzZXRzL2V4aXQtZnVsbHNjcmVlbi1ob3Zlci5wbmdcIikgbm8tcmVwZWF0IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWljb24tYXVkaW8ge1xuICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvYXVkaW8ucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1hdWRpbzpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogdXJsKFwiLi4vYXNzZXRzL2F1ZGlvLWhvdmVyLnBuZ1wiKSBuby1yZXBlYXQgY2VudGVyO1xuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1tdXRlIHtcbiAgYmFja2dyb3VuZDogdXJsKFwiLi4vYXNzZXRzL211dGUucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1tdXRlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvbXV0ZS1ob3Zlci5wbmdcIikgbm8tcmVwZWF0IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWljb24tdGV4dCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgd2lkdGg6IDMwcHg7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1zcGVlZCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgY29sb3I6ICNmZmY7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1xdWFsaXR5LW1lbnUtbGlzdCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogNTAlO1xuICBib3R0b206IDEwMCU7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDMwMG1zLCBvcGFjaXR5IDMwMG1zO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gIGJvcmRlci1yYWRpdXM6IDRweDsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLXF1YWxpdHktbWVudS1saXN0Lmplc3NpYnVjYS1xdWFsaXR5LW1lbnUtc2hvd24ge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgb3BhY2l0eTogMTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuaWNvbi10aXRsZS10aXBzIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogNTAlO1xuICBib3R0b206IDEwMCU7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDMwMG1zIGVhc2UgMHMsIG9wYWNpdHkgMzAwbXMgZWFzZSAwcztcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xuICBib3JkZXItcmFkaXVzOiA0cHg7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmljb24tdGl0bGUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDVweCAxMHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGNvbG9yOiB3aGl0ZTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLXF1YWxpdHktbWVudSB7XG4gIHBhZGRpbmc6IDhweCAwOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtcXVhbGl0eS1tZW51LWl0ZW0ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiAyNXB4O1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDAgMTBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDE0cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2lkdGg6IDUwcHg7XG4gIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7XG4gIHRyYW5zaXRpb246IGNvbG9yIDMwMG1zLCBiYWNrZ3JvdW5kLWNvbG9yIDMwMG1zOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtcXVhbGl0eS1tZW51LWl0ZW06aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLXF1YWxpdHktbWVudS1pdGVtOmZvY3VzIHtcbiAgICBvdXRsaW5lOiBub25lOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtcXVhbGl0eS1tZW51LWl0ZW0uamVzc2lidWNhLXF1YWxpdHktbWVudS1pdGVtLWFjdGl2ZSB7XG4gICAgY29sb3I6ICMyMjk4RkM7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS12b2x1bWUtcGFuZWwtd3JhcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogNTAlO1xuICBib3R0b206IDEwMCU7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoMjIlKTtcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAzMDBtcywgb3BhY2l0eSAzMDBtcztcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGhlaWdodDogMTIwcHg7XG4gIHdpZHRoOiA1MHB4O1xuICBvdmVyZmxvdzogaGlkZGVuOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2Etdm9sdW1lLXBhbmVsLXdyYXAuamVzc2lidWNhLXZvbHVtZS1wYW5lbC13cmFwLXNob3cge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgb3BhY2l0eTogMTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLXZvbHVtZS1wYW5lbCB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDIxcHg7XG4gIGhlaWdodDogNjBweDtcbiAgd2lkdGg6IDUwcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS12b2x1bWUtcGFuZWwtdGV4dCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMDtcbiAgdG9wOiAwO1xuICB3aWR0aDogNTBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1zaXplOiAxMnB4OyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2Etdm9sdW1lLXBhbmVsLWhhbmRsZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA0OHB4O1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAxMnB4O1xuICBoZWlnaHQ6IDEycHg7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gIG1hcmdpbi1sZWZ0OiAtNnB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2Etdm9sdW1lLXBhbmVsLWhhbmRsZTo6YmVmb3JlIHtcbiAgICBib3R0b206IC01NHB4O1xuICAgIGJhY2tncm91bmQ6ICNmZmY7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS12b2x1bWUtcGFuZWwtaGFuZGxlOjphZnRlciB7XG4gICAgYm90dG9tOiA2cHg7XG4gICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2Etdm9sdW1lLXBhbmVsLWhhbmRsZTo6YmVmb3JlLCAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLXZvbHVtZS1wYW5lbC1oYW5kbGU6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbGVmdDogNTAlO1xuICAgIHdpZHRoOiAzcHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgaGVpZ2h0OiA2MHB4OyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyLmplc3NpYnVjYS1mdWxsc2NyZWVuLXdlYiAuamVzc2lidWNhLWNvbnRyb2xzIHtcbiAgd2lkdGg6IDEwMHZoO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEzdncpIHRyYW5zbGF0ZVkoLTQ3Ljh2aCkgcm90YXRlKDI3MGRlZyk7XG4gIHRyYW5zaXRpb246IHdpZHRoIC41cyBlYXNlLWluOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyLmplc3NpYnVjYS1mdWxsc2NyZWVuLXdlYiAuamVzc2lidWNhLXBsYXktYmlnOmFmdGVyIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lci5qZXNzaWJ1Y2EtZnVsbHNjcmVlbi13ZWIgLmplc3NpYnVjYS1sb2FkaW5nIHtcbiAgZmxleC1kaXJlY3Rpb246IHJvdzsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lci5qZXNzaWJ1Y2EtZnVsbHNjcmVlbi13ZWIgLmplc3NpYnVjYS1sb2FkaW5nLXRleHQge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOyB9XG4iXX0= */";
- styleInject(css_248z$1);
-
- // todo: 待定
- var hotkey = ((player, control) => {
- const {
- events: {
- proxy
- }
- } = player;
- const keys = {};
-
- function addHotkey(key, event) {
- if (keys[key]) {
- keys[key].push(event);
- } else {
- keys[key] = [event];
- }
- } //
-
-
- addHotkey(HOT_KEY.esc, () => {
- if (player.fullscreen) {
- player.fullscreen = false;
- }
- }); //
-
- addHotkey(HOT_KEY.arrowUp, () => {
- player.volume += 0.05;
- }); //
-
- addHotkey(HOT_KEY.arrowDown, () => {
- player.volume -= 0.05;
- });
- proxy(window, 'keydown', event => {
- if (control.isFocus) {
- const tag = document.activeElement.tagName.toUpperCase();
- const editable = document.activeElement.getAttribute('contenteditable');
-
- if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {
- const events = keys[event.keyCode];
-
- if (events) {
- event.preventDefault();
- events.forEach(fn => fn());
- }
- }
- }
- });
- });
-
- class Control {
- constructor(player) {
- this.player = player;
- template(player, this);
- observer$1(player, this);
- property(player, this);
- events(player, this);
-
- if (player._opt.hotKey) {
- hotkey(player, this);
- }
-
- this.player.debug.log('Control', 'init');
- }
-
- destroy() {
- if (this.$poster) {
- this.player.$container.removeChild(this.$poster);
- }
-
- if (this.$loading) {
- this.player.$container.removeChild(this.$loading);
- }
-
- if (this.$controls) {
- this.player.$container.removeChild(this.$controls);
- }
-
- if (this.$playBig) {
- this.player.$container.removeChild(this.$playBig);
- }
-
- this.player.debug.log('control', 'destroy');
- }
-
- autoSize() {
- const player = this.player;
- player.$container.style.padding = '0 0';
- const playerWidth = player.width;
- const playerHeight = player.height;
- const playerRatio = playerWidth / playerHeight;
- const canvasWidth = player.video.$videoElement.width;
- const canvasHeight = player.video.$videoElement.height;
- const canvasRatio = canvasWidth / canvasHeight;
-
- if (playerRatio > canvasRatio) {
- const padding = (playerWidth - playerHeight * canvasRatio) / 2;
- player.$container.style.padding = `0 ${padding}px`;
- } else {
- const padding = (playerHeight - playerWidth / canvasRatio) / 2;
- player.$container.style.padding = `${padding}px 0`;
- }
- }
-
- }
-
- var css_248z = ".jessibuca-container{position:relative;width:100%;height:100%;overflow:hidden}.jessibuca-container.jessibuca-fullscreen-web{position:fixed;z-index:9999;left:0;top:0;right:0;bottom:0;width:100vw!important;height:100vh!important;background:#000}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUJBQ0UsaUJBQWtCLENBQ2xCLFVBQVcsQ0FDWCxXQUFZLENBQ1osZUFBa0IsQ0FDbEIsOENBQ0UsY0FBZSxDQUNmLFlBQWEsQ0FDYixNQUFPLENBQ1AsS0FBTSxDQUNOLE9BQVEsQ0FDUixRQUFTLENBQ1QscUJBQXVCLENBQ3ZCLHNCQUF3QixDQUN4QixlQUFrQiIsImZpbGUiOiJzdHlsZS5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmplc3NpYnVjYS1jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIuamVzc2lidWNhLWZ1bGxzY3JlZW4td2ViIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgei1pbmRleDogOTk5OTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDA7XG4gICAgd2lkdGg6IDEwMHZ3ICFpbXBvcnRhbnQ7XG4gICAgaGVpZ2h0OiAxMDB2aCAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQ6ICMwMDA7IH1cbiJdfQ== */";
- styleInject(css_248z);
-
- var observer = (player => {
- const {
- _opt,
- debug,
- events: {
- proxy
- }
- } = player;
-
- if (_opt.supportDblclickFullscreen) {
- proxy(player.$container, 'dblclick', () => {
- player.fullscreen = !player.fullscreen;
- });
- } //
-
-
- proxy(document, 'visibilitychange', () => {
- if (_opt.hiddenAutoPause) {
- debug.log('visibilitychange', document.visibilityState, player._isPlayingBeforePageHidden);
-
- if ("visible" === document.visibilityState) {
- if (player._isPlayingBeforePageHidden) {
- player.play();
- }
- } else {
- player._isPlayingBeforePageHidden = player.playing; // hidden
-
- if (player.playing) {
- player.pause();
- }
- }
- }
- });
- proxy(window, 'fullscreenchange', () => {
- //
- if (player.keepScreenOn !== null && "visible" === document.visibilityState) {
- player.enableWakeLock();
- }
- });
- });
-
- class MP4$1 {
- static init() {
- MP4$1.types = {
- avc1: [],
- avcC: [],
- hvc1: [],
- hvcC: [],
- btrt: [],
- dinf: [],
- dref: [],
- esds: [],
- ftyp: [],
- hdlr: [],
- mdat: [],
- mdhd: [],
- mdia: [],
- mfhd: [],
- minf: [],
- moof: [],
- moov: [],
- mp4a: [],
- mvex: [],
- mvhd: [],
- sdtp: [],
- stbl: [],
- stco: [],
- stsc: [],
- stsd: [],
- stsz: [],
- stts: [],
- tfdt: [],
- tfhd: [],
- traf: [],
- trak: [],
- trun: [],
- trex: [],
- tkhd: [],
- vmhd: [],
- smhd: []
- };
-
- for (let name in MP4$1.types) {
- if (MP4$1.types.hasOwnProperty(name)) {
- MP4$1.types[name] = [name.charCodeAt(0), name.charCodeAt(1), name.charCodeAt(2), name.charCodeAt(3)];
- }
- }
-
- let constants = MP4$1.constants = {};
- constants.FTYP = new Uint8Array([0x69, 0x73, 0x6F, 0x6D, // major_brand: isom
- 0x0, 0x0, 0x0, 0x1, // minor_version: 0x01
- 0x69, 0x73, 0x6F, 0x6D, // isom
- 0x61, 0x76, 0x63, 0x31 // avc1
- ]);
- constants.STSD_PREFIX = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
- 0x00, 0x00, 0x00, 0x01 // entry_count
- ]);
- constants.STTS = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
- 0x00, 0x00, 0x00, 0x00 // entry_count
- ]);
- constants.STSC = constants.STCO = constants.STTS;
- constants.STSZ = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
- 0x00, 0x00, 0x00, 0x00, // sample_size
- 0x00, 0x00, 0x00, 0x00 // sample_count
- ]);
- constants.HDLR_VIDEO = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
- 0x00, 0x00, 0x00, 0x00, // pre_defined
- 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'
- 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler
- ]);
- constants.HDLR_AUDIO = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
- 0x00, 0x00, 0x00, 0x00, // pre_defined
- 0x73, 0x6F, 0x75, 0x6E, // handler_type: 'soun'
- 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x6F, 0x75, 0x6E, 0x64, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler
- ]);
- constants.DREF = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
- 0x00, 0x00, 0x00, 0x01, // entry_count
- 0x00, 0x00, 0x00, 0x0C, // entry_size
- 0x75, 0x72, 0x6C, 0x20, // type 'url '
- 0x00, 0x00, 0x00, 0x01 // version(0) + flags
- ]); // Sound media header
-
- constants.SMHD = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
- 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)
- ]); // video media header
-
- constants.VMHD = new Uint8Array([0x00, 0x00, 0x00, 0x01, // version(0) + flags
- 0x00, 0x00, // graphicsmode: 2 bytes
- 0x00, 0x00, 0x00, 0x00, // opcolor: 3 * 2 bytes
- 0x00, 0x00]);
- } // Generate a box
-
-
- static box(type) {
- let size = 8;
- let result = null;
- let datas = Array.prototype.slice.call(arguments, 1);
- let arrayCount = datas.length;
-
- for (let i = 0; i < arrayCount; i++) {
- size += datas[i].byteLength;
- }
-
- result = new Uint8Array(size);
- result[0] = size >>> 24 & 0xFF; // size
-
- result[1] = size >>> 16 & 0xFF;
- result[2] = size >>> 8 & 0xFF;
- result[3] = size & 0xFF;
- result.set(type, 4); // type
-
- let offset = 8;
-
- for (let i = 0; i < arrayCount; i++) {
- // data body
- result.set(datas[i], offset);
- offset += datas[i].byteLength;
- }
-
- return result;
- } // emit ftyp & moov
-
-
- static generateInitSegment(meta) {
- let ftyp = MP4$1.box(MP4$1.types.ftyp, MP4$1.constants.FTYP);
- let moov = MP4$1.moov(meta);
- let result = new Uint8Array(ftyp.byteLength + moov.byteLength);
- result.set(ftyp, 0);
- result.set(moov, ftyp.byteLength);
- return result;
- } // Movie metadata box
-
-
- static moov(meta) {
- let mvhd = MP4$1.mvhd(meta.timescale, meta.duration);
- let trak = MP4$1.trak(meta);
- let mvex = MP4$1.mvex(meta);
- return MP4$1.box(MP4$1.types.moov, mvhd, trak, mvex);
- } // Movie header box
-
-
- static mvhd(timescale, duration) {
- return MP4$1.box(MP4$1.types.mvhd, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
- 0x00, 0x00, 0x00, 0x00, // creation_time
- 0x00, 0x00, 0x00, 0x00, // modification_time
- timescale >>> 24 & 0xFF, // timescale: 4 bytes
- timescale >>> 16 & 0xFF, timescale >>> 8 & 0xFF, timescale & 0xFF, duration >>> 24 & 0xFF, // duration: 4 bytes
- duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0
- 0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)
- 0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----
- 0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----
- 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID
- ]));
- } // Track box
-
-
- static trak(meta) {
- return MP4$1.box(MP4$1.types.trak, MP4$1.tkhd(meta), MP4$1.mdia(meta));
- } // Track header box
-
-
- static tkhd(meta) {
- let trackId = meta.id,
- duration = meta.duration;
- let width = meta.presentWidth,
- height = meta.presentHeight;
- return MP4$1.box(MP4$1.types.tkhd, new Uint8Array([0x00, 0x00, 0x00, 0x07, // version(0) + flags
- 0x00, 0x00, 0x00, 0x00, // creation_time
- 0x00, 0x00, 0x00, 0x00, // modification_time
- trackId >>> 24 & 0xFF, // track_ID: 4 bytes
- trackId >>> 16 & 0xFF, trackId >>> 8 & 0xFF, trackId & 0xFF, 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes
- duration >>> 24 & 0xFF, // duration: 4 bytes
- duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes)
- 0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes)
- 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----
- width >>> 8 & 0xFF, // width and height
- width & 0xFF, 0x00, 0x00, height >>> 8 & 0xFF, height & 0xFF, 0x00, 0x00]));
- }
-
- static mdia(meta) {
- return MP4$1.box(MP4$1.types.mdia, MP4$1.mdhd(meta), MP4$1.hdlr(meta), MP4$1.minf(meta));
- } // Media header box
-
-
- static mdhd(meta) {
- let timescale = meta.timescale;
- let duration = meta.duration;
- return MP4$1.box(MP4$1.types.mdhd, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
- 0x00, 0x00, 0x00, 0x00, // creation_time
- 0x00, 0x00, 0x00, 0x00, // modification_time
- timescale >>> 24 & 0xFF, // timescale: 4 bytes
- timescale >>> 16 & 0xFF, timescale >>> 8 & 0xFF, timescale & 0xFF, duration >>> 24 & 0xFF, // duration: 4 bytes
- duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x55, 0xC4, // language: und (undetermined)
- 0x00, 0x00 // pre_defined = 0
- ]));
- } // Media handler reference box
-
-
- static hdlr(meta) {
- let data = null;
-
- if (meta.type === 'audio') {
- data = MP4$1.constants.HDLR_AUDIO;
- } else {
- data = MP4$1.constants.HDLR_VIDEO;
- }
-
- return MP4$1.box(MP4$1.types.hdlr, data);
- } // Media infomation box
-
-
- static minf(meta) {
- let xmhd = null;
-
- if (meta.type === 'audio') {
- xmhd = MP4$1.box(MP4$1.types.smhd, MP4$1.constants.SMHD);
- } else {
- xmhd = MP4$1.box(MP4$1.types.vmhd, MP4$1.constants.VMHD);
- }
-
- return MP4$1.box(MP4$1.types.minf, xmhd, MP4$1.dinf(), MP4$1.stbl(meta));
- } // Data infomation box
-
-
- static dinf() {
- let result = MP4$1.box(MP4$1.types.dinf, MP4$1.box(MP4$1.types.dref, MP4$1.constants.DREF));
- return result;
- } // Sample table box
-
-
- static stbl(meta) {
- let result = MP4$1.box(MP4$1.types.stbl, // type: stbl
- MP4$1.stsd(meta), // Sample Description Table
- MP4$1.box(MP4$1.types.stts, MP4$1.constants.STTS), // Time-To-Sample
- MP4$1.box(MP4$1.types.stsc, MP4$1.constants.STSC), // Sample-To-Chunk
- MP4$1.box(MP4$1.types.stsz, MP4$1.constants.STSZ), // Sample size
- MP4$1.box(MP4$1.types.stco, MP4$1.constants.STCO) // Chunk offset
- );
- return result;
- } // Sample description box
-
-
- static stsd(meta) {
- if (meta.type === 'audio') {
- // else: aac -> mp4a
- return MP4$1.box(MP4$1.types.stsd, MP4$1.constants.STSD_PREFIX, MP4$1.mp4a(meta));
- } else {
- if (meta.videoType === 'avc') {
- //
- return MP4$1.box(MP4$1.types.stsd, MP4$1.constants.STSD_PREFIX, MP4$1.avc1(meta));
- } else {
- //
- return MP4$1.box(MP4$1.types.stsd, MP4$1.constants.STSD_PREFIX, MP4$1.hvc1(meta));
- }
- }
- }
-
- static mp4a(meta) {
- let channelCount = meta.channelCount;
- let sampleRate = meta.audioSampleRate;
- let data = new Uint8Array([0x00, 0x00, 0x00, 0x00, // reserved(4)
- 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)
- 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes
- 0x00, 0x00, 0x00, 0x00, 0x00, channelCount, // channelCount(2)
- 0x00, 0x10, // sampleSize(2)
- 0x00, 0x00, 0x00, 0x00, // reserved(4)
- sampleRate >>> 8 & 0xFF, // Audio sample rate
- sampleRate & 0xFF, 0x00, 0x00]);
- return MP4$1.box(MP4$1.types.mp4a, data, MP4$1.esds(meta));
- }
-
- static esds(meta) {
- let config = meta.config || [];
- let configSize = config.length;
- let data = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version 0 + flags
- 0x03, // descriptor_type
- 0x17 + configSize, // length3
- 0x00, 0x01, // es_id
- 0x00, // stream_priority
- 0x04, // descriptor_type
- 0x0F + configSize, // length
- 0x40, // codec: mpeg4_audio
- 0x15, // stream_type: Audio
- 0x00, 0x00, 0x00, // buffer_size
- 0x00, 0x00, 0x00, 0x00, // maxBitrate
- 0x00, 0x00, 0x00, 0x00, // avgBitrate
- 0x05 // descriptor_type
- ].concat([configSize]).concat(config).concat([0x06, 0x01, 0x02 // GASpecificConfig
- ]));
- return MP4$1.box(MP4$1.types.esds, data);
- } // avc
-
-
- static avc1(meta) {
- let avcc = meta.avcc;
- const width = meta.codecWidth;
- const height = meta.codecHeight;
- let data = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, width >>> 8 & 255, width & 255, height >>> 8 & 255, height & 255, 0, 72, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 255, 255]);
- return MP4$1.box(MP4$1.types.avc1, data, MP4$1.box(MP4$1.types.avcC, avcc));
- } // hvc
-
-
- static hvc1(meta) {
- let avcc = meta.avcc;
- const width = meta.codecWidth;
- const height = meta.codecHeight;
- let data = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, width >>> 8 & 255, width & 255, height >>> 8 & 255, height & 255, 0, 72, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 255, 255]);
- return MP4$1.box(MP4$1.types.hvc1, data, MP4$1.box(MP4$1.types.hvcC, avcc));
- } // Movie Extends box
-
-
- static mvex(meta) {
- return MP4$1.box(MP4$1.types.mvex, MP4$1.trex(meta));
- } // Track Extends box
-
-
- static trex(meta) {
- let trackId = meta.id;
- let data = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
- trackId >>> 24 & 0xFF, // track_ID
- trackId >>> 16 & 0xFF, trackId >>> 8 & 0xFF, trackId & 0xFF, 0x00, 0x00, 0x00, 0x01, // default_sample_description_index
- 0x00, 0x00, 0x00, 0x00, // default_sample_duration
- 0x00, 0x00, 0x00, 0x00, // default_sample_size
- 0x00, 0x01, 0x00, 0x01 // default_sample_flags
- ]);
- return MP4$1.box(MP4$1.types.trex, data);
- } // Movie fragment box
-
-
- static moof(track, baseMediaDecodeTime) {
- return MP4$1.box(MP4$1.types.moof, MP4$1.mfhd(track.sequenceNumber), MP4$1.traf(track, baseMediaDecodeTime));
- } //
-
-
- static mfhd(sequenceNumber) {
- let data = new Uint8Array([0x00, 0x00, 0x00, 0x00, sequenceNumber >>> 24 & 0xFF, // sequence_number: int32
- sequenceNumber >>> 16 & 0xFF, sequenceNumber >>> 8 & 0xFF, sequenceNumber & 0xFF]);
- return MP4$1.box(MP4$1.types.mfhd, data);
- } // Track fragment box
-
-
- static traf(track, baseMediaDecodeTime) {
- let trackId = track.id; // Track fragment header box
-
- let tfhd = MP4$1.box(MP4$1.types.tfhd, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) & flags
- trackId >>> 24 & 0xFF, // track_ID
- trackId >>> 16 & 0xFF, trackId >>> 8 & 0xFF, trackId & 0xFF])); // Track Fragment Decode Time
-
- let tfdt = MP4$1.box(MP4$1.types.tfdt, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) & flags
- baseMediaDecodeTime >>> 24 & 0xFF, // baseMediaDecodeTime: int32
- baseMediaDecodeTime >>> 16 & 0xFF, baseMediaDecodeTime >>> 8 & 0xFF, baseMediaDecodeTime & 0xFF]));
- let sdtp = MP4$1.sdtp(track);
- let trun = MP4$1.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);
- return MP4$1.box(MP4$1.types.traf, tfhd, tfdt, trun, sdtp);
- } // Sample Dependency Type box
-
-
- static sdtp(track) {
- let data = new Uint8Array(4 + 1);
- let flags = track.flags;
- data[4] = flags.isLeading << 6 | flags.dependsOn << 4 | flags.isDependedOn << 2 | flags.hasRedundancy;
- return MP4$1.box(MP4$1.types.sdtp, data);
- } // trun
-
-
- static trun(track, offset) {
- let dataSize = 12 + 16;
- let data = new Uint8Array(dataSize);
- offset += 8 + dataSize;
- data.set([0x00, 0x00, 0x0F, 0x01, // version(0) & flags
- 0x00, 0x00, 0x00, 0x01, // sample_count
- offset >>> 24 & 0xFF, // data_offset
- offset >>> 16 & 0xFF, offset >>> 8 & 0xFF, offset & 0xFF], 0);
- let duration = track.duration;
- let size = track.size;
- let flags = track.flags;
- let cts = track.cts;
- data.set([duration >>> 24 & 0xFF, // sample_duration
- duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, size >>> 24 & 0xFF, // sample_size
- size >>> 16 & 0xFF, size >>> 8 & 0xFF, size & 0xFF, flags.isLeading << 2 | flags.dependsOn, // sample_flags
- flags.isDependedOn << 6 | flags.hasRedundancy << 4 | flags.isNonSync, 0x00, 0x00, // sample_degradation_priority
- cts >>> 24 & 0xFF, // sample_composition_time_offset
- cts >>> 16 & 0xFF, cts >>> 8 & 0xFF, cts & 0xFF], 12);
- return MP4$1.box(MP4$1.types.trun, data);
- } // mdat
-
-
- static mdat(data) {
- return MP4$1.box(MP4$1.types.mdat, data);
- }
-
- }
-
- MP4$1.init();
-
- /*
- * Copyright (C) 2016 Bilibili. All Rights Reserved.
- *
- * @author zheng qian
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- // Exponential-Golomb buffer decoder
- class ExpGolomb {
- constructor(uint8array) {
- this.TAG = 'ExpGolomb';
- this._buffer = uint8array;
- this._buffer_index = 0;
- this._total_bytes = uint8array.byteLength;
- this._total_bits = uint8array.byteLength * 8;
- this._current_word = 0;
- this._current_word_bits_left = 0;
- }
-
- destroy() {
- this._buffer = null;
- }
-
- _fillCurrentWord() {
- let buffer_bytes_left = this._total_bytes - this._buffer_index;
-
- let bytes_read = Math.min(4, buffer_bytes_left);
- let word = new Uint8Array(4);
- word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));
- this._current_word = new DataView(word.buffer).getUint32(0, false);
- this._buffer_index += bytes_read;
- this._current_word_bits_left = bytes_read * 8;
- }
-
- readBits(bits) {
-
- if (bits <= this._current_word_bits_left) {
- let result = this._current_word >>> 32 - bits;
- this._current_word <<= bits;
- this._current_word_bits_left -= bits;
- return result;
- }
-
- let result = this._current_word_bits_left ? this._current_word : 0;
- result = result >>> 32 - this._current_word_bits_left;
- let bits_need_left = bits - this._current_word_bits_left;
-
- this._fillCurrentWord();
-
- let bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);
- let result2 = this._current_word >>> 32 - bits_read_next;
- this._current_word <<= bits_read_next;
- this._current_word_bits_left -= bits_read_next;
- result = result << bits_read_next | result2;
- return result;
- }
-
- readBool() {
- return this.readBits(1) === 1;
- }
-
- readByte() {
- return this.readBits(8);
- }
-
- _skipLeadingZero() {
- let zero_count;
-
- for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {
- if (0 !== (this._current_word & 0x80000000 >>> zero_count)) {
- this._current_word <<= zero_count;
- this._current_word_bits_left -= zero_count;
- return zero_count;
- }
- }
-
- this._fillCurrentWord();
-
- return zero_count + this._skipLeadingZero();
- }
-
- readUEG() {
- // unsigned exponential golomb
- let leading_zeros = this._skipLeadingZero();
-
- return this.readBits(leading_zeros + 1) - 1;
- }
-
- readSEG() {
- // signed exponential golomb
- let value = this.readUEG();
-
- if (value & 0x01) {
- return value + 1 >>> 1;
- } else {
- return -1 * (value >>> 1);
- }
- }
-
- }
-
- /*
- * Copyright (C) 2016 Bilibili. All Rights Reserved.
- *
- * @author zheng qian
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- class SPSParser$1 {
- static _ebsp2rbsp(uint8array) {
- let src = uint8array;
- let src_length = src.byteLength;
- let dst = new Uint8Array(src_length);
- let dst_idx = 0;
-
- for (let i = 0; i < src_length; i++) {
- if (i >= 2) {
- // Unescape: Skip 0x03 after 00 00
- if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {
- continue;
- }
- }
+ Object.defineProperty(control, '$poster', {
+ value: player.$container.querySelector('.jessibuca-poster')
+ });
+ Object.defineProperty(control, '$loading', {
+ value: player.$container.querySelector('.jessibuca-loading')
+ });
+ Object.defineProperty(control, '$play', {
+ value: player.$container.querySelector('.jessibuca-play')
+ });
+ Object.defineProperty(control, '$playBig', {
+ value: player.$container.querySelector('.jessibuca-play-big')
+ });
+ Object.defineProperty(control, '$pause', {
+ value: player.$container.querySelector('.jessibuca-pause')
+ });
+ Object.defineProperty(control, '$controls', {
+ value: player.$container.querySelector('.jessibuca-controls')
+ });
+ Object.defineProperty(control, '$fullscreen', {
+ value: player.$container.querySelector('.jessibuca-fullscreen')
+ });
+ Object.defineProperty(control, '$fullscreen', {
+ value: player.$container.querySelector('.jessibuca-fullscreen')
+ });
+ Object.defineProperty(control, '$volume', {
+ value: player.$container.querySelector('.jessibuca-volume')
+ });
+ Object.defineProperty(control, '$volumePanelWrap', {
+ value: player.$container.querySelector('.jessibuca-volume-panel-wrap')
+ });
+ Object.defineProperty(control, '$volumePanelText', {
+ value: player.$container.querySelector('.jessibuca-volume-panel-text')
+ });
+ Object.defineProperty(control, '$volumePanel', {
+ value: player.$container.querySelector('.jessibuca-volume-panel')
+ });
+ Object.defineProperty(control, '$volumeHandle', {
+ value: player.$container.querySelector('.jessibuca-volume-panel-handle')
+ });
+ Object.defineProperty(control, '$volumeOn', {
+ value: player.$container.querySelector('.jessibuca-icon-audio')
+ });
+ Object.defineProperty(control, '$volumeOff', {
+ value: player.$container.querySelector('.jessibuca-icon-mute')
+ });
+ Object.defineProperty(control, '$fullscreen', {
+ value: player.$container.querySelector('.jessibuca-fullscreen')
+ });
+ Object.defineProperty(control, '$fullscreenExit', {
+ value: player.$container.querySelector('.jessibuca-fullscreen-exit')
+ });
+ Object.defineProperty(control, '$record', {
+ value: player.$container.querySelector('.jessibuca-record')
+ });
+ Object.defineProperty(control, '$recordStop', {
+ value: player.$container.querySelector('.jessibuca-record-stop')
+ });
+ Object.defineProperty(control, '$screenshot', {
+ value: player.$container.querySelector('.jessibuca-screenshot')
+ });
+ Object.defineProperty(control, '$speed', {
+ value: player.$container.querySelector('.jessibuca-speed')
+ });
+ });
+
+ var observer$1 = ((player, control) => {
+ const {
+ events: {
+ proxy
+ }
+ } = player;
+ const object = document.createElement('object');
+ object.setAttribute('aria-hidden', 'true');
+ object.setAttribute('tabindex', -1);
+ object.type = 'text/html';
+ object.data = 'about:blank';
+ setStyle(object, {
+ display: 'block',
+ position: 'absolute',
+ top: '0',
+ left: '0',
+ height: '100%',
+ width: '100%',
+ overflow: 'hidden',
+ pointerEvents: 'none',
+ zIndex: '-1'
+ });
+ let playerWidth = player.width;
+ let playerHeight = player.height;
+ proxy(object, 'load', () => {
+ proxy(object.contentDocument.defaultView, 'resize', () => {
+ if (player.width !== playerWidth || player.height !== playerHeight) {
+ playerWidth = player.width;
+ playerHeight = player.height;
+ player.emit(EVENTS.resize);
+ }
+ });
+ });
+ player.$container.appendChild(object);
+ player.on(EVENTS.destroy, () => {
+ player.$container.removeChild(object);
+ });
+
+ function setVolumeHandle(percentage) {
+ if (percentage === 0) {
+ setStyle(control.$volumeOn, 'display', 'none');
+ setStyle(control.$volumeOff, 'display', 'flex');
+ setStyle(control.$volumeHandle, 'top', `${48}px`);
+ } else {
+ if (control.$volumeHandle && control.$volumePanel) {
+ const panelHeight = getStyle(control.$volumePanel, 'height') || 60;
+ const handleHeight = getStyle(control.$volumeHandle, 'height');
+ const top = panelHeight - (panelHeight - handleHeight) * percentage - handleHeight;
+ setStyle(control.$volumeHandle, 'top', `${top}px`);
+ setStyle(control.$volumeOn, 'display', 'flex');
+ setStyle(control.$volumeOff, 'display', 'none');
+ }
+ }
+
+ control.$volumePanelText && (control.$volumePanelText.innerHTML = parseInt(percentage * 100));
+ }
+
+ player.on(EVENTS.volumechange, () => {
+ setVolumeHandle(player.volume);
+ });
+ player.on(EVENTS.loading, flag => {
+ setStyle(control.$loading, 'display', flag ? 'flex' : 'none');
+ setStyle(control.$poster, 'display', 'none');
+
+ if (flag) {
+ setStyle(control.$playBig, 'display', 'none');
+ }
+ });
+
+ const screenfullChange = fullscreen => {
+ let isFullScreen = isBoolean(fullscreen) ? fullscreen : player.fullscreen;
+ setStyle(control.$fullscreenExit, 'display', isFullScreen ? 'flex' : 'none');
+ setStyle(control.$fullscreen, 'display', isFullScreen ? 'none' : 'flex'); // control.autoSize();
+ };
+
+ try {
+ screenfull.on('change', screenfullChange);
+ player.events.destroys.push(() => {
+ screenfull.off('change', screenfullChange);
+ });
+ } catch (error) {//
+ } //
+
+
+ player.on(EVENTS.webFullscreen, value => {
+ screenfullChange(value);
+ });
+ player.on(EVENTS.recording, () => {
+ setStyle(control.$record, 'display', player.recording ? 'none' : 'flex');
+ setStyle(control.$recordStop, 'display', player.recording ? 'flex' : 'none');
+ }); //
+
+ player.on(EVENTS.recordingTimestamp, timestamp => {// console.log(timestamp);
+ });
+ player.on(EVENTS.playing, flag => {
+ setStyle(control.$play, 'display', flag ? 'none' : 'flex');
+ setStyle(control.$playBig, 'display', flag ? 'none' : 'block');
+ setStyle(control.$pause, 'display', flag ? 'flex' : 'none');
+ setStyle(control.$screenshot, 'display', flag ? 'flex' : 'none');
+ setStyle(control.$record, 'display', flag ? 'flex' : 'none');
+ setStyle(control.$fullscreen, 'display', flag ? 'flex' : 'none'); // 不在播放
+
+ if (!flag) {
+ control.$speed && (control.$speed.innerHTML = bpsSize(''));
+ }
+ });
+ player.on(EVENTS.kBps, rate => {
+ const bps = bpsSize(rate);
+ control.$speed && (control.$speed.innerHTML = bps);
+ });
+ });
+
+ var property = ((player, control) => {
+ Object.defineProperty(control, 'controlsRect', {
+ get: () => {
+ return control.$controls.getBoundingClientRect();
+ }
+ });
+ });
+
+ var events = ((player, control) => {
+ const {
+ events: {
+ proxy
+ },
+ debug
+ } = player;
+
+ function volumeChangeFromEvent(event) {
+ const {
+ bottom: panelBottom,
+ height: panelHeight
+ } = control.$volumePanel.getBoundingClientRect();
+ const {
+ height: handleHeight
+ } = control.$volumeHandle.getBoundingClientRect();
+ let moveLen = event.y; // if (isMobile() && player.fullscreen) {
+ // moveLen = event.x;
+ // }
+
+ const percentage = clamp(panelBottom - moveLen - handleHeight / 2, 0, panelHeight - handleHeight / 2) / (panelHeight - handleHeight);
+ return percentage;
+ } //
+
+
+ proxy(window, ['click', 'contextmenu'], event => {
+ if (event.composedPath().indexOf(player.$container) > -1) {
+ control.isFocus = true;
+ } else {
+ control.isFocus = false;
+ }
+ }); //
+
+ proxy(window, 'orientationchange', () => {
+ setTimeout(() => {
+ player.resize();
+ }, 300);
+ });
+ proxy(control.$controls, 'click', e => {
+ e.stopPropagation();
+ });
+ proxy(control.$pause, 'click', e => {
+ player.pause();
+ }); // 监听 play 方法
+
+ proxy(control.$play, 'click', e => {
+ player.play();
+ }); // 监听 play 方法
+
+ proxy(control.$playBig, 'click', e => {
+ player.play();
+ });
+ proxy(control.$volume, 'mouseover', () => {
+ control.$volumePanelWrap.classList.add('jessibuca-volume-panel-wrap-show');
+ });
+ proxy(control.$volume, 'mouseout', () => {
+ control.$volumePanelWrap.classList.remove('jessibuca-volume-panel-wrap-show');
+ });
+ proxy(control.$volumeOn, 'click', e => {
+ e.stopPropagation();
+ setStyle(control.$volumeOn, 'display', 'none');
+ setStyle(control.$volumeOff, 'display', 'block');
+ player.lastVolume = player.volume;
+ player.volume = 0;
+ });
+ proxy(control.$volumeOff, 'click', e => {
+ e.stopPropagation();
+ setStyle(control.$volumeOn, 'display', 'block');
+ setStyle(control.$volumeOff, 'display', 'none');
+ player.volume = player.lastVolume || 0.5;
+ });
+ proxy(control.$screenshot, 'click', e => {
+ e.stopPropagation();
+ player.video.screenshot();
+ });
+ proxy(control.$volumePanel, 'click', event => {
+ event.stopPropagation();
+ player.volume = volumeChangeFromEvent(event);
+ });
+ proxy(control.$volumeHandle, 'mousedown', () => {
+ control.isVolumeDroging = true;
+ });
+ proxy(control.$volumeHandle, 'mousemove', event => {
+ if (control.isVolumeDroging) {
+ player.volume = volumeChangeFromEvent(event);
+ }
+ });
+ proxy(document, 'mouseup', () => {
+ if (control.isVolumeDroging) {
+ control.isVolumeDroging = false;
+ }
+ });
+ proxy(control.$record, 'click', e => {
+ e.stopPropagation();
+ player.recording = true;
+ });
+ proxy(control.$recordStop, 'click', e => {
+ e.stopPropagation();
+ player.recording = false;
+ });
+ proxy(control.$fullscreen, 'click', e => {
+ e.stopPropagation();
+ player.fullscreen = true;
+ });
+ proxy(control.$fullscreenExit, 'click', e => {
+ e.stopPropagation();
+ player.fullscreen = false;
+ });
+
+ if (player._opt.hasControl && player._opt.controlAutoHide) {
+ //
+ proxy(player.$container, 'mouseover', () => {
+ if (!player.fullscreen) {
+ setStyle(control.$controls, 'display', 'block');
+ }
+ });
+ proxy(player.$container, 'mouseout', () => {
+ setStyle(control.$controls, 'display', 'none');
+ });
+ }
+ });
+
+ function styleInject(css, ref) {
+ if ( ref === void 0 ) ref = {};
+ var insertAt = ref.insertAt;
+
+ if (!css || typeof document === 'undefined') { return; }
+
+ var head = document.head || document.getElementsByTagName('head')[0];
+ var style = document.createElement('style');
+ style.type = 'text/css';
+
+ if (insertAt === 'top') {
+ if (head.firstChild) {
+ head.insertBefore(style, head.firstChild);
+ } else {
+ head.appendChild(style);
+ }
+ } else {
+ head.appendChild(style);
+ }
+
+ if (style.styleSheet) {
+ style.styleSheet.cssText = css;
+ } else {
+ style.appendChild(document.createTextNode(css));
+ }
+ }
+
+ var css_248z$1 = "@keyframes rotation{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}.jessibuca-container .jessibuca-icon{cursor:pointer;width:16px;height:16px}.jessibuca-container .jessibuca-poster{position:absolute;z-index:10;left:0;top:0;right:0;bottom:0;height:100%;width:100%;background-position:50%;background-repeat:no-repeat;background-size:contain;pointer-events:none}.jessibuca-container .jessibuca-play-big{position:absolute;display:none;height:100%;width:100%;background:rgba(0,0,0,.4)}.jessibuca-container .jessibuca-play-big:after{cursor:pointer;content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:block;width:48px;height:48px;background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACgklEQVRoQ+3ZPYsTQRjA8eeZZCFlWttAwCIkZOaZJt8hlvkeHrlccuAFT6wEG0FQOeQQLCIWih6chQgKgkkKIyqKCVYip54IWmiQkTmyYhFvd3Zn3yDb7szu/7cv7GaDkPEFM94PK0DSZ9DzDAyHw7uI2HRDlVJX5/N5r9FoHCYdr/fvCRiNRmpJ6AEidoUQ15NG+AH8BgD2n9AHANAmohdJQfwAfgGA4xF4bjabnW21Whob62ILoKNfAsAGEd2PU2ATcNSNiDf0/cE5/xAHxDpgEf0NADaJ6HLUiKgAbvcjpdSGlPJZVJCoAUfdSqkLxWLxTLlc/mkbEgtgET1TSnWklLdtIuIEuN23crlcp16vv7cBSQKgu38AwBYRXQyLSArg3hsjRDxNRE+CQhIF/BN9qVAobFYqle+mkLQAdLd+8K0T0U0TRJoAbvc9fVkJId75gaQRoLv1C2STiPTb7rFLWgE6+g0RncwyYEJEtawCvjDGmpzzp5kD6NfxfD7frtVqB17xen2a7oG3ALBm+oMoFQBEPD+dTvtBfpImDXjIGFvjnD/3c7ksG5MU4HDxWeZa0HB3XhKAXcdxOn5vUi9gnIDXSqm2lHLPK8pkfVyAbSLqm4T5HRs1YB8RO0KIid8g03FRAT4rpbpSyh3TINPxUQB2GGM9zvkn05gg420CJovLZT9ISNA5tgB9ItoOGhFmnh/AcZ/X9xhj65zzV2Eiwsz1A1j2B8dHAOgS0W6YnduY6wkYj8d3lFKn/j66Ea84jtOrVqtfbQSE3YYnYDAY5Eql0hYAnNDv6kKIx2F3anO+J8DmzqLY1goQxVE12ebqDJgcrSjGrs5AFEfVZJt/AF0m+jHzUTtnAAAAAElFTkSuQmCC\");background-repeat:no-repeat;background-position:50%}.jessibuca-container .jessibuca-play-big:hover:after{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACEElEQVRoQ+2ZXStEQRjH/3/yIXwDdz7J+i7kvdisXCk3SiFJW27kglBcSFFKbqwQSa4krykuKB09Naf2Yndn5jgzc06d53Znd36/mWfeniVyHsw5PwqB0DOonYEoijYBlOpAFwCMkHwLDS/9mwhEDUCfAAyTXA4tYSLwC6CtCegegH6S56FETAR+AHRoACcBTJAUWa+RloBAXwAYIrnt0yBNgZi7qtbHgw8RFwLC/QFglOScawlXAjH3gUqrE1cirgVi7mkAYyS/0xbxJSDcdwAGSa6nKeFTIOZeUyL3aYiEEBDuLwDjJGf+KxFKIOY+BdBL8iipSGiBmHtWbbuftiJZERBuOfgGSK7aSGRJIObeUml1ayKSRQHhlgtkiaTcdltGVgUE+ppkV54FaiS78yrwqlLoOI8Cch2XV548W7WRpTVwA6DP9kGUFYEpAOUkT9LQAvtq1M+0udKkQSgBqSlJWWYxKXj8vRACK+o6bbRIdYI+Ba7U7rKjg7L53JdAhWTZBsy0rWuBXZUuNVMg23auBF7UIl2yBbJt70JAoKV6/WwLk6R9mgKSJlJ1kLTxFmkJyCla8UZd15GJQKvyumyJ8gy8DAEvfZoINPqD41EtUjmUgoaJwAaAnjrKebVI34OSq85NBNqlCAWgE0CV5GEWwI3vQlmCbcSinYFCwPEIFDPgeIC1P1/MgHaIHDf4Aydx2TF7wnKeAAAAAElFTkSuQmCC\")}.jessibuca-container .jessibuca-loading{display:none;flex-direction:column;justify-content:center;align-items:center;position:absolute;z-index:20;left:0;top:0;right:0;bottom:0;width:100%;height:100%;pointer-events:none}.jessibuca-container .jessibuca-loading-text{line-height:20px;font-size:13px;color:#fff;margin-top:10px}.jessibuca-container .jessibuca-controls{background-color:#161616;box-sizing:border-box;display:flex;flex-direction:column;justify-content:flex-end;position:absolute;z-index:40;left:0;right:0;bottom:0;height:38px;padding-left:13px;padding-right:13px;font-size:14px;color:#fff;opacity:0;visibility:hidden;transition:all .2s ease-in-out;-webkit-user-select:none;user-select:none;transition:width .5s ease-in}.jessibuca-container .jessibuca-controls .jessibuca-controls-item{position:relative;display:flex;justify-content:center;padding:0 8px}.jessibuca-container .jessibuca-controls .jessibuca-controls-item:hover .icon-title-tips{visibility:visible;opacity:1}.jessibuca-container .jessibuca-controls .jessibuca-fullscreen,.jessibuca-container .jessibuca-controls .jessibuca-fullscreen-exit,.jessibuca-container .jessibuca-controls .jessibuca-icon-audio,.jessibuca-container .jessibuca-controls .jessibuca-microphone-close,.jessibuca-container .jessibuca-controls .jessibuca-pause,.jessibuca-container .jessibuca-controls .jessibuca-play,.jessibuca-container .jessibuca-controls .jessibuca-record,.jessibuca-container .jessibuca-controls .jessibuca-record-stop,.jessibuca-container .jessibuca-controls .jessibuca-screenshot{display:none}.jessibuca-container .jessibuca-controls .jessibuca-icon-audio,.jessibuca-container .jessibuca-controls .jessibuca-icon-mute{z-index:1}.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom{display:flex;justify-content:space-between;height:100%}.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom .jessibuca-controls-left,.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom .jessibuca-controls-right{display:flex;align-items:center}.jessibuca-container.jessibuca-controls-show .jessibuca-controls{opacity:1;visibility:visible}.jessibuca-container.jessibuca-controls-show-auto-hide .jessibuca-controls{opacity:.8;visibility:visible;display:none}.jessibuca-container.jessibuca-hide-cursor *{cursor:none!important}.jessibuca-container .jessibuca-icon-loading{width:50px;height:50px;background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%;animation:rotation 1s linear infinite}.jessibuca-container .jessibuca-icon-screenshot{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAE5UlEQVRoQ+1YW2sdVRT+1s7JxbsoVkEUrIIX0ouz15zYNA+N1RdtQfCltlUfvLbqL/BCwZ8grbHtizQqPojgBSr0JkiMmT2nxgapqBURtPVCq7HxJCeZJVPmxDlzZubMmXOSEsnAvOy917fXt9e39tp7E5b4R0vcfywTuNgRbBgBx3HuJqLVzPzmYjprjHkcwAlmLqXNm4XAISLaSESPaq2HF4OE67rbRGRYRA7btn1fbgLGmKsA/Azg0gBkGzO/vZAkHMd5hIiqc5wHcCMz/5k0Z2oExsfHV1QqldPAf8lORNu11m8tBAljzFYAYWxRSl1vWdZvuQj4RsYYF4AVBlgIOVVlE55HRIxt23ZuCfmGjuOsJ6LPoiAistW27XfaEYmIbOYhPc9bXywWR1oiEJDYQkR1zrYjEjGyqfqbKd8a7kJVtLgQ+30i8pht2wfyRKIdmJkJBPkQTbILfudJ7CTZNBvVpggEcgpvc/ML38zESbLJsxBNE/A9biX0rdjGyTQXgbxyapdsarb0PMlXtWnGoXbKpm0Essqp3bJpK4E0OXmed3+hUBDP8w5FI91M0rdcyLLILElOCbaZilSWeXMncRx4klTCY1spfG3dhZJWx3GcDUR0EEB3ZMw0ET2gtT6SZWWzjmlrBIJCl0hAKfWgZVmHszqXZVxbCSxpCS2JJA6umIhe8ZKKVLPbaBJ+S9toqVRa53nedgAbAKwIwH4FcAzAa0R0l4i8F7PPz189k6RFRA+LyNcAXojDV0oNW5b1eW4Cxpg9AHZkSaaa6hhzb065uDSCH2LmRB8Sk9gY4293g43Qo/1pV80m8yQMfZSZ781cB1zXHRKRZ2IMpgD8A+DamL4ZItqitX4/jbQx5iEA7wLoihn3V/ACckWMJN/QWj9b1x5tGBsbW6uUOh5pPy0iL3Z2dn6ilJqanp5ep5TaJSLhF4NppdRNaU8gPmapVLrO87yfIoXuWyJ6uVKp+HmFjo6OQSJ6FcBtYT+UUmstyxqvkWuUgDFmP4AnQu2/e563qlgs+u9DNZ8xZhRAX7VRRPbath0XuXk7Y8xeAE+FgL6fnJzsHRwcLIfBR0ZGLunq6poAsDLUvp+Zw7b1r9PGmJMAbg8Z7WDmoThZuK67WkS+DD18fcPMdzSQUBR/EzN/nIC/SUQ+DPXV4dclsTHmHAD/SfHCNzc3t7Kvr++HJKeMMacA3BL0nyuXyzcPDAxMxo0fHR29slAo/Ajg6qD/fE9Pzw29vb1/x42fmJi4vFwu+5G/LOg/y8zXNJLQ2dAES5JANMQ7mfn1jBI6ycx3NiMhItqstf4oAX+ziHwQ6qvDj5NQNIn/ALCKmX+JSeIvABRD7fuY+ekGBPYBeDI05tTMzExvf3+/vz2Hk91/ET8RSeI6/DoCpVJpjed5fmKGvzMAXpqdnT3oed5Ud3d3v4jsAqBr9Ei0Rmv9VRqBBPzvROQVETnq2xJRdRu9tRF+bCVOKWT+Kvl/TSIFk6SW/LAjKfjV5K8rZABi8dOOEv7FI7Z8x6zwEWbemLbyMfJr5qiSiJ96oclymBOR3bZtP9+M89WxxpjdAHY2sN3DzM8ljWl4I3Nd9x7/OE1ENcdpETnmH3e11n41zv0l4J8RkU+J6AAz+xtF4teQQG7PFslwmcAiLfSyhC72Qv9/I/Avns2OT7QJskoAAAAASUVORK5CYII=\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-screenshot:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAED0lEQVRoQ+2ZycsdRRTFf2ejqHFAMQqiYBTUoElUHLNx3GgCgpuYRF2o0UT9CxwQ/BMkMSbZSKLiQgQHUDCJgjiAxiEiESdEcJbEedgcKaj3UV+/6q7u/jovPPkK3qbr1ql76p5bt6qemPKmKfefeQKHOoLFCNg+H1gi6fFJOmv7VmCvpD1N87Yh8ApwNXCzpB2TIGF7DRDm2inpmt4EbB8LfAMcGUHWSHryYJKwfRMwmuMP4BRJv9TN2RgB2wuB72BWsq+V9MTBIGF7NZBiGzhJ0o+9CIRBtt8FLqgADC6nRDbpVO9Iuqi3hCKB5cDrGZDVkp4aIhIV2aSQyyW9MScCkcQqIOfsnCORkc3I31b5VtyFRmg1IQ7dt0ja3icSQ2C2JhAjUU2ykd+dE7tBNp2i2olAJJFuc+nCt564QTadF6IzgUhiVGiqyinKaQjZpJP2ItBXTkPJZhACXeU0pGwGI9BWTkPLZlACBTldG4o5EA6E1dY66edcyNrs8Q36zg1vVaTazNs7iXPgDVJJzYs7VRvHRzaDEohyugJ4CTi84sg/wHWSdnVxsGQ7aQLXS9pZcqpL/6AEplpCU5HE8YpJ9YrXUKQ6baN1+HPaRm1fBqwFQnKGK2ZoPwCvAo8Ai4FnMpPMHMwapHUj8DFwbw3+Dklv9iZgexOwvktSRduxU2VDlErwmyXV+lCbxLbDdndlCT3TX3vV7JgnKfRuSVflfMkSsL0ZuDMz4E/gL+CETN+/wCpJzzaRtn0D8DRwWMbu1/gCcnSm7zFJd1W/jxGwvQx4r2IYnlbuA14GAomQFw8B6YtBKFSnNj2BxEJ3IvB1pdB9CjwQ8yqYhcg/DJxZ8WOZpA/SbzkC24DbEqOfgPMkBRKzmu23gEuSj1sk5SI3Y2J7C3BHMuZz4FxJf6fgto8APgIWJd+3SUrHjr9O294HnJUMWi8pSGqs2V4CvJ88fH0i6eyChKr4KyS9WIO/Ang+6RvDz0XgABCeFEdtkaQv65yy/QVweuwPY0+T9FuNQ8cAXwHHxf7wdHiypN9r7BfEl8GjYv9+SceXJLQ/mSDYTh2Baog3SHq0pYT2STqno4RWSnqhBn8l8FzSN4bfJol/jkn8bXUS228DFyfft0paVyCwFbg9sQkSDEkctueZZju8iO+tJPEYfo7A0piYKd73wP3xnB+20cvjNnphxdmlkj4sEMjhfwY8COyOY0fb6Bkl/K6FLKxS+M1KpDhJY8mvrG5doRwlf66QZfGbjhLh4pEt35kV3iUp/IvTunU8qtTil/7gaHOY2yjpntaez9b5RmBDYewmSXfX2RRvZLYvbThOh+NuqMa9Ww1+yLnXgO2SwkZR24oEens2oYHzBCa00PMSOtQL/f+NwH+Hg8hAnbrYgQAAAABJRU5ErkJggg==\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-play{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACgklEQVRoQ+3ZPYsTQRjA8eeZZCFlWttAwCIkZOaZJt8hlvkeHrlccuAFT6wEG0FQOeQQLCIWih6chQgKgkkKIyqKCVYip54IWmiQkTmyYhFvd3Zn3yDb7szu/7cv7GaDkPEFM94PK0DSZ9DzDAyHw7uI2HRDlVJX5/N5r9FoHCYdr/fvCRiNRmpJ6AEidoUQ15NG+AH8BgD2n9AHANAmohdJQfwAfgGA4xF4bjabnW21Whob62ILoKNfAsAGEd2PU2ATcNSNiDf0/cE5/xAHxDpgEf0NADaJ6HLUiKgAbvcjpdSGlPJZVJCoAUfdSqkLxWLxTLlc/mkbEgtgET1TSnWklLdtIuIEuN23crlcp16vv7cBSQKgu38AwBYRXQyLSArg3hsjRDxNRE+CQhIF/BN9qVAobFYqle+mkLQAdLd+8K0T0U0TRJoAbvc9fVkJId75gaQRoLv1C2STiPTb7rFLWgE6+g0RncwyYEJEtawCvjDGmpzzp5kD6NfxfD7frtVqB17xen2a7oG3ALBm+oMoFQBEPD+dTvtBfpImDXjIGFvjnD/3c7ksG5MU4HDxWeZa0HB3XhKAXcdxOn5vUi9gnIDXSqm2lHLPK8pkfVyAbSLqm4T5HRs1YB8RO0KIid8g03FRAT4rpbpSyh3TINPxUQB2GGM9zvkn05gg420CJovLZT9ISNA5tgB9ItoOGhFmnh/AcZ/X9xhj65zzV2Eiwsz1A1j2B8dHAOgS0W6YnduY6wkYj8d3lFKn/j66Ea84jtOrVqtfbQSE3YYnYDAY5Eql0hYAnNDv6kKIx2F3anO+J8DmzqLY1goQxVE12ebqDJgcrSjGrs5AFEfVZJt/AF0m+jHzUTtnAAAAAElFTkSuQmCC\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-play:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACEElEQVRoQ+2ZXStEQRjH/3/yIXwDdz7J+i7kvdisXCk3SiFJW27kglBcSFFKbqwQSa4krykuKB09Naf2Yndn5jgzc06d53Znd36/mWfeniVyHsw5PwqB0DOonYEoijYBlOpAFwCMkHwLDS/9mwhEDUCfAAyTXA4tYSLwC6CtCegegH6S56FETAR+AHRoACcBTJAUWa+RloBAXwAYIrnt0yBNgZi7qtbHgw8RFwLC/QFglOScawlXAjH3gUqrE1cirgVi7mkAYyS/0xbxJSDcdwAGSa6nKeFTIOZeUyL3aYiEEBDuLwDjJGf+KxFKIOY+BdBL8iipSGiBmHtWbbuftiJZERBuOfgGSK7aSGRJIObeUml1ayKSRQHhlgtkiaTcdltGVgUE+ppkV54FaiS78yrwqlLoOI8Cch2XV548W7WRpTVwA6DP9kGUFYEpAOUkT9LQAvtq1M+0udKkQSgBqSlJWWYxKXj8vRACK+o6bbRIdYI+Ba7U7rKjg7L53JdAhWTZBsy0rWuBXZUuNVMg23auBF7UIl2yBbJt70JAoKV6/WwLk6R9mgKSJlJ1kLTxFmkJyCla8UZd15GJQKvyumyJ8gy8DAEvfZoINPqD41EtUjmUgoaJwAaAnjrKebVI34OSq85NBNqlCAWgE0CV5GEWwI3vQlmCbcSinYFCwPEIFDPgeIC1P1/MgHaIHDf4Aydx2TF7wnKeAAAAAElFTkSuQmCC\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-pause{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABA0lEQVRoQ+1YwQqCUBAcfWXXsLr2AXWTPXno8yVB8AP6Aa3oHI+kCDqYaawJljSe133uzO44bx0M/HEG/v1gAd9mkAyQgY4I/F8LJUlyrQFtD2AtIkcNoFEU+Z7n7QD4DfFHEVlocrVmgAUAIAOl3mILPcDgEFcUhyrUKMGUUcroc3NQRimj9XJBGaWMvvPydKN0o6/9QTdKN6rZANxj6EbpRulGuZnjYqs8BbyR8Ub2Izeys+u6yyAIDpo/ehzHM2NMDsA0xFsRmWhyfTIDWSXxCEBmrd2EYXjSHJqm6bQoii2AOYBL5Z0xgFxEVppcrQvQJO0zhgX0iXbdWWSADHRE4AZQ731AhEUeNwAAAABJRU5ErkJggg==\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-pause:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAA7klEQVRoQ+2YSwrCQBBEX6HiVvxsPYDewfN7By/gD9ciQkvERQwJdBSiYs0mEDo96aruombEjy/9+P/jAj7NoBkwA28i8H8tFBFRA9oeWEo6ZgCNiDGwAYpn3TpKmmVytWbABQBmoNRbbqEHGB7iiuJYhRol2DJqGX1uDsuoZdRmLuNZSzGWUcuoZdRHSp/IylNgK2ErYSthK3FHwLcSvpXIjoLt9Jfa6TMwl3TIMBkRE2AH9BriL5KGmVyvWIltJXEfKN6tJJ0ym0bECFgDU+Ba+WZQFCdpkcnVuoBM0i5jXECXaNftZQbMwJsI3AAPN3dAQflHegAAAABJRU5ErkJggg==\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-record{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC+UlEQVRoQ+1ZS2sTURT+zlDJYE3XSq219QHVuEjnJDT+Bff9Abqw2voAEfGxqygUqWhVFHGl/yMLu9BwByxk5SNI66ML6U7axjhHbmhgWiftncxoOiV3FcI53z3f/e65594zhIQPSnj86BBot4IdBToKRFyBnbeFlFIScVEiuYvIWC6Xe2YK8pcC7SYA4CMzH4mDQBXAqilQBDsLQLfPf9FxnF4i8kwwmypARI+Wl5dvmIBEsUmlUkNE9NaHsVCpVAZGR0d/m+A2JSAid3K53E0TkCg2pVKpz7KseR/GfKVSGYxMAMA0M1+JEpyJb6lUOm5ZVnkrAsVisaunp+esiByr1Wp3R0ZGvmifzZK4XQQWHMc52MgBpdQuAOcAXABwuB400ZTjONdaIjA7O5u2bVsnWU1EujzP+5nP5xdMVjvIJkCBD8x8VCm1G8AYgAkAAxt8Z5j5YmgCSqlTAJ4D2OcD/AXgATNfbYVEAIFPIvKKiE4D6GuCea8xX6gtpJT6DmBvECgRFRzHeROWRAABE4iWCbwHEFhkPM/L5vP5dyaz+23+KwHXdR3P854S0YG1ILSCuthNMfNM2OC1/RYENLY+ygcBnPfht6ZAA6BYLNr6dyqVokKhsGpaNQ2TWJstreXaE2aed133sojcj41AKyvdzCdAgSXLsk4MDw9/a/i4rntbRPxFNZoC/5jAV2be759DKTUJ4FZSFFi0bbs/k8noy2R9dAjEuWU2YgXkQOK3kD6BMsysi2Z9JC2Jdcw/ALzwPO+xvmcl7Rj177JVEbkO4BARjSflFDJJuW1dBxJPoCIiL4noDIB1BS0pW6j+oJmbm+uuVqvjRKQfLr0bZHnIzJf0f6HeAybahrUJqAPruhLlcnnPysqKfpXp11n/Gv62zoHAroS+AafT6QkiGrIsazKbzX7eVIHEt1US39gCkOzWYthkjNE+tuZujDGZQ8XRXn8N4KT5lLFZ6uaYPt+nwyDuvC80YdhvB9uOAu1WoaNAR4GIK/AHvdr+QAexB7EAAAAASUVORK5CYII=\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-record:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACfUlEQVRoQ+2ZSYsUQRCFvycK4nJXXEbHBdwO4kn/gv9CD467ICIutxEFkREdFUU86T/xojcPntyQcT2INw+uISFVkD1Wd2dWlU7nUHlqisiX+fJFZGREi8yHMt8/HYG5VrBToFOg4QnMPxcyM2t4KE2nT0i6EwvylwIjQOCFpE1tEPgGfI0FamC3AFgazP8IrJL0KwZzkAI3gLMxIA1ttgCPA4w3wHpJP2NwBxG4KOlcDEgTGzNbA8wEGP57vA0CU5JONtlczFwz2wY8HUbAzBYCB4CtwCVJb33OIAXmioC70LoyBsxsEXAQOApsLIhelnS6FgEzW+5BBvwA/FS+SPJFa40KBZ5L2mxmS4AJ4IjHxCzwaUnHkgmY2V7gLrAyAPwOXJN0qg6DCgIvgQfAPsDjo2pcKddLciEz+wCs6AO6W9KjVBIVBGIgahN4BvRLMjslPYlZPbT53wR2AbeBtcUmXEFPdh5U06mbd/shBBzbr/Jx4FCAX0+BEsDMFocEYrNmFcE+BD4XsXZL0oyZnQCutkagzkn3m1NBwDe/Q9L74MAuFEqUn5op8I8JvJO0elacTALnc1HAH3Njkvwx+WeYWUegTa/pwaqIgexdyIN4uyRPmqULZRXEvulPwD3gpr+zcrtGQxfzRHYG2AAczuUWiom3kc4D2RN4BdwH9gM9CS0XFyoLGu9UuN974eIFVDiuSzruH5LqgRhtU20q8kBPV8LMlhVVmVdnYwX+SMdAZVeieAF7eeltmElJr4cpkH1bJfvGVvatxdR4bMu+teZuWxtKxWncXn8I7EldtQV7vz79fp9KwZp//9CksB8F206BuVahU6BToOEJ/Ab7+KdABdTt8AAAAABJRU5ErkJggg==\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-recordStop{background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-recordStop:hover{background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreen{background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreen:hover{background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreenExit{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAADd0lEQVRoQ+2Zz2sdVRTHv+fJBDW6anDVXen6wZszYxYBiYgtFGst3VSDunKjpS0GpUlqfjVpsVVs6aaL0or4YxMVFCJZ2ZLdPUP+gq5bQnTxtNAkfTnlhnnlkmQy9yV9780rudt77tzv5/y4v4bQ4Y06XD/2ANodwec/AiJygJnvtdvTWfPnRkBEJAiCN8rl8kMfiPn5+Ve7u7v3rays0Orq6lJfX99/PuN2auMDoAD+BvA2M6/mTWSMOUtE48D6AjHGzN/kjdlNvy+AnWOOmQ/lTSYiEwDOWzsimgrDcCRvzG76GwGw8/zJzO9sN6GInAMwbW1UdSSKoqndCMwb6wNwGsB39Q+p6h/M/C4R2dTa1AoHYBWKyCkA1+pqiWi2Wq0e7e/vf7yRoJAAKcQggMtuJKIoOtoxACnE0/xOi/SXMAxPuhCFjUBdpIjYVWXSEf0TM3/g9BeriDMKdSPEz8z8vrU1xgwT0YXCrEJZy1iSJKOqOub0/8jMA0mSfKKqNwoPkHp7ioiGHIhRIvpHVa93BEBa2JcAfOlALAHo6RgAKzRJkk9V1S6xL7kpV4idOM31taxaIKJHqmpPnMMA9hcOQES2PDJkAT1XAAC+ZebPfWB3auNzmLObVsNRUNUXVHUujuM7OxXnMy4XwOcj29mIyOuq+lapVGrYCelKpkEQ3CyXy4tbzdN0AGPMxr2iYZ+sra3FcRybtgCIiK2BKw2rdgaUSqWoUqlIkQAepFDdAF7cBq5ERI9rtdr1OI7tmE2t6SmUEYFHAEaexYW/1QC2EF+ru5GIvg7D0D2GNJxprQY4o6qv1I/b6SpzOYqiLxpWng5oOQAzXxWRWwA+dkRfYOb1p5hGW6sBJpn5KytSRG4D+KguWFXHoyhy7xdeLC0F2ChSRL4H8OFuINoKYIUbY34gogHH3eeZef1K6tPaDpCm068A3nMEDzHzxY4BUNWSiPxORO6z5aDPPlGICNQ9bYyZIaLjjudzIQoFkKbTbwCO+UI0HcB9J/LdeY0xs0R02IGYYObRrWqiFQCfEZEtSHsfmGZm+4qxbbM/hQD8BeBNa0hEM2EYnmgLgP3lFARBT1dXly4vL//b29tbzQNIU+llAHeJaLFSqRzJes5vegR8xGbZLCwsHKzVav8z8/0sm0ID+MDvAfh4qZk2exFopnd9vv0ELrXBQO7fD10AAAAASUVORK5CYII=\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreenExit:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC/ElEQVRoQ+2Zy49NQRCHvx+ReK6IlZ34E7CUiCAR4xEbTLCyQRATYswwb2IQZDYWgojHZpCQECts+ResiQwLj0RClNSkb9Lu3HtPz7mZc8+V6eXt6tP1VVV3VdcVbT7U5vozC9BqD/7/HjCzlZLet9rS9fbP9ICZvQPWSfqRAmFmS4ClMHm+JiR9S1mXVyYFwIBXwEZJv7I2MrPjQH8A6JN0OWtNM/OpAL7HS0mbsjYzswGgN8gNS+rJWtPM/HQAfJ9nkrY22tDMTgMjQaZH0nAzCmatTQE4ClyNPvQU2CbJQ2vKKB2Aa2hmR4DrkbbPgQ5Jv6sJSgkQILqA0dgTkjraBiBAxPHtPz2UtDuGKK0HKkqamd8qg5HS9yXtjebLdYjrHNRqiAeS9gQvnQGGSnML1bvGzOwc0BfN35PUaWYHgRulBwjW9ju+O4JwqM/AWFsABIgLwKkIYgJY1jYAAeJQuGIXVIVcKTKxh8WfBin9J+AVpx/eFWUEqFkyNACKp0rhgWYArkg6kQibSyylmPOklQdibijBX+fSLHFRJkDid+qKmdlaYENOI0zeEcBNSZ9qbVIEQHWuyGOTNZLetgrAz8ClPFpHa1ZL8rf5lFGEB2oBfAxQi4D5DeDmAP7mGJPka0oD4LnDr9imH/xFe8AP4vLIjBclxWXItCOtaIBjwOKo3HaFRyWdnLbmYUHhAJKumdkt4ECk9JCkSitmWixFAwxKOjt5uZvdBvZH2vZLit8XSSBFA/yjpJndAfY1A9FSgOCJu0BnBNErqfIkzfRCywECxCNgR6Rtt6TzmdqHBmyKXG4ZM4sTWc04NzNPWE+AuG3ZlZInSuGBinXMbBzYGVkrE6JUACGcHgPbUyGKAIj7REmZ18y897o5ghiQ5E/bltRChwE/kF7Xj0jyLkbDYWbzgBfA+iA4LmlXqwD8LydvszjAF0lfswBCKC0E3gBeP22p186f8RBKUbaejJmtAr5L+lBPptQAKfCzAClWmkmZWQ/MpHVTvv0X9iFAQGQyevIAAAAASUVORK5CYII=\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-audio{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACrUlEQVRoQ+2ZPYgTURCAZzbBXJnCeL2Cnb87b9MEtPBUrrMQFAtrtT5/ClGs9LBWWz0RtbBUFCF4oJDsbO68wsLA2YqQSmLlvpEHu7IuMdlLcus+yUKKhJfZ+ebnvZl5CJY/aLn+MAP41x7M1QPMfFtr/crzvHfTAs8FoNPp1LTWzwHgqIg0lFLvrQHwfX8BER8DwC6jNCIecF13wwoA3/dvIuKNpLJa60Oe560XGoCZd4rICiKeTCtaeABmPg4AJmRqg6xcaABmvg4At4aFRyEBhoVM4UMoCplHADCfJTEL5YEsIVNID5iQAYCHALCYxeq5b6PMfF5EBAAEESthGK7W6/XPRpFWq7W3VCqtZg2ZcT3g+/6i4zjzIlLSWn/yPO/DIGMNLCWY2Sj/+xGRK0qpZfNDEASnROTFVi0fr8+aA8z8Ld6KEfGt67oLYwMAwEUium8EREn7OgeAjwCwPyo/nrque3YSgAtE9GDaAM1mc65arc4Zuf1+P2w0Gt9jJZl5DQAORt+fENG5wgEw8zUAMB/zbBBRwyqAIAjuiMjlSOlNItpjFUCqWl0josMzgChR/9hGAWBbknjmAdPhDdqa0gfZzAMJKyVP4v8hhJYRcSni+0JEu63ahZj5anyQici6UuqIVQDdbrfS6/UqRulyufyTiH5sF8AlIro37VpoWEHIzGZ2tM+sEZFnSqkzk9RCS0R01wjIsZz+mug53hDRia0AnI4bGgDYISItz/M2jYC8Gpp2u30MEWuO4zha665Sqp0ZYFStX/iWchRAItFGzoHSsrJ2ZFl1mHg6bfVYJeGJv85CC++BpIJZ5kSFC6G0ha0e7mYJqcJ7IOkRay84UhD2XjHFIFZf8iW9YcYoYRi+tO6aNeupOs66iU/icV46zf/MAKZpzXFk/QL+JG1PUPhRiQAAAABJRU5ErkJggg==\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-audio:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACSElEQVRoQ+2Zu4sUQRCHf5+C+gf4yBXMfMYHGvjCzEBQDIzV+HwEohipGKupD0QNDE8UEwUFTe68wEDhTMVUMFJ+0tArzbjs9u3Ojt0wBR0M9MzUV1XdXVWNKhcq1189wP/2YKcesH1d0nPgdVvgnQDY3iTpqaT9kuaAt9UA2D4o6aGkzVHpXcByFQC2r0q60lB2D7BUNIDtjZIeSDoyRNGyAWwfiiET4n6YlAtg+7Kka2PCozyAMSHT5CkLIIbMfUlbMhdmOQCZIVOeB2LI3JN0NNPq6bTZe8D2aUmOY72kN8DnoIXt7eF5FSEzkQdsB+OEsFwr6RPwbpixhqYStoPyqVwAbkaAY5KeTWD5wStZHrD9XdJgK34FhBP9H8kFOAvciQBhn3/RAcBHSTvjfx4DJ6cBOAPcbRvA9gZJYQT5DfwYKGl7UdLu+PwIOFUiwCVJYQRZBuZqA7gh6XxUegXYVhtAmq0uAnt7gLhQm9vorBZx74Hcc6D3QLKH/z2JGyVnlYs4pCfzEe4rsLW2XehicpAtAftqAwiZbhhBfgE/ZwVwDrjddi40KiG0HXpHO+KcJ8CJaXKheeBWBOgqnf6W1BwvgcOrATieFDTrJL0HViJAVwXNgVgPrJH0BfiQDTDKtREiNK7KLSnHASQLLacP1PxcVkWWq8PU3emq2yqJJ0b1Qsv2QKpdZp+orBBqmrfq5m5mSJXtgUZI1XnB0YCo94opCal6L/ka3ghtlIXqrllzT9VJ5k19Ek/y0zbf6QHatOYk3/oDujC8QMWgjf4AAAAASUVORK5CYII=\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-mute{background:url(\"data:image/png;base64,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\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-mute:hover{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAHsUlEQVRoQ+2Z969VVRCFv7H33nvvvfcSe2+xxJgY4z9j/Bs0/mABFQXBhl1sgNjQSCyoiL2BDaxs873MJsfDuZd7gfeQxJ3cvAfv3HP22rNmzZo5wRq+Yg3fP/8DWN0RXCYCpZSzgM2Br4GPgW8j4s9hNlpKWQfYETgUOB44GtgMmA1MBF4BFkdEGea+Xdd2AbgF2B2YD0wHZkbEZ4M+qJSyIbArcARwMnAUsC/wO/AscCfwQkT8Meg9+13XBeBx4EjgZ+ClPLGXI+KbfjcqpXivLYA9gWOA0/PnDsDGwOeA977bCAwb1V7P7gIwDpBG2wJfAg/nZ3oXiFLK2sD6ef0+uWlp48kbSddfwAfAVOB+YNZoRuBG4CLgbGDLpNLTwIPAjDaIUsomwM7A4cCJyfm9ga0Bwbn+Bt4fKwDyV+5eAZyayWgkHgGmmBdNEKUUk/U44DzgNGA/YN1WyBWBucATwH3Aq6MZgbXyRAVxMXABsFUrEi9GxILkvbQ5JwGfABiR9ho7APXJpRSTzxO9CjgF2ClBPJrJ+JYSm/Io2Mvyeq+r1Km3G3sAPrmUsktu3pyQItskiFkpiS8CnybfBXl+5sBu8K8qP3YASik+/DdgEaBWbw+cCVwHnJRF7gd5nJEwwT9JmglC2hmRZiRUoQ8HzYFSynrABhk+C17PQtolozcBC/Kklb7FwCHANbk5f3d5zZuAlDI5rdoqj/pvxMwHBaHKaE3ie5eXxKWU7QCjb6WeHxHfDVMH1GlV521AinyUSnR5Jqr6XhP1JzUdeKwBQpqdkSBUMf+tMAjA68YPAOBA4FhgSToBJbhzdUVADyQlrMKTgdfyZJVVE1qLYGWta2FGQpm1UPldT1AQl2ZhE4R2xGgZAetJT1qUUoyeVDQCUyJi5jAA/JJlX99iNF7OgnYl4EcKbdS64Y8JtNJpXoKwGJrYFjm9kPliBDRznq4GT+No3ZCqHoY/zaVr8xnjI+KFYQEojz7M05JGPsQICOCwVgTakdB6mBOCsEIrxdWamDMT0iSapAcBB+T99Vq6Vb8nTQWgqx23IgCMwDONCAhAOghAo9dVrARSI1Hp5H1UMUG4WekpODcqrQQm1aw5ioDfU920Ih6YHuuBiJAFA+fASOY3ABhuXeYljRzYtNcNkwavZ/4YRblvJExM5dTN+38aPTfpx9/nAHdlHgnI52nNJ0WEtn4oAIax5oBfHgaAD5LLJp72WRDSoyb+91ln9s8Dsb5owd8Bbk/gyrFSbK49FBEzxhpAs05IC/NIGbXH0JnKbQFIyeuBvRLAbW44VW+1A2jmxJMZjXd1odlD7JER0L7bsRkBAeh4zQ9ltEZgzCnUjLh0MicmJZ0+TBD2Gkbg5pTm94A7snmSQv8ZAIKR956iEjs1IlQczaJ14obsJ7xGibV4mnOVQpNXRxJ35Zx+Zhpwj5GIiIWlFOVSo6j5ky4WLBNflTMCqtBqS+IuEMqnfshEVe91vUqsYxddsImubJsDyqjFTgBD54AevymjtZDphbQF/epAnxIxYh+sMc9nsiqPUse2VOeqOZRednk2SNrqiREhqKHqwFdZyOxfNXUC0I0KwGFVr0rc6zkWMM2bG7Jbsy6oTEZC2pjo0sUiah/iWObqdLH3R4QyPBQA7fRz2YBXANWNCqBt5vqdun/7NTepadOpujykOu2QItoMI+RyuuFh6ZYnDGslPAHD7Mk4BvTmypoAPBXNXHvqsDwAUsND8aQtYvJeu2Ak9EZq/7SIEJTqdHCOdewjTHjtx8AReCP7XBsVT8gC45BLWfNUmg3N8jZe/24E5Lb38nAEoPrIfYE9VaOd0w6jZHGTbh9EhNcMDODWDKeKIPIvsh/Qo1+Ykqf5ks+DLtXG++lwjazfdRRzbgOENcIaYGLrar1GN/prRPj9gQHIP2lkuNVuGwzlzBOxU7LntSvTCph4gyyHAwLQF1mRPVGpaERteOq0w0hI26UTQGdP/abYXS2lmzWZlkSE6iEnvc7S76alkP2q2q2LtGrK1X6rjlWsATZJWguHZfYCqlvtCeoE0Eg4AbSx6rsGfkNTSnGTqo+8tYsyUsqdPt+mpV9iVwBWWVvEEXuccyersEWrTgAtdkZipHOLCOtEzzUwgHqHdJImtRs3Cs5F7bYsRBa4rnu2B1uO10ckszE8U+Xs3FSnnrPYNpKhATQoZUNu+bcyGwk/5ong2vdtA5DjTXqqSnUo1o5E51S8AlkhAI1oSBsfrm6b4OaGvyuDTZUSQHMyt8z7gVYk6lTc4uaoRoXSTiyMiF+aUVgpABkNtdpCZ16Y4OaGUbHLqnkxCABzzHFkOxLSyeT31dTciLCOLF0rDaARDVVKVXJq4Rsac0PV0ke57LOVUe207906B1sZCXPBnDDHlGpP325tTu0lVgmF2glVSlGlPEUT3Eg4DFbvBVdfVzl56PmOLNXOg/D7RtQa4YxW8PPaqrTKItBSKR8qCLksJWzgLWbaaOvASxFhgexcpRQrsAehSCgWTsOdj/7YfrOzygE0gFjgfN0kDaSVUbAaa6N9xaTB67nyXbP0UQxUrEVdtBtNACa3Rc9ISCOLne5Tdzt7eQBSIEzsukedwTIvxkcNQL/TXZV/W+MB/AMANfVPjBGemwAAAABJRU5ErkJggg==\") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-text{font-size:14px;width:30px}.jessibuca-container .jessibuca-speed{font-size:14px;color:#fff}.jessibuca-container .jessibuca-quality-menu-list{position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%);transition:visibility .3s,opacity .3s;background-color:rgba(0,0,0,.5);border-radius:4px}.jessibuca-container .jessibuca-quality-menu-list.jessibuca-quality-menu-shown{visibility:visible;opacity:1}.jessibuca-container .icon-title-tips{pointer-events:none;position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%);transition:visibility .3s ease 0s,opacity .3s ease 0s;background-color:rgba(0,0,0,.5);border-radius:4px}.jessibuca-container .icon-title{display:inline-block;padding:5px 10px;font-size:12px;white-space:nowrap;color:#fff}.jessibuca-container .jessibuca-quality-menu{padding:8px 0}.jessibuca-container .jessibuca-quality-menu-item{display:block;height:25px;margin:0;padding:0 10px;cursor:pointer;font-size:14px;text-align:center;width:50px;color:hsla(0,0%,100%,.5);transition:color .3s,background-color .3s}.jessibuca-container .jessibuca-quality-menu-item:hover{background-color:hsla(0,0%,100%,.2)}.jessibuca-container .jessibuca-quality-menu-item:focus{outline:none}.jessibuca-container .jessibuca-quality-menu-item.jessibuca-quality-menu-item-active{color:#2298fc}.jessibuca-container .jessibuca-volume-panel-wrap{position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%) translateY(22%);transition:visibility .3s,opacity .3s;background-color:rgba(0,0,0,.5);border-radius:4px;height:120px;width:50px;overflow:hidden}.jessibuca-container .jessibuca-volume-panel-wrap.jessibuca-volume-panel-wrap-show{visibility:visible;opacity:1}.jessibuca-container .jessibuca-volume-panel{cursor:pointer;position:absolute;top:21px;height:60px;width:50px;overflow:hidden}.jessibuca-container .jessibuca-volume-panel-text{position:absolute;left:0;top:0;width:50px;height:20px;line-height:20px;text-align:center;color:#fff;font-size:12px}.jessibuca-container .jessibuca-volume-panel-handle{position:absolute;top:48px;left:50%;width:12px;height:12px;border-radius:12px;margin-left:-6px;background:#fff}.jessibuca-container .jessibuca-volume-panel-handle:before{bottom:-54px;background:#fff}.jessibuca-container .jessibuca-volume-panel-handle:after{bottom:6px;background:hsla(0,0%,100%,.2)}.jessibuca-container .jessibuca-volume-panel-handle:after,.jessibuca-container .jessibuca-volume-panel-handle:before{content:\"\";position:absolute;display:block;left:50%;width:3px;margin-left:-1px;height:60px}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-controls{width:100vh;transform:translateX(-13vw) translateY(-47.8vh) rotate(270deg);transition:width .5s ease-in}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-play-big:after{transform:rotate(270deg)}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-loading{flex-direction:row}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-loading-text{transform:rotate(270deg)}\n/*# sourceMappingURL=data:application/json;base64,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Q1osVUFBVyxDQUNYLGVBQWtCLENBRXBCLGtEQUNFLGlCQUFrQixDQUNsQixNQUFPLENBQ1AsS0FBTSxDQUNOLFVBQVcsQ0FDWCxXQUFZLENBQ1osZ0JBQWlCLENBQ2pCLGlCQUFrQixDQUNsQixVQUFXLENBQ1gsY0FBaUIsQ0FFbkIsb0RBQ0UsaUJBQWtCLENBQ2xCLFFBQVMsQ0FDVCxRQUFTLENBQ1QsVUFBVyxDQUNYLFdBQVksQ0FDWixrQkFBbUIsQ0FDbkIsZ0JBQWlCLENBQ2pCLGVBQWtCLENBQ2xCLDJEQUNFLFlBQWEsQ0FDYixlQUFrQixDQUNwQiwwREFDRSxVQUFXLENBQ1gsNkJBQXNDLENBQ3hDLHFIQUNFLFVBQVcsQ0FDWCxpQkFBa0IsQ0FDbEIsYUFBYyxDQUNkLFFBQVMsQ0FDVCxTQUFVLENBQ1YsZ0JBQWlCLENBQ2pCLFdBQWMsQ0FFbEIsa0VBQ0UsV0FBWSxDQUNaLDhEQUErRCxDQUMvRCw0QkFBK0IsQ0FFakMsd0VBQ0Usd0JBQTJCLENBRTdCLGlFQUNFLGtCQUFxQixDQUV2QixzRUFDRSx3QkFBMkIiLCJmaWxlIjoic3R5bGUuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbIkBrZXlmcmFtZXMgcm90YXRpb24ge1xuICBmcm9tIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XG4gIHRvIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0gfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWljb24ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHdpZHRoOiAxNnB4O1xuICBoZWlnaHQ6IDE2cHg7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1wb3N0ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDEwO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICBib3R0b206IDA7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1wbGF5LWJpZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZGlzcGxheTogbm9uZTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTAwJTtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQpOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtcGxheS1iaWc6YWZ0ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb250ZW50OiAnJztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogNTAlO1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiA0OHB4O1xuICAgIGhlaWdodDogNDhweDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIuLi9hc3NldHMvcGxheS5wbmdcIik7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1wbGF5LWJpZzpob3ZlcjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiLi4vYXNzZXRzL3BsYXktaG92ZXIucG5nXCIpOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtbG9hZGluZyB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDIwO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICBib3R0b206IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtbG9hZGluZy10ZXh0IHtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6ICNmZmY7XG4gIG1hcmdpbi10b3A6IDEwcHg7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1jb250cm9scyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxNjE2MTY7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogNDA7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICBib3R0b206IDA7XG4gIGhlaWdodDogMzhweDtcbiAgcGFkZGluZy1sZWZ0OiAxM3B4O1xuICBwYWRkaW5nLXJpZ2h0OiAxM3B4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgdHJhbnNpdGlvbjogd2lkdGggLjVzIGVhc2UtaW47IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1jb250cm9scyAuamVzc2lidWNhLWNvbnRyb2xzLWl0ZW0ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIHBhZGRpbmc6IDAgOHB4OyB9XG4gICAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1jb250cm9scyAuamVzc2lidWNhLWNvbnRyb2xzLWl0ZW06aG92ZXIgLmljb24tdGl0bGUtdGlwcyB7XG4gICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgICAgb3BhY2l0eTogMTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtbWljcm9waG9uZS1jbG9zZSB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtaWNvbi1hdWRpbyB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtcGxheSB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtcGF1c2Uge1xuICAgIGRpc3BsYXk6IG5vbmU7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1jb250cm9scyAuamVzc2lidWNhLWZ1bGxzY3JlZW4tZXhpdCB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2Etc2NyZWVuc2hvdCB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtcmVjb3JkIHtcbiAgICBkaXNwbGF5OiBub25lOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtY29udHJvbHMgLmplc3NpYnVjYS1mdWxsc2NyZWVuIHtcbiAgICBkaXNwbGF5OiBub25lOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtY29udHJvbHMgLmplc3NpYnVjYS1yZWNvcmQtc3RvcCB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtaWNvbi1hdWRpbywgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1jb250cm9scyAuamVzc2lidWNhLWljb24tbXV0ZSB7XG4gICAgei1pbmRleDogMTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtY29udHJvbHMtYm90dG9tIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBoZWlnaHQ6IDEwMCU7IH1cbiAgICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWNvbnRyb2xzIC5qZXNzaWJ1Y2EtY29udHJvbHMtYm90dG9tIC5qZXNzaWJ1Y2EtY29udHJvbHMtbGVmdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgfVxuICAgIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtY29udHJvbHMgLmplc3NpYnVjYS1jb250cm9scy1ib3R0b20gLmplc3NpYnVjYS1jb250cm9scy1yaWdodCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lci5qZXNzaWJ1Y2EtY29udHJvbHMtc2hvdyAuamVzc2lidWNhLWNvbnRyb2xzIHtcbiAgb3BhY2l0eTogMTtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lci5qZXNzaWJ1Y2EtY29udHJvbHMtc2hvdy1hdXRvLWhpZGUgLmplc3NpYnVjYS1jb250cm9scyB7XG4gIG9wYWNpdHk6IDAuODtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgZGlzcGxheTogbm9uZTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lci5qZXNzaWJ1Y2EtaGlkZS1jdXJzb3IgKiB7XG4gIGN1cnNvcjogbm9uZSAhaW1wb3J0YW50OyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1sb2FkaW5nIHtcbiAgd2lkdGg6IDUwcHg7XG4gIGhlaWdodDogNTBweDtcbiAgYmFja2dyb3VuZDogdXJsKFwiLi4vYXNzZXRzL2xvYWRpbmcucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xuICBhbmltYXRpb246IHJvdGF0aW9uIDFzIGxpbmVhciBpbmZpbml0ZTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWljb24tc2NyZWVuc2hvdCB7XG4gIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9zY3JlZW5zaG90LnBuZ1wiKSBuby1yZXBlYXQgY2VudGVyO1xuICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWljb24tc2NyZWVuc2hvdDpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogdXJsKFwiLi4vYXNzZXRzL3NjcmVlbnNob3QtaG92ZXIucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLXBsYXkge1xuICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvcGxheS5wbmdcIikgbm8tcmVwZWF0IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLXBsYXk6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9wbGF5LWhvdmVyLnBuZ1wiKSBuby1yZXBlYXQgY2VudGVyO1xuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1wYXVzZSB7XG4gIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9wYXVzZS5wbmdcIikgbm8tcmVwZWF0IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLXBhdXNlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvcGF1c2UtaG92ZXIucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLXJlY29yZCB7XG4gIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9yZWNvcmQucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1yZWNvcmQ6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9yZWNvcmQtaG92ZXIucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLXJlY29yZFN0b3Age1xuICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvcmVjb3JkLXN0b3AucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1yZWNvcmRTdG9wOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvcmVjb3JkLXN0b3AtaG92ZXIucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLWZ1bGxzY3JlZW4ge1xuICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvZnVsbHNjcmVlbi5wbmdcIikgbm8tcmVwZWF0IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1pY29uLWZ1bGxzY3JlZW46aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9mdWxsc2NyZWVuLWhvdmVyLnBuZ1wiKSBuby1yZXBlYXQgY2VudGVyO1xuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1mdWxsc2NyZWVuRXhpdCB7XG4gIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9leGl0LWZ1bGxzY3JlZW4ucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1mdWxsc2NyZWVuRXhpdDpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogdXJsKFwiLi4vYXNzZXRzL2V4aXQtZnVsbHNjcmVlbi1ob3Zlci5wbmdcIikgbm8tcmVwZWF0IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWljb24tYXVkaW8ge1xuICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvYXVkaW8ucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1hdWRpbzpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogdXJsKFwiLi4vYXNzZXRzL2F1ZGlvLWhvdmVyLnBuZ1wiKSBuby1yZXBlYXQgY2VudGVyO1xuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1tdXRlIHtcbiAgYmFja2dyb3VuZDogdXJsKFwiLi4vYXNzZXRzL211dGUucG5nXCIpIG5vLXJlcGVhdCBjZW50ZXI7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtaWNvbi1tdXRlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9hc3NldHMvbXV0ZS1ob3Zlci5wbmdcIikgbm8tcmVwZWF0IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLWljb24tdGV4dCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgd2lkdGg6IDMwcHg7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1zcGVlZCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgY29sb3I6ICNmZmY7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS1xdWFsaXR5LW1lbnUtbGlzdCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogNTAlO1xuICBib3R0b206IDEwMCU7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDMwMG1zLCBvcGFjaXR5IDMwMG1zO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gIGJvcmRlci1yYWRpdXM6IDRweDsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLXF1YWxpdHktbWVudS1saXN0Lmplc3NpYnVjYS1xdWFsaXR5LW1lbnUtc2hvd24ge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgb3BhY2l0eTogMTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuaWNvbi10aXRsZS10aXBzIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogNTAlO1xuICBib3R0b206IDEwMCU7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDMwMG1zIGVhc2UgMHMsIG9wYWNpdHkgMzAwbXMgZWFzZSAwcztcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xuICBib3JkZXItcmFkaXVzOiA0cHg7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmljb24tdGl0bGUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDVweCAxMHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGNvbG9yOiB3aGl0ZTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLXF1YWxpdHktbWVudSB7XG4gIHBhZGRpbmc6IDhweCAwOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtcXVhbGl0eS1tZW51LWl0ZW0ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiAyNXB4O1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDAgMTBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDE0cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2lkdGg6IDUwcHg7XG4gIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7XG4gIHRyYW5zaXRpb246IGNvbG9yIDMwMG1zLCBiYWNrZ3JvdW5kLWNvbG9yIDMwMG1zOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtcXVhbGl0eS1tZW51LWl0ZW06aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsgfVxuICAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLXF1YWxpdHktbWVudS1pdGVtOmZvY3VzIHtcbiAgICBvdXRsaW5lOiBub25lOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2EtcXVhbGl0eS1tZW51LWl0ZW0uamVzc2lidWNhLXF1YWxpdHktbWVudS1pdGVtLWFjdGl2ZSB7XG4gICAgY29sb3I6ICMyMjk4RkM7IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS12b2x1bWUtcGFuZWwtd3JhcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogNTAlO1xuICBib3R0b206IDEwMCU7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoMjIlKTtcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAzMDBtcywgb3BhY2l0eSAzMDBtcztcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGhlaWdodDogMTIwcHg7XG4gIHdpZHRoOiA1MHB4O1xuICBvdmVyZmxvdzogaGlkZGVuOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2Etdm9sdW1lLXBhbmVsLXdyYXAuamVzc2lidWNhLXZvbHVtZS1wYW5lbC13cmFwLXNob3cge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgb3BhY2l0eTogMTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLXZvbHVtZS1wYW5lbCB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDIxcHg7XG4gIGhlaWdodDogNjBweDtcbiAgd2lkdGg6IDUwcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47IH1cblxuLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS12b2x1bWUtcGFuZWwtdGV4dCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMDtcbiAgdG9wOiAwO1xuICB3aWR0aDogNTBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1zaXplOiAxMnB4OyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2Etdm9sdW1lLXBhbmVsLWhhbmRsZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA0OHB4O1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAxMnB4O1xuICBoZWlnaHQ6IDEycHg7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gIG1hcmdpbi1sZWZ0OiAtNnB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2Etdm9sdW1lLXBhbmVsLWhhbmRsZTo6YmVmb3JlIHtcbiAgICBib3R0b206IC01NHB4O1xuICAgIGJhY2tncm91bmQ6ICNmZmY7IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIgLmplc3NpYnVjYS12b2x1bWUtcGFuZWwtaGFuZGxlOjphZnRlciB7XG4gICAgYm90dG9tOiA2cHg7XG4gICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOyB9XG4gIC5qZXNzaWJ1Y2EtY29udGFpbmVyIC5qZXNzaWJ1Y2Etdm9sdW1lLXBhbmVsLWhhbmRsZTo6YmVmb3JlLCAuamVzc2lidWNhLWNvbnRhaW5lciAuamVzc2lidWNhLXZvbHVtZS1wYW5lbC1oYW5kbGU6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbGVmdDogNTAlO1xuICAgIHdpZHRoOiAzcHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgaGVpZ2h0OiA2MHB4OyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyLmplc3NpYnVjYS1mdWxsc2NyZWVuLXdlYiAuamVzc2lidWNhLWNvbnRyb2xzIHtcbiAgd2lkdGg6IDEwMHZoO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEzdncpIHRyYW5zbGF0ZVkoLTQ3Ljh2aCkgcm90YXRlKDI3MGRlZyk7XG4gIHRyYW5zaXRpb246IHdpZHRoIC41cyBlYXNlLWluOyB9XG5cbi5qZXNzaWJ1Y2EtY29udGFpbmVyLmplc3NpYnVjYS1mdWxsc2NyZWVuLXdlYiAuamVzc2lidWNhLXBsYXktYmlnOmFmdGVyIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lci5qZXNzaWJ1Y2EtZnVsbHNjcmVlbi13ZWIgLmplc3NpYnVjYS1sb2FkaW5nIHtcbiAgZmxleC1kaXJlY3Rpb246IHJvdzsgfVxuXG4uamVzc2lidWNhLWNvbnRhaW5lci5qZXNzaWJ1Y2EtZnVsbHNjcmVlbi13ZWIgLmplc3NpYnVjYS1sb2FkaW5nLXRleHQge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOyB9XG4iXX0= */";
+ styleInject(css_248z$1);
+
+ // todo: 待定
+ var hotkey = ((player, control) => {
+ const {
+ events: {
+ proxy
+ }
+ } = player;
+ const keys = {};
+
+ function addHotkey(key, event) {
+ if (keys[key]) {
+ keys[key].push(event);
+ } else {
+ keys[key] = [event];
+ }
+ } //
+
+
+ addHotkey(HOT_KEY.esc, () => {
+ if (player.fullscreen) {
+ player.fullscreen = false;
+ }
+ }); //
+
+ addHotkey(HOT_KEY.arrowUp, () => {
+ player.volume += 0.05;
+ }); //
+
+ addHotkey(HOT_KEY.arrowDown, () => {
+ player.volume -= 0.05;
+ });
+ proxy(window, 'keydown', event => {
+ if (control.isFocus) {
+ const tag = document.activeElement.tagName.toUpperCase();
+ const editable = document.activeElement.getAttribute('contenteditable');
+
+ if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {
+ const events = keys[event.keyCode];
+
+ if (events) {
+ event.preventDefault();
+ events.forEach(fn => fn());
+ }
+ }
+ }
+ });
+ });
+
+ class Control {
+ constructor(player) {
+ this.player = player;
+ template(player, this);
+ observer$1(player, this);
+ property(player, this);
+ events(player, this);
+
+ if (player._opt.hotKey) {
+ hotkey(player, this);
+ }
+
+ this.player.debug.log('Control', 'init');
+ }
+
+ destroy() {
+ if (this.$poster) {
+ this.player.$container.removeChild(this.$poster);
+ }
+
+ if (this.$loading) {
+ this.player.$container.removeChild(this.$loading);
+ }
+
+ if (this.$controls) {
+ this.player.$container.removeChild(this.$controls);
+ }
+
+ if (this.$playBig) {
+ this.player.$container.removeChild(this.$playBig);
+ }
+
+ this.player.debug.log('control', 'destroy');
+ }
+
+ autoSize() {
+ const player = this.player;
+ player.$container.style.padding = '0 0';
+ const playerWidth = player.width;
+ const playerHeight = player.height;
+ const playerRatio = playerWidth / playerHeight;
+ const canvasWidth = player.video.$videoElement.width;
+ const canvasHeight = player.video.$videoElement.height;
+ const canvasRatio = canvasWidth / canvasHeight;
+
+ if (playerRatio > canvasRatio) {
+ const padding = (playerWidth - playerHeight * canvasRatio) / 2;
+ player.$container.style.padding = `0 ${padding}px`;
+ } else {
+ const padding = (playerHeight - playerWidth / canvasRatio) / 2;
+ player.$container.style.padding = `${padding}px 0`;
+ }
+ }
+
+ }
+
+ var css_248z = ".jessibuca-container{position:relative;width:100%;height:100%;overflow:hidden}.jessibuca-container.jessibuca-fullscreen-web{position:fixed;z-index:9999;left:0;top:0;right:0;bottom:0;width:100vw!important;height:100vh!important;background:#000}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUJBQ0UsaUJBQWtCLENBQ2xCLFVBQVcsQ0FDWCxXQUFZLENBQ1osZUFBa0IsQ0FDbEIsOENBQ0UsY0FBZSxDQUNmLFlBQWEsQ0FDYixNQUFPLENBQ1AsS0FBTSxDQUNOLE9BQVEsQ0FDUixRQUFTLENBQ1QscUJBQXVCLENBQ3ZCLHNCQUF3QixDQUN4QixlQUFrQiIsImZpbGUiOiJzdHlsZS5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmplc3NpYnVjYS1jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47IH1cbiAgLmplc3NpYnVjYS1jb250YWluZXIuamVzc2lidWNhLWZ1bGxzY3JlZW4td2ViIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgei1pbmRleDogOTk5OTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDA7XG4gICAgd2lkdGg6IDEwMHZ3ICFpbXBvcnRhbnQ7XG4gICAgaGVpZ2h0OiAxMDB2aCAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQ6ICMwMDA7IH1cbiJdfQ== */";
+ styleInject(css_248z);
+
+ var observer = (player => {
+ const {
+ _opt,
+ debug,
+ events: {
+ proxy
+ }
+ } = player;
+
+ if (_opt.supportDblclickFullscreen) {
+ proxy(player.$container, 'dblclick', () => {
+ player.fullscreen = !player.fullscreen;
+ });
+ } //
+
+
+ proxy(document, 'visibilitychange', () => {
+ if (_opt.hiddenAutoPause) {
+ debug.log('visibilitychange', document.visibilityState, player._isPlayingBeforePageHidden);
+
+ if ("visible" === document.visibilityState) {
+ if (player._isPlayingBeforePageHidden) {
+ player.play();
+ }
+ } else {
+ player._isPlayingBeforePageHidden = player.playing; // hidden
+
+ if (player.playing) {
+ player.pause();
+ }
+ }
+ }
+ });
+ proxy(window, 'fullscreenchange', () => {
+ //
+ if (player.keepScreenOn !== null && "visible" === document.visibilityState) {
+ player.enableWakeLock();
+ }
+ });
+ });
+
+ class MP4$1 {
+ static init() {
+ MP4$1.types = {
+ avc1: [],
+ avcC: [],
+ hvc1: [],
+ hvcC: [],
+ btrt: [],
+ dinf: [],
+ dref: [],
+ esds: [],
+ ftyp: [],
+ hdlr: [],
+ mdat: [],
+ mdhd: [],
+ mdia: [],
+ mfhd: [],
+ minf: [],
+ moof: [],
+ moov: [],
+ mp4a: [],
+ mvex: [],
+ mvhd: [],
+ sdtp: [],
+ stbl: [],
+ stco: [],
+ stsc: [],
+ stsd: [],
+ stsz: [],
+ stts: [],
+ tfdt: [],
+ tfhd: [],
+ traf: [],
+ trak: [],
+ trun: [],
+ trex: [],
+ tkhd: [],
+ vmhd: [],
+ smhd: []
+ };
+
+ for (let name in MP4$1.types) {
+ if (MP4$1.types.hasOwnProperty(name)) {
+ MP4$1.types[name] = [name.charCodeAt(0), name.charCodeAt(1), name.charCodeAt(2), name.charCodeAt(3)];
+ }
+ }
+
+ let constants = MP4$1.constants = {};
+ constants.FTYP = new Uint8Array([0x69, 0x73, 0x6F, 0x6D, // major_brand: isom
+ 0x0, 0x0, 0x0, 0x1, // minor_version: 0x01
+ 0x69, 0x73, 0x6F, 0x6D, // isom
+ 0x61, 0x76, 0x63, 0x31 // avc1
+ ]);
+ constants.STSD_PREFIX = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+ 0x00, 0x00, 0x00, 0x01 // entry_count
+ ]);
+ constants.STTS = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+ 0x00, 0x00, 0x00, 0x00 // entry_count
+ ]);
+ constants.STSC = constants.STCO = constants.STTS;
+ constants.STSZ = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+ 0x00, 0x00, 0x00, 0x00, // sample_size
+ 0x00, 0x00, 0x00, 0x00 // sample_count
+ ]);
+ constants.HDLR_VIDEO = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+ 0x00, 0x00, 0x00, 0x00, // pre_defined
+ 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'
+ 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler
+ ]);
+ constants.HDLR_AUDIO = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+ 0x00, 0x00, 0x00, 0x00, // pre_defined
+ 0x73, 0x6F, 0x75, 0x6E, // handler_type: 'soun'
+ 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x6F, 0x75, 0x6E, 0x64, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler
+ ]);
+ constants.DREF = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+ 0x00, 0x00, 0x00, 0x01, // entry_count
+ 0x00, 0x00, 0x00, 0x0C, // entry_size
+ 0x75, 0x72, 0x6C, 0x20, // type 'url '
+ 0x00, 0x00, 0x00, 0x01 // version(0) + flags
+ ]); // Sound media header
+
+ constants.SMHD = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+ 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)
+ ]); // video media header
+
+ constants.VMHD = new Uint8Array([0x00, 0x00, 0x00, 0x01, // version(0) + flags
+ 0x00, 0x00, // graphicsmode: 2 bytes
+ 0x00, 0x00, 0x00, 0x00, // opcolor: 3 * 2 bytes
+ 0x00, 0x00]);
+ } // Generate a box
+
+
+ static box(type) {
+ let size = 8;
+ let result = null;
+ let datas = Array.prototype.slice.call(arguments, 1);
+ let arrayCount = datas.length;
+
+ for (let i = 0; i < arrayCount; i++) {
+ size += datas[i].byteLength;
+ }
+
+ result = new Uint8Array(size);
+ result[0] = size >>> 24 & 0xFF; // size
+
+ result[1] = size >>> 16 & 0xFF;
+ result[2] = size >>> 8 & 0xFF;
+ result[3] = size & 0xFF;
+ result.set(type, 4); // type
+
+ let offset = 8;
+
+ for (let i = 0; i < arrayCount; i++) {
+ // data body
+ result.set(datas[i], offset);
+ offset += datas[i].byteLength;
+ }
+
+ return result;
+ } // emit ftyp & moov
+
+
+ static generateInitSegment(meta) {
+ let ftyp = MP4$1.box(MP4$1.types.ftyp, MP4$1.constants.FTYP);
+ let moov = MP4$1.moov(meta);
+ let result = new Uint8Array(ftyp.byteLength + moov.byteLength);
+ result.set(ftyp, 0);
+ result.set(moov, ftyp.byteLength);
+ return result;
+ } // Movie metadata box
+
+
+ static moov(meta) {
+ let mvhd = MP4$1.mvhd(meta.timescale, meta.duration);
+ let trak = MP4$1.trak(meta);
+ let mvex = MP4$1.mvex(meta);
+ return MP4$1.box(MP4$1.types.moov, mvhd, trak, mvex);
+ } // Movie header box
+
+
+ static mvhd(timescale, duration) {
+ return MP4$1.box(MP4$1.types.mvhd, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+ 0x00, 0x00, 0x00, 0x00, // creation_time
+ 0x00, 0x00, 0x00, 0x00, // modification_time
+ timescale >>> 24 & 0xFF, // timescale: 4 bytes
+ timescale >>> 16 & 0xFF, timescale >>> 8 & 0xFF, timescale & 0xFF, duration >>> 24 & 0xFF, // duration: 4 bytes
+ duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0
+ 0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)
+ 0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----
+ 0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----
+ 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID
+ ]));
+ } // Track box
+
+
+ static trak(meta) {
+ return MP4$1.box(MP4$1.types.trak, MP4$1.tkhd(meta), MP4$1.mdia(meta));
+ } // Track header box
+
+
+ static tkhd(meta) {
+ let trackId = meta.id,
+ duration = meta.duration;
+ let width = meta.presentWidth,
+ height = meta.presentHeight;
+ return MP4$1.box(MP4$1.types.tkhd, new Uint8Array([0x00, 0x00, 0x00, 0x07, // version(0) + flags
+ 0x00, 0x00, 0x00, 0x00, // creation_time
+ 0x00, 0x00, 0x00, 0x00, // modification_time
+ trackId >>> 24 & 0xFF, // track_ID: 4 bytes
+ trackId >>> 16 & 0xFF, trackId >>> 8 & 0xFF, trackId & 0xFF, 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes
+ duration >>> 24 & 0xFF, // duration: 4 bytes
+ duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes)
+ 0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes)
+ 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----
+ width >>> 8 & 0xFF, // width and height
+ width & 0xFF, 0x00, 0x00, height >>> 8 & 0xFF, height & 0xFF, 0x00, 0x00]));
+ }
+
+ static mdia(meta) {
+ return MP4$1.box(MP4$1.types.mdia, MP4$1.mdhd(meta), MP4$1.hdlr(meta), MP4$1.minf(meta));
+ } // Media header box
+
+
+ static mdhd(meta) {
+ let timescale = meta.timescale;
+ let duration = meta.duration;
+ return MP4$1.box(MP4$1.types.mdhd, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+ 0x00, 0x00, 0x00, 0x00, // creation_time
+ 0x00, 0x00, 0x00, 0x00, // modification_time
+ timescale >>> 24 & 0xFF, // timescale: 4 bytes
+ timescale >>> 16 & 0xFF, timescale >>> 8 & 0xFF, timescale & 0xFF, duration >>> 24 & 0xFF, // duration: 4 bytes
+ duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x55, 0xC4, // language: und (undetermined)
+ 0x00, 0x00 // pre_defined = 0
+ ]));
+ } // Media handler reference box
+
+
+ static hdlr(meta) {
+ let data = null;
+
+ if (meta.type === 'audio') {
+ data = MP4$1.constants.HDLR_AUDIO;
+ } else {
+ data = MP4$1.constants.HDLR_VIDEO;
+ }
+
+ return MP4$1.box(MP4$1.types.hdlr, data);
+ } // Media infomation box
+
+
+ static minf(meta) {
+ let xmhd = null;
+
+ if (meta.type === 'audio') {
+ xmhd = MP4$1.box(MP4$1.types.smhd, MP4$1.constants.SMHD);
+ } else {
+ xmhd = MP4$1.box(MP4$1.types.vmhd, MP4$1.constants.VMHD);
+ }
+
+ return MP4$1.box(MP4$1.types.minf, xmhd, MP4$1.dinf(), MP4$1.stbl(meta));
+ } // Data infomation box
+
+
+ static dinf() {
+ let result = MP4$1.box(MP4$1.types.dinf, MP4$1.box(MP4$1.types.dref, MP4$1.constants.DREF));
+ return result;
+ } // Sample table box
+
+
+ static stbl(meta) {
+ let result = MP4$1.box(MP4$1.types.stbl, // type: stbl
+ MP4$1.stsd(meta), // Sample Description Table
+ MP4$1.box(MP4$1.types.stts, MP4$1.constants.STTS), // Time-To-Sample
+ MP4$1.box(MP4$1.types.stsc, MP4$1.constants.STSC), // Sample-To-Chunk
+ MP4$1.box(MP4$1.types.stsz, MP4$1.constants.STSZ), // Sample size
+ MP4$1.box(MP4$1.types.stco, MP4$1.constants.STCO) // Chunk offset
+ );
+ return result;
+ } // Sample description box
+
+
+ static stsd(meta) {
+ if (meta.type === 'audio') {
+ // else: aac -> mp4a
+ return MP4$1.box(MP4$1.types.stsd, MP4$1.constants.STSD_PREFIX, MP4$1.mp4a(meta));
+ } else {
+ if (meta.videoType === 'avc') {
+ //
+ return MP4$1.box(MP4$1.types.stsd, MP4$1.constants.STSD_PREFIX, MP4$1.avc1(meta));
+ } else {
+ //
+ return MP4$1.box(MP4$1.types.stsd, MP4$1.constants.STSD_PREFIX, MP4$1.hvc1(meta));
+ }
+ }
+ }
+
+ static mp4a(meta) {
+ let channelCount = meta.channelCount;
+ let sampleRate = meta.audioSampleRate;
+ let data = new Uint8Array([0x00, 0x00, 0x00, 0x00, // reserved(4)
+ 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)
+ 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes
+ 0x00, 0x00, 0x00, 0x00, 0x00, channelCount, // channelCount(2)
+ 0x00, 0x10, // sampleSize(2)
+ 0x00, 0x00, 0x00, 0x00, // reserved(4)
+ sampleRate >>> 8 & 0xFF, // Audio sample rate
+ sampleRate & 0xFF, 0x00, 0x00]);
+ return MP4$1.box(MP4$1.types.mp4a, data, MP4$1.esds(meta));
+ }
+
+ static esds(meta) {
+ let config = meta.config || [];
+ let configSize = config.length;
+ let data = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version 0 + flags
+ 0x03, // descriptor_type
+ 0x17 + configSize, // length3
+ 0x00, 0x01, // es_id
+ 0x00, // stream_priority
+ 0x04, // descriptor_type
+ 0x0F + configSize, // length
+ 0x40, // codec: mpeg4_audio
+ 0x15, // stream_type: Audio
+ 0x00, 0x00, 0x00, // buffer_size
+ 0x00, 0x00, 0x00, 0x00, // maxBitrate
+ 0x00, 0x00, 0x00, 0x00, // avgBitrate
+ 0x05 // descriptor_type
+ ].concat([configSize]).concat(config).concat([0x06, 0x01, 0x02 // GASpecificConfig
+ ]));
+ return MP4$1.box(MP4$1.types.esds, data);
+ } // avc
+
+
+ static avc1(meta) {
+ let avcc = meta.avcc;
+ const width = meta.codecWidth;
+ const height = meta.codecHeight;
+ let data = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, width >>> 8 & 255, width & 255, height >>> 8 & 255, height & 255, 0, 72, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 255, 255]);
+ return MP4$1.box(MP4$1.types.avc1, data, MP4$1.box(MP4$1.types.avcC, avcc));
+ } // hvc
+
+
+ static hvc1(meta) {
+ let avcc = meta.avcc;
+ const width = meta.codecWidth;
+ const height = meta.codecHeight;
+ let data = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, width >>> 8 & 255, width & 255, height >>> 8 & 255, height & 255, 0, 72, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 255, 255]);
+ return MP4$1.box(MP4$1.types.hvc1, data, MP4$1.box(MP4$1.types.hvcC, avcc));
+ } // Movie Extends box
+
+
+ static mvex(meta) {
+ return MP4$1.box(MP4$1.types.mvex, MP4$1.trex(meta));
+ } // Track Extends box
+
+
+ static trex(meta) {
+ let trackId = meta.id;
+ let data = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+ trackId >>> 24 & 0xFF, // track_ID
+ trackId >>> 16 & 0xFF, trackId >>> 8 & 0xFF, trackId & 0xFF, 0x00, 0x00, 0x00, 0x01, // default_sample_description_index
+ 0x00, 0x00, 0x00, 0x00, // default_sample_duration
+ 0x00, 0x00, 0x00, 0x00, // default_sample_size
+ 0x00, 0x01, 0x00, 0x01 // default_sample_flags
+ ]);
+ return MP4$1.box(MP4$1.types.trex, data);
+ } // Movie fragment box
+
+
+ static moof(track, baseMediaDecodeTime) {
+ return MP4$1.box(MP4$1.types.moof, MP4$1.mfhd(track.sequenceNumber), MP4$1.traf(track, baseMediaDecodeTime));
+ } //
+
+
+ static mfhd(sequenceNumber) {
+ let data = new Uint8Array([0x00, 0x00, 0x00, 0x00, sequenceNumber >>> 24 & 0xFF, // sequence_number: int32
+ sequenceNumber >>> 16 & 0xFF, sequenceNumber >>> 8 & 0xFF, sequenceNumber & 0xFF]);
+ return MP4$1.box(MP4$1.types.mfhd, data);
+ } // Track fragment box
+
+
+ static traf(track, baseMediaDecodeTime) {
+ let trackId = track.id; // Track fragment header box
+
+ let tfhd = MP4$1.box(MP4$1.types.tfhd, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) & flags
+ trackId >>> 24 & 0xFF, // track_ID
+ trackId >>> 16 & 0xFF, trackId >>> 8 & 0xFF, trackId & 0xFF])); // Track Fragment Decode Time
+
+ let tfdt = MP4$1.box(MP4$1.types.tfdt, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) & flags
+ baseMediaDecodeTime >>> 24 & 0xFF, // baseMediaDecodeTime: int32
+ baseMediaDecodeTime >>> 16 & 0xFF, baseMediaDecodeTime >>> 8 & 0xFF, baseMediaDecodeTime & 0xFF]));
+ let sdtp = MP4$1.sdtp(track);
+ let trun = MP4$1.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);
+ return MP4$1.box(MP4$1.types.traf, tfhd, tfdt, trun, sdtp);
+ } // Sample Dependency Type box
+
+
+ static sdtp(track) {
+ let data = new Uint8Array(4 + 1);
+ let flags = track.flags;
+ data[4] = flags.isLeading << 6 | flags.dependsOn << 4 | flags.isDependedOn << 2 | flags.hasRedundancy;
+ return MP4$1.box(MP4$1.types.sdtp, data);
+ } // trun
+
+
+ static trun(track, offset) {
+ let dataSize = 12 + 16;
+ let data = new Uint8Array(dataSize);
+ offset += 8 + dataSize;
+ data.set([0x00, 0x00, 0x0F, 0x01, // version(0) & flags
+ 0x00, 0x00, 0x00, 0x01, // sample_count
+ offset >>> 24 & 0xFF, // data_offset
+ offset >>> 16 & 0xFF, offset >>> 8 & 0xFF, offset & 0xFF], 0);
+ let duration = track.duration;
+ let size = track.size;
+ let flags = track.flags;
+ let cts = track.cts;
+ data.set([duration >>> 24 & 0xFF, // sample_duration
+ duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, size >>> 24 & 0xFF, // sample_size
+ size >>> 16 & 0xFF, size >>> 8 & 0xFF, size & 0xFF, flags.isLeading << 2 | flags.dependsOn, // sample_flags
+ flags.isDependedOn << 6 | flags.hasRedundancy << 4 | flags.isNonSync, 0x00, 0x00, // sample_degradation_priority
+ cts >>> 24 & 0xFF, // sample_composition_time_offset
+ cts >>> 16 & 0xFF, cts >>> 8 & 0xFF, cts & 0xFF], 12);
+ return MP4$1.box(MP4$1.types.trun, data);
+ } // mdat
+
+
+ static mdat(data) {
+ return MP4$1.box(MP4$1.types.mdat, data);
+ }
+
+ }
+
+ MP4$1.init();
+
+ /*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ // Exponential-Golomb buffer decoder
+ class ExpGolomb {
+ constructor(uint8array) {
+ this.TAG = 'ExpGolomb';
+ this._buffer = uint8array;
+ this._buffer_index = 0;
+ this._total_bytes = uint8array.byteLength;
+ this._total_bits = uint8array.byteLength * 8;
+ this._current_word = 0;
+ this._current_word_bits_left = 0;
+ }
+
+ destroy() {
+ this._buffer = null;
+ }
+
+ _fillCurrentWord() {
+ let buffer_bytes_left = this._total_bytes - this._buffer_index;
+
+ let bytes_read = Math.min(4, buffer_bytes_left);
+ let word = new Uint8Array(4);
+ word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));
+ this._current_word = new DataView(word.buffer).getUint32(0, false);
+ this._buffer_index += bytes_read;
+ this._current_word_bits_left = bytes_read * 8;
+ }
+
+ readBits(bits) {
+
+ if (bits <= this._current_word_bits_left) {
+ let result = this._current_word >>> 32 - bits;
+ this._current_word <<= bits;
+ this._current_word_bits_left -= bits;
+ return result;
+ }
+
+ let result = this._current_word_bits_left ? this._current_word : 0;
+ result = result >>> 32 - this._current_word_bits_left;
+ let bits_need_left = bits - this._current_word_bits_left;
+
+ this._fillCurrentWord();
+
+ let bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);
+ let result2 = this._current_word >>> 32 - bits_read_next;
+ this._current_word <<= bits_read_next;
+ this._current_word_bits_left -= bits_read_next;
+ result = result << bits_read_next | result2;
+ return result;
+ }
+
+ readBool() {
+ return this.readBits(1) === 1;
+ }
+
+ readByte() {
+ return this.readBits(8);
+ }
+
+ _skipLeadingZero() {
+ let zero_count;
+
+ for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {
+ if (0 !== (this._current_word & 0x80000000 >>> zero_count)) {
+ this._current_word <<= zero_count;
+ this._current_word_bits_left -= zero_count;
+ return zero_count;
+ }
+ }
+
+ this._fillCurrentWord();
+
+ return zero_count + this._skipLeadingZero();
+ }
+
+ readUEG() {
+ // unsigned exponential golomb
+ let leading_zeros = this._skipLeadingZero();
+
+ return this.readBits(leading_zeros + 1) - 1;
+ }
+
+ readSEG() {
+ // signed exponential golomb
+ let value = this.readUEG();
+
+ if (value & 0x01) {
+ return value + 1 >>> 1;
+ } else {
+ return -1 * (value >>> 1);
+ }
+ }
+
+ }
+
+ /*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ class SPSParser$1 {
+ static _ebsp2rbsp(uint8array) {
+ let src = uint8array;
+ let src_length = src.byteLength;
+ let dst = new Uint8Array(src_length);
+ let dst_idx = 0;
+
+ for (let i = 0; i < src_length; i++) {
+ if (i >= 2) {
+ // Unescape: Skip 0x03 after 00 00
+ if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {
+ continue;
+ }
+ }
- dst[dst_idx] = src[i];
- dst_idx++;
- }
-
- return new Uint8Array(dst.buffer, 0, dst_idx);
- } // 解析 SPS
- // https://zhuanlan.zhihu.com/p/27896239
+ dst[dst_idx] = src[i];
+ dst_idx++;
+ }
+
+ return new Uint8Array(dst.buffer, 0, dst_idx);
+ } // 解析 SPS
+ // https://zhuanlan.zhihu.com/p/27896239
- static parseSPS(uint8array) {
- let rbsp = SPSParser$1._ebsp2rbsp(uint8array);
+ static parseSPS(uint8array) {
+ let rbsp = SPSParser$1._ebsp2rbsp(uint8array);
- let gb = new ExpGolomb(rbsp);
- gb.readByte(); // 标识当前H.264码流的profile。
- // 我们知道,H.264中定义了三种常用的档次profile: 基准档次:baseline profile;主要档次:main profile; 扩展档次:extended profile;
+ let gb = new ExpGolomb(rbsp);
+ gb.readByte(); // 标识当前H.264码流的profile。
+ // 我们知道,H.264中定义了三种常用的档次profile: 基准档次:baseline profile;主要档次:main profile; 扩展档次:extended profile;
- let profile_idc = gb.readByte(); // profile_idc
+ let profile_idc = gb.readByte(); // profile_idc
- gb.readByte(); // constraint_set_flags[5] + reserved_zero[3]
- // 标识当前码流的Level。编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。
+ gb.readByte(); // constraint_set_flags[5] + reserved_zero[3]
+ // 标识当前码流的Level。编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。
- let level_idc = gb.readByte(); // level_idc
- // 表示当前的序列参数集的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。
+ let level_idc = gb.readByte(); // level_idc
+ // 表示当前的序列参数集的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。
- gb.readUEG(); // seq_parameter_set_id
+ gb.readUEG(); // seq_parameter_set_id
- let profile_string = SPSParser$1.getProfileString(profile_idc);
- let level_string = SPSParser$1.getLevelString(level_idc);
- let chroma_format_idc = 1;
- let chroma_format = 420;
- let chroma_format_table = [0, 420, 422, 444];
- let bit_depth = 8; //
-
- if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 || profile_idc === 244 || profile_idc === 44 || profile_idc === 83 || profile_idc === 86 || profile_idc === 118 || profile_idc === 128 || profile_idc === 138 || profile_idc === 144) {
- //
- chroma_format_idc = gb.readUEG();
+ let profile_string = SPSParser$1.getProfileString(profile_idc);
+ let level_string = SPSParser$1.getLevelString(level_idc);
+ let chroma_format_idc = 1;
+ let chroma_format = 420;
+ let chroma_format_table = [0, 420, 422, 444];
+ let bit_depth = 8; //
+
+ if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 || profile_idc === 244 || profile_idc === 44 || profile_idc === 83 || profile_idc === 86 || profile_idc === 118 || profile_idc === 128 || profile_idc === 138 || profile_idc === 144) {
+ //
+ chroma_format_idc = gb.readUEG();
- if (chroma_format_idc === 3) {
- gb.readBits(1); // separate_colour_plane_flag
- }
+ if (chroma_format_idc === 3) {
+ gb.readBits(1); // separate_colour_plane_flag
+ }
- if (chroma_format_idc <= 3) {
- chroma_format = chroma_format_table[chroma_format_idc];
- }
-
- bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8
-
- gb.readUEG(); // bit_depth_chroma_minus8
-
- gb.readBits(1); // qpprime_y_zero_transform_bypass_flag
-
- if (gb.readBool()) {
- // seq_scaling_matrix_present_flag
- let scaling_list_count = chroma_format_idc !== 3 ? 8 : 12;
-
- for (let i = 0; i < scaling_list_count; i++) {
- if (gb.readBool()) {
- // seq_scaling_list_present_flag
- if (i < 6) {
- SPSParser$1._skipScalingList(gb, 16);
- } else {
- SPSParser$1._skipScalingList(gb, 64);
- }
- }
- }
- }
- } // 用于计算MaxFrameNum的值。计算公式为MaxFrameNum = 2^(log2_max_frame_num_minus4 +
-
-
- gb.readUEG(); // log2_max_frame_num_minus4
- // 表示解码picture order count(POC)的方法。POC是另一种计量图像序号的方式,与frame_num有着不同的计算方法。该语法元素的取值为0、1或2。
-
- let pic_order_cnt_type = gb.readUEG();
-
- if (pic_order_cnt_type === 0) {
- gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4
- } else if (pic_order_cnt_type === 1) {
- gb.readBits(1); // delta_pic_order_always_zero_flag
-
- gb.readSEG(); // offset_for_non_ref_pic
+ if (chroma_format_idc <= 3) {
+ chroma_format = chroma_format_table[chroma_format_idc];
+ }
+
+ bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8
+
+ gb.readUEG(); // bit_depth_chroma_minus8
+
+ gb.readBits(1); // qpprime_y_zero_transform_bypass_flag
+
+ if (gb.readBool()) {
+ // seq_scaling_matrix_present_flag
+ let scaling_list_count = chroma_format_idc !== 3 ? 8 : 12;
+
+ for (let i = 0; i < scaling_list_count; i++) {
+ if (gb.readBool()) {
+ // seq_scaling_list_present_flag
+ if (i < 6) {
+ SPSParser$1._skipScalingList(gb, 16);
+ } else {
+ SPSParser$1._skipScalingList(gb, 64);
+ }
+ }
+ }
+ }
+ } // 用于计算MaxFrameNum的值。计算公式为MaxFrameNum = 2^(log2_max_frame_num_minus4 +
+
+
+ gb.readUEG(); // log2_max_frame_num_minus4
+ // 表示解码picture order count(POC)的方法。POC是另一种计量图像序号的方式,与frame_num有着不同的计算方法。该语法元素的取值为0、1或2。
+
+ let pic_order_cnt_type = gb.readUEG();
+
+ if (pic_order_cnt_type === 0) {
+ gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4
+ } else if (pic_order_cnt_type === 1) {
+ gb.readBits(1); // delta_pic_order_always_zero_flag
+
+ gb.readSEG(); // offset_for_non_ref_pic
- gb.readSEG(); // offset_for_top_to_bottom_field
+ gb.readSEG(); // offset_for_top_to_bottom_field
- let num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();
+ let num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();
- for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {
- gb.readSEG(); // offset_for_ref_frame
- }
- } // 用于表示参考帧的最大数目。
+ for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {
+ gb.readSEG(); // offset_for_ref_frame
+ }
+ } // 用于表示参考帧的最大数目。
- let ref_frames = gb.readUEG(); // max_num_ref_frames
- // 标识位,说明frame_num中是否允许不连续的值。
+ let ref_frames = gb.readUEG(); // max_num_ref_frames
+ // 标识位,说明frame_num中是否允许不连续的值。
- gb.readBits(1); // gaps_in_frame_num_value_allowed_flag
- // 用于计算图像的宽度。单位为宏块个数,因此图像的实际宽度为:
+ gb.readBits(1); // gaps_in_frame_num_value_allowed_flag
+ // 用于计算图像的宽度。单位为宏块个数,因此图像的实际宽度为:
- let pic_width_in_mbs_minus1 = gb.readUEG(); // 使用PicHeightInMapUnits来度量视频中一帧图像的高度。
- // PicHeightInMapUnits并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。PicHeightInMapUnits的计算方式为:
+ let pic_width_in_mbs_minus1 = gb.readUEG(); // 使用PicHeightInMapUnits来度量视频中一帧图像的高度。
+ // PicHeightInMapUnits并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。PicHeightInMapUnits的计算方式为:
- let pic_height_in_map_units_minus1 = gb.readUEG(); // 标识位,说明宏块的编码方式。当该标识位为0时,宏块可能为帧编码或场编码;
- // 该标识位为1时,所有宏块都采用帧编码。根据该标识位取值不同,PicHeightInMapUnits的含义也不同,
- // 为0时表示一场数据按宏块计算的高度,为1时表示一帧数据按宏块计算的高度。
+ let pic_height_in_map_units_minus1 = gb.readUEG(); // 标识位,说明宏块的编码方式。当该标识位为0时,宏块可能为帧编码或场编码;
+ // 该标识位为1时,所有宏块都采用帧编码。根据该标识位取值不同,PicHeightInMapUnits的含义也不同,
+ // 为0时表示一场数据按宏块计算的高度,为1时表示一帧数据按宏块计算的高度。
- let frame_mbs_only_flag = gb.readBits(1);
+ let frame_mbs_only_flag = gb.readBits(1);
- if (frame_mbs_only_flag === 0) {
- // 标识位,说明是否采用了宏块级的帧场自适应编码。当该标识位为0时,不存在帧编码和场编码之间的切换;当标识位为1时,宏块可能在帧编码和场编码模式之间进行选择。
- gb.readBits(1); // mb_adaptive_frame_field_flag
- } // 标识位,用于B_Skip、B_Direct模式运动矢量的推导计算。
-
-
- gb.readBits(1); // direct_8x8_inference_flag
-
- let frame_crop_left_offset = 0;
- let frame_crop_right_offset = 0;
- let frame_crop_top_offset = 0;
- let frame_crop_bottom_offset = 0;
- let frame_cropping_flag = gb.readBool();
-
- if (frame_cropping_flag) {
- frame_crop_left_offset = gb.readUEG();
- frame_crop_right_offset = gb.readUEG();
- frame_crop_top_offset = gb.readUEG();
- frame_crop_bottom_offset = gb.readUEG();
- }
-
- let sar_width = 1,
- sar_height = 1;
- let fps = 0,
- fps_fixed = true,
- fps_num = 0,
- fps_den = 0; // 标识位,说明SPS中是否存在VUI信息。
-
- let vui_parameters_present_flag = gb.readBool();
-
- if (vui_parameters_present_flag) {
- if (gb.readBool()) {
- // aspect_ratio_info_present_flag
- let aspect_ratio_idc = gb.readByte();
- let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];
- let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];
-
- if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {
- sar_width = sar_w_table[aspect_ratio_idc - 1];
- sar_height = sar_h_table[aspect_ratio_idc - 1];
- } else if (aspect_ratio_idc === 255) {
- sar_width = gb.readByte() << 8 | gb.readByte();
- sar_height = gb.readByte() << 8 | gb.readByte();
- }
- }
-
- if (gb.readBool()) {
- // overscan_info_present_flag
- gb.readBool(); // overscan_appropriate_flag
- }
-
- if (gb.readBool()) {
- // video_signal_type_present_flag
- gb.readBits(4); // video_format & video_full_range_flag
-
- if (gb.readBool()) {
- // colour_description_present_flag
- gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients
- }
- }
-
- if (gb.readBool()) {
- // chroma_loc_info_present_flag
- gb.readUEG(); // chroma_sample_loc_type_top_field
-
- gb.readUEG(); // chroma_sample_loc_type_bottom_field
- }
-
- if (gb.readBool()) {
- // timing_info_present_flag
- let num_units_in_tick = gb.readBits(32);
- let time_scale = gb.readBits(32);
- fps_fixed = gb.readBool(); // fixed_frame_rate_flag
-
- fps_num = time_scale;
- fps_den = num_units_in_tick * 2;
- fps = fps_num / fps_den;
- }
- }
-
- let sarScale = 1;
-
- if (sar_width !== 1 || sar_height !== 1) {
- sarScale = sar_width / sar_height;
- }
-
- let crop_unit_x = 0,
- crop_unit_y = 0;
-
- if (chroma_format_idc === 0) {
- crop_unit_x = 1;
- crop_unit_y = 2 - frame_mbs_only_flag;
- } else {
- let sub_wc = chroma_format_idc === 3 ? 1 : 2;
- let sub_hc = chroma_format_idc === 1 ? 2 : 1;
- crop_unit_x = sub_wc;
- crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);
- }
-
- let codec_width = (pic_width_in_mbs_minus1 + 1) * 16;
- let codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);
- codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;
- codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;
- let present_width = Math.ceil(codec_width * sarScale);
- gb.destroy();
- gb = null; // 解析出来的SPS 内容。
-
- return {
- profile_string: profile_string,
- // baseline, high, high10, ...
- level_string: level_string,
- // 3, 3.1, 4, 4.1, 5, 5.1, ...
- bit_depth: bit_depth,
- // 8bit, 10bit, ...
- ref_frames: ref_frames,
- chroma_format: chroma_format,
- // 4:2:0, 4:2:2, ...
- chroma_format_string: SPSParser$1.getChromaFormatString(chroma_format),
- frame_rate: {
- fixed: fps_fixed,
- fps: fps,
- fps_den: fps_den,
- fps_num: fps_num
- },
- sar_ratio: {
- width: sar_width,
- height: sar_height
- },
- codec_size: {
- width: codec_width,
- height: codec_height
- },
- present_size: {
- width: present_width,
- height: codec_height
- }
- };
- }
-
- static _skipScalingList(gb, count) {
- let last_scale = 8,
- next_scale = 8;
- let delta_scale = 0;
-
- for (let i = 0; i < count; i++) {
- if (next_scale !== 0) {
- delta_scale = gb.readSEG();
- next_scale = (last_scale + delta_scale + 256) % 256;
- }
-
- last_scale = next_scale === 0 ? last_scale : next_scale;
- }
- } // profile_idc = 66 → baseline profile;
- // profile_idc = 77 → main profile;
- // profile_idc = 88 → extended profile;
- // 在新版的标准中,还包括了High、High 10、High 4:2:2、High 4:4:4、High 10 Intra、High
- // 4:2:2 Intra、High 4:4:4 Intra、CAVLC 4:4:4 Intra
-
-
- static getProfileString(profile_idc) {
- switch (profile_idc) {
- case 66:
- return 'Baseline';
-
- case 77:
- return 'Main';
-
- case 88:
- return 'Extended';
-
- case 100:
- return 'High';
-
- case 110:
- return 'High10';
-
- case 122:
- return 'High422';
-
- case 244:
- return 'High444';
-
- default:
- return 'Unknown';
- }
- }
-
- static getLevelString(level_idc) {
- return (level_idc / 10).toFixed(1);
- }
-
- static getChromaFormatString(chroma) {
- switch (chroma) {
- case 420:
- return '4:2:0';
-
- case 422:
- return '4:2:2';
-
- case 444:
- return '4:4:4';
-
- default:
- return 'Unknown';
- }
- }
-
- }
-
- function parseAVCDecoderConfigurationRecord(arrayBuffer) {
- const meta = {};
- const v = new DataView(arrayBuffer.buffer);
- let version = v.getUint8(0); // configurationVersion
-
- let avcProfile = v.getUint8(1); // avcProfileIndication
+ if (frame_mbs_only_flag === 0) {
+ // 标识位,说明是否采用了宏块级的帧场自适应编码。当该标识位为0时,不存在帧编码和场编码之间的切换;当标识位为1时,宏块可能在帧编码和场编码模式之间进行选择。
+ gb.readBits(1); // mb_adaptive_frame_field_flag
+ } // 标识位,用于B_Skip、B_Direct模式运动矢量的推导计算。
+
+
+ gb.readBits(1); // direct_8x8_inference_flag
+
+ let frame_crop_left_offset = 0;
+ let frame_crop_right_offset = 0;
+ let frame_crop_top_offset = 0;
+ let frame_crop_bottom_offset = 0;
+ let frame_cropping_flag = gb.readBool();
+
+ if (frame_cropping_flag) {
+ frame_crop_left_offset = gb.readUEG();
+ frame_crop_right_offset = gb.readUEG();
+ frame_crop_top_offset = gb.readUEG();
+ frame_crop_bottom_offset = gb.readUEG();
+ }
+
+ let sar_width = 1,
+ sar_height = 1;
+ let fps = 0,
+ fps_fixed = true,
+ fps_num = 0,
+ fps_den = 0; // 标识位,说明SPS中是否存在VUI信息。
+
+ let vui_parameters_present_flag = gb.readBool();
+
+ if (vui_parameters_present_flag) {
+ if (gb.readBool()) {
+ // aspect_ratio_info_present_flag
+ let aspect_ratio_idc = gb.readByte();
+ let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];
+ let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];
+
+ if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {
+ sar_width = sar_w_table[aspect_ratio_idc - 1];
+ sar_height = sar_h_table[aspect_ratio_idc - 1];
+ } else if (aspect_ratio_idc === 255) {
+ sar_width = gb.readByte() << 8 | gb.readByte();
+ sar_height = gb.readByte() << 8 | gb.readByte();
+ }
+ }
+
+ if (gb.readBool()) {
+ // overscan_info_present_flag
+ gb.readBool(); // overscan_appropriate_flag
+ }
+
+ if (gb.readBool()) {
+ // video_signal_type_present_flag
+ gb.readBits(4); // video_format & video_full_range_flag
+
+ if (gb.readBool()) {
+ // colour_description_present_flag
+ gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients
+ }
+ }
+
+ if (gb.readBool()) {
+ // chroma_loc_info_present_flag
+ gb.readUEG(); // chroma_sample_loc_type_top_field
+
+ gb.readUEG(); // chroma_sample_loc_type_bottom_field
+ }
+
+ if (gb.readBool()) {
+ // timing_info_present_flag
+ let num_units_in_tick = gb.readBits(32);
+ let time_scale = gb.readBits(32);
+ fps_fixed = gb.readBool(); // fixed_frame_rate_flag
+
+ fps_num = time_scale;
+ fps_den = num_units_in_tick * 2;
+ fps = fps_num / fps_den;
+ }
+ }
+
+ let sarScale = 1;
+
+ if (sar_width !== 1 || sar_height !== 1) {
+ sarScale = sar_width / sar_height;
+ }
+
+ let crop_unit_x = 0,
+ crop_unit_y = 0;
+
+ if (chroma_format_idc === 0) {
+ crop_unit_x = 1;
+ crop_unit_y = 2 - frame_mbs_only_flag;
+ } else {
+ let sub_wc = chroma_format_idc === 3 ? 1 : 2;
+ let sub_hc = chroma_format_idc === 1 ? 2 : 1;
+ crop_unit_x = sub_wc;
+ crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);
+ }
+
+ let codec_width = (pic_width_in_mbs_minus1 + 1) * 16;
+ let codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);
+ codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;
+ codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;
+ let present_width = Math.ceil(codec_width * sarScale);
+ gb.destroy();
+ gb = null; // 解析出来的SPS 内容。
+
+ return {
+ profile_string: profile_string,
+ // baseline, high, high10, ...
+ level_string: level_string,
+ // 3, 3.1, 4, 4.1, 5, 5.1, ...
+ bit_depth: bit_depth,
+ // 8bit, 10bit, ...
+ ref_frames: ref_frames,
+ chroma_format: chroma_format,
+ // 4:2:0, 4:2:2, ...
+ chroma_format_string: SPSParser$1.getChromaFormatString(chroma_format),
+ frame_rate: {
+ fixed: fps_fixed,
+ fps: fps,
+ fps_den: fps_den,
+ fps_num: fps_num
+ },
+ sar_ratio: {
+ width: sar_width,
+ height: sar_height
+ },
+ codec_size: {
+ width: codec_width,
+ height: codec_height
+ },
+ present_size: {
+ width: present_width,
+ height: codec_height
+ }
+ };
+ }
+
+ static _skipScalingList(gb, count) {
+ let last_scale = 8,
+ next_scale = 8;
+ let delta_scale = 0;
+
+ for (let i = 0; i < count; i++) {
+ if (next_scale !== 0) {
+ delta_scale = gb.readSEG();
+ next_scale = (last_scale + delta_scale + 256) % 256;
+ }
+
+ last_scale = next_scale === 0 ? last_scale : next_scale;
+ }
+ } // profile_idc = 66 → baseline profile;
+ // profile_idc = 77 → main profile;
+ // profile_idc = 88 → extended profile;
+ // 在新版的标准中,还包括了High、High 10、High 4:2:2、High 4:4:4、High 10 Intra、High
+ // 4:2:2 Intra、High 4:4:4 Intra、CAVLC 4:4:4 Intra
+
+
+ static getProfileString(profile_idc) {
+ switch (profile_idc) {
+ case 66:
+ return 'Baseline';
+
+ case 77:
+ return 'Main';
+
+ case 88:
+ return 'Extended';
+
+ case 100:
+ return 'High';
+
+ case 110:
+ return 'High10';
+
+ case 122:
+ return 'High422';
+
+ case 244:
+ return 'High444';
+
+ default:
+ return 'Unknown';
+ }
+ }
+
+ static getLevelString(level_idc) {
+ return (level_idc / 10).toFixed(1);
+ }
+
+ static getChromaFormatString(chroma) {
+ switch (chroma) {
+ case 420:
+ return '4:2:0';
+
+ case 422:
+ return '4:2:2';
+
+ case 444:
+ return '4:4:4';
+
+ default:
+ return 'Unknown';
+ }
+ }
+
+ }
+
+ function parseAVCDecoderConfigurationRecord(arrayBuffer) {
+ const meta = {};
+ const v = new DataView(arrayBuffer.buffer);
+ let version = v.getUint8(0); // configurationVersion
+
+ let avcProfile = v.getUint8(1); // avcProfileIndication
- v.getUint8(2); // profile_compatibil
+ v.getUint8(2); // profile_compatibil
- v.getUint8(3); // AVCLevelIndication
+ v.getUint8(3); // AVCLevelIndication
- if (version !== 1 || avcProfile === 0) {
- // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');
- return;
- }
+ if (version !== 1 || avcProfile === 0) {
+ // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');
+ return;
+ }
- const _naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne
+ const _naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne
- if (_naluLengthSize !== 3 && _naluLengthSize !== 4) {
- // holy shit!!!
- // this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${_naluLengthSize - 1}`);
- return;
- }
+ if (_naluLengthSize !== 3 && _naluLengthSize !== 4) {
+ // holy shit!!!
+ // this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${_naluLengthSize - 1}`);
+ return;
+ }
- let spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets
+ let spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets
- if (spsCount === 0) {
- // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');
- return;
- }
+ if (spsCount === 0) {
+ // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');
+ return;
+ }
- let offset = 6;
+ let offset = 6;
- for (let i = 0; i < spsCount; i++) {
- let len = v.getUint16(offset, false); // sequenceParameterSetLength
+ for (let i = 0; i < spsCount; i++) {
+ let len = v.getUint16(offset, false); // sequenceParameterSetLength
- offset += 2;
+ offset += 2;
- if (len === 0) {
- continue;
- } // Notice: Nalu without startcode header (00 00 00 01)
+ if (len === 0) {
+ continue;
+ } // Notice: Nalu without startcode header (00 00 00 01)
- let sps = new Uint8Array(arrayBuffer.buffer, offset, len);
- offset += len; // flv.js作者选择了自己来解析这个数据结构,也是迫不得已,因为JS环境下没有ffmpeg,解析这个结构主要是为了提取 sps和pps。虽然理论上sps允许有多个,但其实一般就一个。
- // packetTtype 为 1 表示 NALU,NALU= network abstract layer unit,这是H.264的概念,网络抽象层数据单元,其实简单理解就是一帧视频数据。
- // pps的信息没什么用,所以作者只实现了sps的分析器,说明作者下了很大功夫去学习264的标准,其中的Golomb解码还是挺复杂的,能解对不容易,我在PC和手机平台都是用ffmpeg去解析的。
- // SPS里面包括了视频分辨率,帧率,profile level等视频重要信息。
+ let sps = new Uint8Array(arrayBuffer.buffer, offset, len);
+ offset += len; // flv.js作者选择了自己来解析这个数据结构,也是迫不得已,因为JS环境下没有ffmpeg,解析这个结构主要是为了提取 sps和pps。虽然理论上sps允许有多个,但其实一般就一个。
+ // packetTtype 为 1 表示 NALU,NALU= network abstract layer unit,这是H.264的概念,网络抽象层数据单元,其实简单理解就是一帧视频数据。
+ // pps的信息没什么用,所以作者只实现了sps的分析器,说明作者下了很大功夫去学习264的标准,其中的Golomb解码还是挺复杂的,能解对不容易,我在PC和手机平台都是用ffmpeg去解析的。
+ // SPS里面包括了视频分辨率,帧率,profile level等视频重要信息。
- let config = SPSParser$1.parseSPS(sps);
+ let config = SPSParser$1.parseSPS(sps);
- if (i !== 0) {
- // ignore other sps's config
- continue;
- }
+ if (i !== 0) {
+ // ignore other sps's config
+ continue;
+ }
- meta.codecWidth = config.codec_size.width;
- meta.codecHeight = config.codec_size.height;
- meta.presentWidth = config.present_size.width;
- meta.presentHeight = config.present_size.height;
- meta.profile = config.profile_string;
- meta.level = config.level_string;
- meta.bitDepth = config.bit_depth;
- meta.chromaFormat = config.chroma_format;
- meta.sarRatio = config.sar_ratio;
- meta.frameRate = config.frame_rate;
+ meta.codecWidth = config.codec_size.width;
+ meta.codecHeight = config.codec_size.height;
+ meta.presentWidth = config.present_size.width;
+ meta.presentHeight = config.present_size.height;
+ meta.profile = config.profile_string;
+ meta.level = config.level_string;
+ meta.bitDepth = config.bit_depth;
+ meta.chromaFormat = config.chroma_format;
+ meta.sarRatio = config.sar_ratio;
+ meta.frameRate = config.frame_rate;
- if (config.frame_rate.fixed === false || config.frame_rate.fps_num === 0 || config.frame_rate.fps_den === 0) {
- meta.frameRate = {};
- }
+ if (config.frame_rate.fixed === false || config.frame_rate.fps_num === 0 || config.frame_rate.fps_den === 0) {
+ meta.frameRate = {};
+ }
- let fps_den = meta.frameRate.fps_den;
- let fps_num = meta.frameRate.fps_num;
- meta.refSampleDuration = meta.timescale * (fps_den / fps_num);
- let codecArray = sps.subarray(1, 4);
- let codecString = 'avc1.';
+ let fps_den = meta.frameRate.fps_den;
+ let fps_num = meta.frameRate.fps_num;
+ meta.refSampleDuration = meta.timescale * (fps_den / fps_num);
+ let codecArray = sps.subarray(1, 4);
+ let codecString = 'avc1.';
- for (let j = 0; j < 3; j++) {
- let h = codecArray[j].toString(16);
+ for (let j = 0; j < 3; j++) {
+ let h = codecArray[j].toString(16);
- if (h.length < 2) {
- h = '0' + h;
- }
+ if (h.length < 2) {
+ h = '0' + h;
+ }
- codecString += h;
- } // codec
+ codecString += h;
+ } // codec
- meta.codec = codecString;
- }
-
- let ppsCount = v.getUint8(offset); // numOfPictureParameterSets
-
- if (ppsCount === 0) {
- // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');
- return;
- }
-
- offset++;
-
- for (let i = 0; i < ppsCount; i++) {
- let len = v.getUint16(offset, false); // pictureParameterSetLength
-
- offset += 2;
-
- if (len === 0) {
- continue;
- }
-
- new Uint8Array(arrayBuffer.buffer, offset, len); // pps is useless for extracting video information
-
- offset += len;
- }
-
- meta.videoType = 'avc'; // meta.avcc = arrayBuffer;
-
- return meta;
- }
-
- class SPSParser {
- static parseSPS(uint8array) {}
-
- }
-
- function parseHEVCDecoderConfigurationRecord(arrayBuffer) {
- const meta = {};
- meta.videoType = 'hevc';
- let offset = 28 - 5; //
-
- const vpsTag = arrayBuffer[offset];
-
- if (vpsTag !== H265_NAL_TYPE.vps) {
- return meta;
- }
-
- offset += 2;
- offset += 1;
- const vpsLength = arrayBuffer[offset + 1] | arrayBuffer[offset] << 8;
- offset += 2;
- const vpsData = arrayBuffer.slice(offset, offset + vpsLength);
- console.log(Uint8Array.from(vpsData));
- offset += vpsLength;
- const spsTag = arrayBuffer[offset];
-
- if (spsTag !== H265_NAL_TYPE.sps) {
- return meta;
- }
-
- offset += 2;
- offset += 1;
- const spsLength = arrayBuffer[offset + 1] | arrayBuffer[offset] << 8;
- offset += 2;
- const spsData = arrayBuffer.slice(offset, offset + spsLength);
- console.log(Uint8Array.from(spsData));
- offset += spsLength;
- const ppsTag = arrayBuffer[offset];
-
- if (ppsTag !== H265_NAL_TYPE.pps) {
- return meta;
- }
-
- offset += 2;
- offset += 1;
- const ppsLength = arrayBuffer[offset + 1] | arrayBuffer[offset] << 8;
- offset += 2;
- const ppsData = arrayBuffer.slice(offset, offset + ppsLength);
- console.log(Uint8Array.from(ppsData));
- let sps = Uint8Array.from(spsData);
- let config = SPSParser.parseSPS(sps);
- meta.codecWidth = config.codec_size.width;
- meta.codecHeight = config.codec_size.height;
- meta.presentWidth = config.present_size.width;
- meta.presentHeight = config.present_size.height;
- meta.profile = config.profile_string;
- meta.level = config.level_string;
- meta.bitDepth = config.bit_depth;
- meta.chromaFormat = config.chroma_format;
- meta.sarRatio = config.sar_ratio;
- return meta;
- }
-
- class MseDecoder extends Emitter {
- constructor(player) {
- super();
- this.player = player;
- this.isAvc = true;
- this.mediaSource = new window.MediaSource();
- this.sourceBuffer = null;
- this.hasInit = false;
- this.isInitInfo = false;
- this.cacheTrack = {};
- this.timeInit = false;
- this.sequenceNumber = 0;
- this.mediaSourceOpen = false;
- this.bufferList = [];
- this.dropping = false;
- this.player.video.$videoElement.src = window.URL.createObjectURL(this.mediaSource);
- const {
- debug,
- events: {
- proxy
- }
- } = player;
- proxy(this.mediaSource, 'sourceopen', () => {
- this.mediaSourceOpen = true;
- this.player.emit(EVENTS.mseSourceOpen);
- });
- proxy(this.mediaSource, 'sourceclose', () => {
- this.player.emit(EVENTS.mseSourceClose);
- });
- player.debug.log('MediaSource', 'init');
- }
-
- destroy() {
- this.stop();
- this.bufferList = [];
- this.mediaSource = null;
- this.mediaSourceOpen = false;
- this.sourceBuffer = null;
- this.hasInit = false;
- this.isInitInfo = false;
- this.sequenceNumber = 0;
- this.cacheTrack = null;
- this.timeInit = false;
- this.off();
- this.player.debug.log('MediaSource', 'destroy');
- }
-
- get state() {
- return this.mediaSource.readyState;
- }
-
- get isStateOpen() {
- return this.state === MEDIA_SOURCE_STATE.open;
- }
-
- get isStateClosed() {
- return this.state === MEDIA_SOURCE_STATE.closed;
- }
-
- get isStateEnded() {
- return this.state === MEDIA_SOURCE_STATE.ended;
- }
-
- get duration() {
- return this.mediaSource.duration;
- }
-
- set duration(duration) {
- this.mediaSource.duration = duration;
- }
-
- decodeVideo(payload, ts, isIframe) {
- const player = this.player;
-
- if (!this.hasInit) {
- if (isIframe && payload[1] === 0) {
- const videoCodec = payload[0] & 0x0F;
- player.video.updateVideoInfo({
- encTypeCode: videoCodec
- }); // 如果解码出来的是
-
- if (videoCodec === VIDEO_ENC_CODE.h265) {
- this.emit(EVENTS_ERROR.mediaSourceH265NotSupport);
- return;
- }
-
- if (!player._times.decodeStart) {
- player._times.decodeStart = now();
- }
-
- this._decodeConfigurationRecord(payload, ts, isIframe, videoCodec);
-
- this.hasInit = true;
- }
- } else {
- this._decodeVideo(payload, ts, isIframe);
- }
- }
-
- _doDecode() {
- const bufferItem = this.bufferList.shift();
-
- if (bufferItem) {
- this._decodeVideo(bufferItem.payload, bufferItem.ts, bufferItem.isIframe);
- }
- }
-
- _decodeConfigurationRecord(payload, ts, isIframe, videoCodec) {
- let data = payload.slice(5);
- let config = {};
-
- if (videoCodec === VIDEO_ENC_CODE.h264) {
- config = parseAVCDecoderConfigurationRecord(data);
- } else if (videoCodec === VIDEO_ENC_CODE.h265) {
- config = parseHEVCDecoderConfigurationRecord(data);
- }
-
- const metaData = {
- id: 1,
- // video tag data
- type: 'video',
- timescale: 1000,
- duration: 0,
- avcc: data,
- codecWidth: config.codecWidth,
- codecHeight: config.codecHeight,
- videoType: config.videoType
- }; // ftyp
-
- const metaBox = MP4$1.generateInitSegment(metaData);
- this.isAvc = true;
- this.appendBuffer(metaBox.buffer);
- this.sequenceNumber = 0;
- this.cacheTrack = null;
- this.timeInit = false;
- } //
-
-
- _decodeVideo(payload, ts, isIframe) {
- const player = this.player;
- let arrayBuffer = payload.slice(5);
- let bytes = arrayBuffer.byteLength;
- let cts = 0;
- let dts = ts; // player.debug.log('MediaSource', '_decodeVideo', ts);
-
- const $video = player.video.$videoElement;
-
- if ($video.buffered.length > 1) {
- this.removeBuffer($video.buffered.start(0), $video.buffered.end(0));
- this.timeInit = false;
- }
-
- if (this.dropping && dts - this.cacheTrack.dts > 1000) {
- this.dropping = false;
- this.cacheTrack = {};
- } else if (this.cacheTrack && dts > this.cacheTrack.dts) {
- // 需要额外加8个size
- let mdatBytes = 8 + this.cacheTrack.size;
- let mdatbox = new Uint8Array(mdatBytes);
- mdatbox[0] = mdatBytes >>> 24 & 255;
- mdatbox[1] = mdatBytes >>> 16 & 255;
- mdatbox[2] = mdatBytes >>> 8 & 255;
- mdatbox[3] = mdatBytes & 255;
- mdatbox.set(MP4$1.types.mdat, 4);
- mdatbox.set(this.cacheTrack.data, 8);
- this.cacheTrack.duration = dts - this.cacheTrack.dts; // moof
-
- let moofbox = MP4$1.moof(this.cacheTrack, this.cacheTrack.dts);
- let result = new Uint8Array(moofbox.byteLength + mdatbox.byteLength);
- result.set(moofbox, 0);
- result.set(mdatbox, moofbox.byteLength); // appendBuffer
-
- this.appendBuffer(result.buffer);
- player.handleRender();
- player.updateStats({
- fps: true,
- ts: ts,
- buf: player.demux.delay
- });
-
- if (!player._times.videoStart) {
- player._times.videoStart = now();
- player.handlePlayToRenderTimes();
- }
- } else {
- player.debug.log('MediaSource', 'timeInit set false , cacheTrack = {}');
- this.timeInit = false;
- this.cacheTrack = {};
- }
-
- this.cacheTrack.id = 1;
- this.cacheTrack.sequenceNumber = ++this.sequenceNumber;
- this.cacheTrack.size = bytes;
- this.cacheTrack.dts = dts;
- this.cacheTrack.cts = cts;
- this.cacheTrack.isKeyframe = isIframe;
- this.cacheTrack.data = arrayBuffer; //
-
- this.cacheTrack.flags = {
- isLeading: 0,
- dependsOn: isIframe ? 2 : 1,
- isDependedOn: isIframe ? 1 : 0,
- hasRedundancy: 0,
- isNonSync: isIframe ? 0 : 1
- }; //
-
- if (!this.timeInit && $video.buffered.length === 1) {
- player.debug.log('MediaSource', 'timeInit set true');
- this.timeInit = true;
- $video.currentTime = $video.buffered.end(0);
- }
-
- if (!this.isInitInfo && $video.videoWidth > 0 && $video.videoHeight > 0) {
- player.debug.log('MediaSource', `updateVideoInfo: ${$video.videoWidth},${$video.videoHeight}`);
- player.video.updateVideoInfo({
- width: $video.videoWidth,
- height: $video.videoHeight
- });
- player.video.initCanvasViewSize();
- this.isInitInfo = true;
- }
- }
-
- appendBuffer(buffer) {
- const {
- debug,
- events: {
- proxy
- }
- } = this.player;
-
- if (this.sourceBuffer === null) {
- this.sourceBuffer = this.mediaSource.addSourceBuffer(MP4_CODECS.avc);
- proxy(this.sourceBuffer, 'error', error => {
- this.player.emit(EVENTS.mseSourceBufferError, error); // this.dropSourceBuffer(false)
- });
- }
-
- if (this.sourceBuffer.updating === false && this.isStateOpen) {
- this.sourceBuffer.appendBuffer(buffer);
- return;
- }
-
- if (this.isStateClosed) {
- this.player.emit(EVENTS.mseSourceBufferError, 'mediaSource is not attached to video or mediaSource is closed');
- } else if (this.isStateEnded) {
- this.player.emit(EVENTS.mseSourceBufferError, 'mediaSource is closed');
- } else {
- if (this.sourceBuffer.updating === true) {
- this.player.emit(EVENTS.mseSourceBufferBusy); // this.dropSourceBuffer(false);
- }
- }
- }
-
- stop() {
- if (this.isStateOpen) {
- if (this.sourceBuffer) {
- this.sourceBuffer.abort();
- }
- }
-
- this.endOfStream();
- }
-
- dropSourceBuffer(flag) {
- const video = this.player.video;
- const $video = video.$videoElement;
- this.dropping = flag;
-
- if ($video.buffered.length > 0) {
- if ($video.buffered.end(0) - $video.currentTime > 1) {
- $video.currentTime = $video.buffered.end(0);
- }
- }
- }
-
- removeBuffer(start, end) {
- if (this.isStateOpen && this.sourceBuffer.updating === false) {
- try {
- this.sourceBuffer.remove(start, end);
- } catch (e) {
- console.error(e);
- }
- }
- }
-
- endOfStream() {
- if (this.isStateOpen) {
- this.mediaSource.endOfStream();
- }
- }
-
- }
-
- // tks: https://github.com/richtr/NoSleep.js
- const WEBM = "data:video/webm;base64,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";
- const MP4 = "data:video/mp4;base64,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"; // Detect iOS browsers < version 10
-
- const oldIOS = () => typeof navigator !== "undefined" && parseFloat(("" + (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0, ""])[1]).replace("undefined", "3_2").replace("_", ".").replace("_", "")) < 10 && !window.MSStream; // Detect native Wake Lock API support
-
-
- const nativeWakeLock = () => "wakeLock" in navigator;
-
- class NoSleep {
- constructor(player) {
- this.player = player;
- this.enabled = false;
-
- if (nativeWakeLock()) {
- this._wakeLock = null;
-
- const handleVisibilityChange = () => {
- if (this._wakeLock !== null && document.visibilityState === "visible") {
- this.enable();
- }
- };
-
- document.addEventListener("visibilitychange", handleVisibilityChange);
- document.addEventListener("fullscreenchange", handleVisibilityChange);
- } else if (oldIOS()) {
- this.noSleepTimer = null;
- } else {
- // Set up no sleep video element
- this.noSleepVideo = document.createElement("video");
- this.noSleepVideo.setAttribute("title", "No Sleep");
- this.noSleepVideo.setAttribute("playsinline", "");
-
- this._addSourceToVideo(this.noSleepVideo, "webm", WEBM);
-
- this._addSourceToVideo(this.noSleepVideo, "mp4", MP4);
-
- this.noSleepVideo.addEventListener("loadedmetadata", () => {
- if (this.noSleepVideo.duration <= 1) {
- // webm source
- this.noSleepVideo.setAttribute("loop", "");
- } else {
- // mp4 source
- this.noSleepVideo.addEventListener("timeupdate", () => {
- if (this.noSleepVideo.currentTime > 0.5) {
- this.noSleepVideo.currentTime = Math.random();
- }
- });
- }
- });
- }
- }
-
- _addSourceToVideo(element, type, dataURI) {
- var source = document.createElement("source");
- source.src = dataURI;
- source.type = `video/${type}`;
- element.appendChild(source);
- }
-
- get isEnabled() {
- return this.enabled;
- }
-
- enable() {
- const debug = this.player.debug;
-
- if (nativeWakeLock()) {
- return navigator.wakeLock.request("screen").then(wakeLock => {
- this._wakeLock = wakeLock;
- this.enabled = true;
- debug.log('wakeLock', 'Wake Lock active.');
-
- this._wakeLock.addEventListener("release", () => {
- // ToDo: Potentially emit an event for the page to observe since
- // Wake Lock releases happen when page visibility changes.
- // (https://web.dev/wakelock/#wake-lock-lifecycle)
- debug.log('wakeLock', 'Wake Lock released.');
- });
- }).catch(err => {
- this.enabled = false;
- debug.error('wakeLock', `${err.name}, ${err.message}`);
- throw err;
- });
- } else if (oldIOS()) {
- this.disable();
- this.noSleepTimer = window.setInterval(() => {
- if (!document.hidden) {
- window.location.href = window.location.href.split("#")[0];
- window.setTimeout(window.stop, 0);
- }
- }, 15000);
- this.enabled = true;
- return Promise.resolve();
- } else {
- let playPromise = this.noSleepVideo.play();
- return playPromise.then(res => {
- this.enabled = true;
- return res;
- }).catch(err => {
- this.enabled = false;
- throw err;
- });
- }
- }
-
- disable() {
- const debug = this.player.debug;
-
- if (nativeWakeLock()) {
- if (this._wakeLock) {
- this._wakeLock.release();
- }
-
- this._wakeLock = null;
- } else if (oldIOS()) {
- if (this.noSleepTimer) {
- debug.warn('wakeLock', 'NoSleep now disabled for older iOS devices.');
- window.clearInterval(this.noSleepTimer);
- this.noSleepTimer = null;
- }
- } else {
- this.noSleepVideo.pause();
- }
-
- this.enabled = false;
- }
-
- }
-
- class Player extends Emitter {
- constructor(container, options) {
- super();
- this.$container = container;
- this._opt = Object.assign({}, DEFAULT_PLAYER_OPTIONS, options);
- this.debug = new Debug(this);
-
- if (this._opt.useWCS) {
- this._opt.useWCS = supportWCS();
- }
-
- if (this._opt.useMSE) {
- this._opt.useMSE = supportMSE();
- } // 如果使用mse则强制不允许 webcodecs
-
-
- if (this._opt.useMSE) {
- if (this._opt.useWCS) {
- this.debug.log('Player', 'useWCS set true->false');
- }
-
- if (!this._opt.forceNoOffscreen) {
- this.debug.log('Player', 'forceNoOffscreen set false->true');
- }
-
- this._opt.useWCS = false;
- this._opt.forceNoOffscreen = true;
- } else if (this._opt.useWCS) ;
-
- if (!this._opt.forceNoOffscreen) {
- if (!supportOffscreenV2()) {
- this._opt.forceNoOffscreen = true;
- this._opt.useOffscreen = false;
- } else {
- this._opt.useOffscreen = true;
- }
- }
-
- if (!this._opt.hasAudio) {
- this._opt.operateBtns.audio = false;
- }
-
- this._opt.hasControl = this._hasControl(); //
-
- this._loading = false;
- this._playing = false;
- this._hasLoaded = false; //
-
- this._checkHeartTimeout = null;
- this._checkLoadingTimeout = null; //
-
- this._startBpsTime = null;
- this._isPlayingBeforePageHidden = false;
- this._stats = {
- buf: 0,
- // 当前缓冲区时长,单位毫秒,
- fps: 0,
- // 当前视频帧率
- abps: 0,
- // 当前音频码率,单位bit
- vbps: 0,
- // 当前视频码率,单位bit
- ts: 0 // 当前视频帧pts,单位毫秒
-
- }; // 各个步骤的时间统计
-
- this._times = initPlayTimes(); //
-
- this._videoTimestamp = 0;
- this._audioTimestamp = 0;
- property$1(this);
- this.events = new Events(this);
- this.video = new Video(this);
-
- if (this._opt.hasAudio) {
- this.audio = new Audio(this);
- }
-
- this.recorder = new Recorder(this);
-
- if (!this._onlyMseOrWcsVideo()) {
- this.decoderWorker = new DecoderWorker(this);
- } else {
- this.loaded = true;
- }
-
- this.stream = null;
- this.demux = null;
-
- if (this._opt.useWCS) {
- this.webcodecsDecoder = new WebcodecsDecoder(this);
- }
-
- if (this._opt.useMSE) {
- this.mseDecoder = new MseDecoder(this);
- } //
-
-
- this.control = new Control(this);
- this.keepScreenOn = new NoSleep(this);
- events$1(this);
- observer(this);
-
- if (this._opt.useWCS) {
- this.debug.log('Player', 'use WCS');
- }
-
- if (this._opt.useMSE) {
- this.debug.log('Player', 'use MSE');
- }
-
- if (this._opt.useOffscreen) {
- this.debug.log('Player', 'use offscreen');
- }
-
- this.debug.log('Player options', this._opt);
- }
-
- destroy() {
- this._loading = false;
- this._playing = false;
- this._hasLoaded = false;
- this._times = initPlayTimes();
-
- if (this.decoderWorker) {
- this.decoderWorker.destroy();
- this.decoderWorker = null;
- }
-
- if (this.video) {
- this.video.destroy();
- this.video = null;
- }
-
- if (this.audio) {
- this.audio.destroy();
- this.audio = null;
- }
-
- if (this.stream) {
- this.stream.destroy();
- this.stream = null;
- }
-
- if (this.recorder) {
- this.recorder.destroy();
- this.recorder = null;
- }
-
- if (this.control) {
- this.control.destroy();
- this.control = null;
- }
-
- if (this.webcodecsDecoder) {
- this.webcodecsDecoder.destroy();
- this.webcodecsDecoder = null;
- }
-
- if (this.mseDecoder) {
- this.mseDecoder.destroy();
- this.mseDecoder = null;
- }
-
- if (this.demux) {
- this.demux.destroy();
- this.demux = null;
- }
-
- if (this.events) {
- this.events.destroy();
- this.events = null;
- }
-
- this.clearCheckHeartTimeout();
- this.clearCheckLoadingTimeout(); //
-
- this.releaseWakeLock();
- this.keepScreenOn = null; // reset stats
-
- this.resetStats();
- this._audioTimestamp = 0;
- this._videoTimestamp = 0; // 其他没法解耦的,通过 destroy 方式
-
- this.emit('destroy'); // 接触所有绑定事件
-
- this.off();
- this.debug.log('play', 'destroy end');
- }
-
- set fullscreen(value) {
- if (isMobile()) {
- this.emit(EVENTS.webFullscreen, value);
- setTimeout(() => {
- this.updateOption({
- rotate: value ? 270 : 0
- });
- this.resize();
- }, 10);
- } else {
- this.emit(EVENTS.fullscreen, value);
- }
- }
-
- get fullscreen() {
- return isFullScreen() || this.webFullscreen;
- }
-
- set webFullscreen(value) {
- this.emit(EVENTS.webFullscreen, value);
- }
-
- get webFullscreen() {
- return this.$container.classList.contains('jessibuca-fullscreen-web');
- }
-
- set loaded(value) {
- this._hasLoaded = value;
- }
-
- get loaded() {
- return this._hasLoaded;
- } //
-
-
- set playing(value) {
- if (value) {
- // 将loading 设置为 false
- this.loading = false;
- }
-
- if (this.playing !== value) {
- this._playing = value;
- this.emit(EVENTS.playing, value);
- this.emit(EVENTS.volumechange, this.volume);
-
- if (value) {
- this.emit(EVENTS.play);
- } else {
- this.emit(EVENTS.pause);
- }
- }
- }
-
- get playing() {
- return this._playing;
- }
-
- get volume() {
- return this.audio && this.audio.volume || 0;
- }
-
- set volume(value) {
- this.audio && this.audio.setVolume(value);
- }
-
- set loading(value) {
- if (this.loading !== value) {
- this._loading = value;
- this.emit(EVENTS.loading, this._loading);
- }
- }
-
- get loading() {
- return this._loading;
- }
-
- set recording(value) {
- if (this.playing) {
- if (value) {
- this.recorder.startRecord();
- } else {
- this.recorder.stopRecordAndSave();
- }
- }
- }
-
- get recording() {
- return this.recorder && this.recorder.recording;
- }
-
- set audioTimestamp(value) {
- if (value === null) {
- return;
- }
-
- this._audioTimestamp = value;
- } //
-
-
- get audioTimestamp() {
- return this._audioTimestamp;
- } //
-
-
- set videoTimestamp(value) {
- if (value === null) {
- return;
- }
-
- this._videoTimestamp = value; // just for wasm
-
- if (!this._opt.useWCS && !this._opt.useMSE) {
- if (this.audioTimestamp && this.videoTimestamp) {
- this.audio && this.audio.emit(EVENTS.videoSyncAudio, {
- audioTimestamp: this.audioTimestamp,
- videoTimestamp: this.videoTimestamp,
- diff: this.audioTimestamp - this.videoTimestamp
- });
- }
- }
- } //
-
-
- get videoTimestamp() {
- return this._videoTimestamp;
- }
- /**
- *
- * @param options
- */
-
-
- updateOption(options) {
- this._opt = Object.assign({}, this._opt, options);
- }
- /**
- *
- * @returns {Promise}
- */
-
-
- init() {
- return new Promise((resolve, reject) => {
- if (!this.stream) {
- this.stream = new Stream(this);
- }
-
- if (!this.demux) {
- this.demux = new Demux(this);
- }
-
- if (this._opt.useWCS) {
- if (!this.webcodecsDecoder) {
- this.webcodecsDecoder = new WebcodecsDecoder(this);
- }
- }
-
- if (this._opt.useMSE) {
- if (!this.mseDecoder) {
- this.mseDecoder = new MseDecoder(this);
- }
- }
-
- if (!this.decoderWorker && !this._onlyMseOrWcsVideo()) {
- this.decoderWorker = new DecoderWorker(this);
- this.once(EVENTS.decoderWorkerInit, () => {
- resolve();
- });
- } else {
- resolve();
- }
- });
- }
- /**
- *
- * @param url
- * @returns {Promise}
- */
-
-
- play(url) {
- return new Promise((resolve, reject) => {
- if (!url && !this._opt.url) {
- return reject();
- }
-
- this.loading = true;
- this.playing = false;
- this._times.playInitStart = now();
-
- if (!url) {
- url = this._opt.url;
- }
-
- this._opt.url = url;
- this.clearCheckHeartTimeout();
- this.init().then(() => {
- this._times.playStart = now(); //
-
- if (this._opt.isNotMute) {
- this.mute(false);
- }
-
- if (this.webcodecsDecoder) {
- this.webcodecsDecoder.once(EVENTS_ERROR.webcodecsH265NotSupport, () => {
- this.emit(EVENTS_ERROR.webcodecsH265NotSupport);
-
- if (!this._opt.autoWasm) {
- this.emit(EVENTS.error, EVENTS_ERROR.webcodecsH265NotSupport);
- }
- });
- }
-
- if (this.mseDecoder) {
- this.mseDecoder.once(EVENTS_ERROR.mediaSourceH265NotSupport, () => {
- this.emit(EVENTS_ERROR.mediaSourceH265NotSupport);
-
- if (!this._opt.autoWasm) {
- this.emit(EVENTS.error, EVENTS_ERROR.mediaSourceH265NotSupport);
- }
- });
- }
-
- this.enableWakeLock();
- this.stream.fetchStream(url); //
-
- this.checkLoadingTimeout(); // fetch error
-
- this.stream.once(EVENTS_ERROR.fetchError, error => {
- reject(error);
- }); // ws
-
- this.stream.once(EVENTS_ERROR.websocketError, error => {
- reject(error);
- }); // success
-
- this.stream.once(EVENTS.streamSuccess, () => {
- resolve();
- this._times.streamResponse = now(); //
-
- this.video.play();
- });
- }).catch(e => {
- reject(e);
- });
- });
- }
- /**
- *
- */
-
-
- close() {
- return new Promise((resolve, reject) => {
- this._close().then(() => {
- this.video.clearView();
- resolve();
- });
- });
- }
-
- _close() {
- return new Promise((resolve, reject) => {
- //
- if (this.stream) {
- this.stream.destroy();
- this.stream = null;
- }
-
- if (this.demux) {
- this.demux.destroy();
- this.demux = null;
- } //
-
-
- if (this.decoderWorker) {
- this.decoderWorker.destroy();
- this.decoderWorker = null;
- }
-
- if (this.webcodecsDecoder) {
- this.webcodecsDecoder.destroy();
- this.webcodecsDecoder = null;
- }
-
- if (this.mseDecoder) {
- this.mseDecoder.destroy();
- this.mseDecoder = null;
- }
-
- this.clearCheckHeartTimeout();
- this.clearCheckLoadingTimeout();
- this.playing = false;
- this.loading = false;
- this.recording = false; // release audio buffer
-
- this.audio && this.audio.pause(); // release lock
-
- this.releaseWakeLock(); // reset stats
-
- this.resetStats(); //
-
- this._audioTimestamp = 0;
- this._videoTimestamp = 0; //
-
- this._times = initPlayTimes(); //
-
- setTimeout(() => {
- resolve();
- }, 0);
- });
- }
- /**
- *
- * @param flag {boolean} 是否清除画面
- * @returns {Promise}
- */
-
-
- pause(flag) {
- if (flag) {
- return this.close();
- } else {
- return this._close();
- }
- }
- /**
- *
- * @param flag
- */
-
-
- mute(flag) {
- this.audio && this.audio.mute(flag);
- }
- /**
- *
- */
-
-
- resize() {
- this.video.resize();
- }
- /**
- *
- * @param fileName
- * @param fileType
- */
-
-
- startRecord(fileName, fileType) {
- if (this.recording) {
- return;
- }
-
- this.recorder.setFileName(fileName, fileType);
- this.recording = true;
- }
- /**
- *
- */
-
-
- stopRecordAndSave() {
- if (this.recording) {
- this.recording = false;
- }
- }
-
- _hasControl() {
- let result = false;
- let hasBtnShow = false;
- Object.keys(this._opt.operateBtns).forEach(key => {
- if (this._opt.operateBtns[key]) {
- hasBtnShow = true;
- }
- });
-
- if (this._opt.showBandwidth || this._opt.text || hasBtnShow) {
- result = true;
- }
-
- return result;
- }
-
- _onlyMseOrWcsVideo() {
- return this._opt.hasAudio === false && (this._opt.useMSE || this._opt.useWCS && !this._opt.useOffscreen);
- }
-
- checkHeart() {
- this.clearCheckHeartTimeout();
- this.checkHeartTimeout();
- } // 心跳检查,如果渲染间隔暂停了多少时间之后,就会抛出异常
-
-
- checkHeartTimeout() {
- this._checkHeartTimeout = setTimeout(() => {
- this.pause(false).then(() => {
- this.emit(EVENTS.timeout, EVENTS.delayTimeout);
- this.emit(EVENTS.delayTimeout);
- });
- }, this._opt.heartTimeout * 1000);
- } //
-
-
- clearCheckHeartTimeout() {
- if (this._checkHeartTimeout) {
- clearTimeout(this._checkHeartTimeout);
- this._checkHeartTimeout = null;
- }
- } // loading 等待时间
-
-
- checkLoadingTimeout() {
- this._checkLoadingTimeout = setTimeout(() => {
- this.pause(false).then(() => {
- this.emit(EVENTS.timeout, EVENTS.loadingTimeout);
- this.emit(EVENTS.loadingTimeout);
- });
- }, this._opt.loadingTimeout * 1000);
- }
-
- clearCheckLoadingTimeout() {
- if (this._checkLoadingTimeout) {
- clearTimeout(this._checkLoadingTimeout);
- this._checkLoadingTimeout = null;
- }
- }
-
- handleRender() {
- if (this.loading) {
- this.emit(EVENTS.start);
- this.loading = false;
- this.clearCheckLoadingTimeout();
- }
-
- if (!this.playing) {
- this.playing = true;
- }
-
- this.checkHeart();
- } //
-
-
- updateStats(options) {
- options = options || {};
-
- if (!this._startBpsTime) {
- this._startBpsTime = now();
- }
-
- if (isNotEmpty(options.ts)) {
- this._stats.ts = options.ts;
- }
-
- if (isNotEmpty(options.buf)) {
- this._stats.buf = options.buf;
- }
-
- if (options.fps) {
- this._stats.fps += 1;
- }
-
- if (options.abps) {
- this._stats.abps += options.abps;
- }
-
- if (options.vbps) {
- this._stats.vbps += options.vbps;
- }
-
- const _nowTime = now();
-
- const timestamp = _nowTime - this._startBpsTime;
-
- if (timestamp < 1 * 1000) {
- return;
- }
-
- this.emit(EVENTS.stats, this._stats);
- this.emit(EVENTS.performance, fpsStatus(this._stats.fps));
- this._stats.fps = 0;
- this._stats.abps = 0;
- this._stats.vbps = 0;
- this._startBpsTime = _nowTime;
- }
-
- resetStats() {
- this._startBpsTime = null;
- this._stats = {
- buf: 0,
- //ms
- fps: 0,
- abps: 0,
- vbps: 0,
- ts: 0
- };
- }
-
- enableWakeLock() {
- if (this._opt.keepScreenOn) {
- this.keepScreenOn.enable();
- }
- }
-
- releaseWakeLock() {
- if (this._opt.keepScreenOn) {
- this.keepScreenOn.disable();
- }
- }
-
- handlePlayToRenderTimes() {
- const _times = this._times;
- _times.playTimestamp = _times.playStart - _times.playInitStart;
- _times.streamTimestamp = _times.streamStart - _times.playStart;
- _times.streamResponseTimestamp = _times.streamResponse - _times.streamStart;
- _times.demuxTimestamp = _times.demuxStart - _times.streamResponse;
- _times.decodeTimestamp = _times.decodeStart - _times.demuxStart;
- _times.videoTimestamp = _times.videoStart - _times.decodeStart;
- _times.allTimestamp = _times.videoStart - _times.playInitStart;
- this.emit(EVENTS.playToRenderTimes, _times);
- }
-
- }
-
- class Jessibuca extends Emitter {
- static ERROR = EVENTS_ERROR;
- static TIMEOUT = {
- loadingTimeout: EVENTS.loadingTimeout,
- delayTimeout: EVENTS.delayTimeout
- };
-
- constructor(options) {
- super();
- let _opt = options;
- let $container = options.container;
-
- if (typeof options.container === 'string') {
- $container = document.querySelector(options.container);
- }
-
- if (!$container) {
- throw new Error('Jessibuca need container option');
- }
-
- $container.classList.add('jessibuca-container');
- delete _opt.container; // s -> ms
-
- if (isNotEmpty(_opt.videoBuffer)) {
- _opt.videoBuffer = Number(_opt.videoBuffer) * 1000;
- } // setting
-
-
- if (isNotEmpty(_opt.timeout)) {
- if (isEmpty(_opt.loadingTimeout)) {
- _opt.loadingTimeout = _opt.timeout;
- }
-
- if (isEmpty(_opt.heartTimeout)) {
- _opt.heartTimeout = _opt.timeout;
- }
- }
-
- this._opt = _opt;
- this.$container = $container;
- this._loadingTimeoutReplayTimes = 0;
- this._heartTimeoutReplayTimes = 0;
- this.events = new Events(this);
-
- this._initPlayer($container, _opt);
- }
- /**
- *
- */
-
-
- destroy() {
- if (this.events) {
- this.events.destroy();
- this.events = null;
- }
-
- if (this.player) {
- this.player.destroy();
- this.player = null;
- }
-
- this.$container = null;
- this._opt = null;
- this._loadingTimeoutReplayTimes = 0;
- this._heartTimeoutReplayTimes = 0;
- this.off();
- }
-
- _initPlayer($container, options) {
- this.player = new Player($container, options);
-
- this._bindEvents();
- }
-
- _resetPlayer() {
- let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- this.player.destroy();
- this.player = null;
-
- const _options = Object.assign(this._opt, options);
-
- this._initPlayer(this.$container, _options);
- }
-
- _bindEvents() {
- // 对外的事件
- Object.keys(JESSIBUCA_EVENTS).forEach(key => {
- this.player.on(JESSIBUCA_EVENTS[key], value => {
- this.emit(key, value);
- });
- });
- }
- /**
- * 是否开启控制台调试打印
- * @param value {Boolean}
- */
-
-
- setDebug(value) {
- this.player.updateOption({
- isDebug: !!value
- });
- }
- /**
- *
- */
-
-
- mute() {
- this.player.mute(true);
- }
- /**
- *
- */
-
-
- cancelMute() {
- this.player.mute(false);
- }
- /**
- *
- * @param value {number}
- */
-
-
- setVolume(value) {
- this.player.volume = value;
- }
- /**
- *
- */
-
-
- audioResume() {
- this.player.audio && this.player.audio.audioEnabled(true);
- }
- /**
- * 设置超时时长, 单位秒 在连接成功之前和播放中途,如果超过设定时长无数据返回,则回调timeout事件
- * @param value {number}
- */
-
-
- setTimeout(time) {
- time = Number(time);
- this.player.updateOption({
- timeout: time,
- loadingTimeout: time,
- heartTimeout: time
- });
- }
- /**
- *
- * @param type {number}: 0,1,2
- */
-
-
- setScaleMode(type) {
- type = Number(type);
- let options = {
- isFullResize: false,
- isResize: false
- };
-
- switch (type) {
- case SCALE_MODE_TYPE.full:
- options.isFullResize = false;
- options.isResize = false;
- break;
-
- case SCALE_MODE_TYPE.auto:
- options.isFullResize = false;
- options.isResize = true;
- break;
-
- case SCALE_MODE_TYPE.fullAuto:
- options.isFullResize = true;
- options.isResize = true;
- break;
- }
-
- this.player.updateOption(options);
- this.resize();
- }
- /**
- *
- * @returns {Promise}
- */
-
-
- pause() {
- return this.player.pause();
- }
- /**
- *
- */
-
-
- close() {
- // clear url
- this._opt.url = '';
- return this.player.close();
- }
- /**
- *
- */
-
-
- clearView() {
- this.player.video.clearView();
- }
- /**
- *
- * @param url {string}
- * @returns {Promise}
- */
-
-
- play(url) {
- return new Promise((resolve, reject) => {
- if (!url && !this._opt.url) {
- this.emit(EVENTS.error, EVENTS_ERROR.playError);
- reject();
- return;
- }
-
- if (url) {
- // url 相等的时候。
- if (this._opt.url) {
- // 存在相同的 url
- if (url === this._opt.url) {
- // 正在播放
- if (this.player.playing) {
- resolve();
- } else {
- // pause -> play
- this.clearView();
- this.player.play(this._opt.url).then(() => {
- resolve();
- }).catch(() => {
- this.player.pause().then(() => {
- reject();
- });
- });
- }
- } else {
- // url 发生改变了
- this.player.pause().then(() => {
- // 清除 画面
- this.clearView();
- return this._play(url);
- }).catch(() => {
- reject();
- });
- }
- } else {
- return this._play(url);
- }
- } else {
- // url 不存在的时候
- // 就是从 play -> pause -> play
- this.player.play(this._opt.url).then(() => {
- resolve();
- }).catch(() => {
- this.player.pause().then(() => {
- reject();
- });
- });
- }
- });
- }
- /**
- *
- * @param url {string}
- * @returns {Promise}
- * @private
- */
-
-
- _play(url) {
- return new Promise((resolve, reject) => {
- this._opt.url = url; // 新的url
-
- const isHttp = url.indexOf("http") === 0; //
-
- const protocol = isHttp ? PLAYER_PLAY_PROTOCOL.fetch : PLAYER_PLAY_PROTOCOL.websocket; //
-
- const demuxType = isHttp || url.indexOf(".flv") !== -1 || this._opt.isFlv ? DEMUX_TYPE.flv : DEMUX_TYPE.m7s;
- this.player.updateOption({
- protocol,
- demuxType
- });
- this.player.once(EVENTS_ERROR.mediaSourceH265NotSupport, () => {
- this.close().then(() => {
- if (this.player._opt.autoWasm) {
- this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play');
-
- this._resetPlayer({
- useMSE: false
- });
-
- this.play(url).then(() => {
- // resolve();
- this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play success');
- }).catch(() => {
- // reject();
- this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play error');
- });
- }
- });
- });
- this.player.once(EVENTS_ERROR.webcodecsH265NotSupport, () => {
- this.close().then(() => {
- if (this.player._opt.autoWasm) {
- this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play');
-
- this._resetPlayer({
- useWCS: false
- });
-
- this.play(url).then(() => {
- // resolve();
- this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play success');
- }).catch(() => {
- // reject();
- this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play error');
- });
- }
- });
- }); // 解码报错。
-
- this.player.once(EVENTS_ERROR.wasmDecodeError, () => {
- if (this.player._opt.wasmDecodeErrorReplay) {
- this.close().then(() => {
- this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play');
-
- this._resetPlayer({
- useWCS: false
- });
-
- this.play(url).then(() => {
- // resolve();
- this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play success');
- }).catch(() => {
- // reject();
- this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play error');
- });
- });
- }
- }); // 监听 delay timeout
-
- this.player.once(EVENTS.delayTimeout, () => {
- if (this.player._opt.heartTimeoutReplay && this._heartTimeoutReplayTimes < this.player._opt.heartTimeoutReplayTimes) {
- this._heartTimeoutReplayTimes += 1;
- this.play(url).then(() => {
- // resolve();
- this._heartTimeoutReplayTimes = 0;
- }).catch(() => {// reject();
- });
- }
- }); // 监听 loading timeout
-
- this.player.once(EVENTS.loadingTimeout, () => {
- if (this.player._opt.loadingTimeoutReplay && this._loadingTimeoutReplayTimes < this.player._opt.loadingTimeoutReplayTimes) {
- this._loadingTimeoutReplayTimes += 1;
- this.play(url).then(() => {
- // resolve();
- this._loadingTimeoutReplayTimes = 0;
- }).catch(() => {// reject();
- });
- }
- });
-
- if (this.hasLoaded()) {
- this.player.play(url).then(() => {
- resolve();
- }).catch(() => {
- this.player.pause().then(() => {
- reject();
- });
- });
- } else {
- this.player.once(EVENTS.decoderWorkerInit, () => {
- this.player.play(url).then(() => {
- resolve();
- }).catch(() => {
- this.player.pause().then(() => {
- reject();
- });
- });
- });
- }
- });
- }
- /**
- *
- */
-
-
- resize() {
- this.player.resize();
- }
- /**
- *
- * @param time {number} s
- */
-
-
- setBufferTime(time) {
- time = Number(time); // s -> ms
-
- this.player.updateOption({
- videoBuffer: time * 1000
- }); // update worker config
-
- this.player.decoderWorker && this.player.decoderWorker.updateWorkConfig({
- key: 'videoBuffer',
- value: time * 1000
- });
- }
- /**
- *
- * @param deg {number}
- */
-
-
- setRotate(deg) {
- deg = parseInt(deg, 10);
- const list = [0, 90, 270];
-
- if (this._opt.rotate === deg || list.indexOf(deg) === -1) {
- return;
- }
-
- this.player.updateOption({
- rotate: deg
- });
- this.resize();
- }
- /**
- *
- * @returns {boolean}
- */
-
-
- hasLoaded() {
- return this.player.loaded;
- }
- /**
- *
- */
-
-
- setKeepScreenOn() {
- this.player.updateOption({
- keepScreenOn: true
- });
- }
- /**
- *
- * @param flag {Boolean}
- */
-
-
- setFullscreen(flag) {
- const fullscreen = !!flag;
-
- if (this.player.fullscreen !== fullscreen) {
- this.player.fullscreen = fullscreen;
- }
- }
- /**
- *
- * @param filename {string}
- * @param format {string}
- * @param quality {number}
- * @param type {string} download,base64,blob
- */
-
-
- screenshot(filename, format, quality, type) {
- return this.player.video.screenshot(filename, format, quality, type);
- }
- /**
- *
- * @param fileName {string}
- * @param fileType {string}
- * @returns {Promise}
- */
-
-
- startRecord(fileName, fileType) {
- return new Promise((resolve, reject) => {
- if (this.player.playing) {
- this.player.startRecord(fileName, fileType);
- resolve();
- } else {
- reject();
- }
- });
- }
-
- stopRecordAndSave() {
- if (this.player.recording) {
- this.player.stopRecordAndSave();
- }
- }
- /**
- *
- * @returns {Boolean}
- */
-
-
- isPlaying() {
- return this.player.playing;
- }
- /**
- * 是否静音状态
- * @returns {Boolean}
- */
-
-
- isMute() {
- return this.player.audio ? this.player.audio.isMute : true;
- }
- /**
- * 是否在录制视频
- * @returns {*}
- */
-
-
- isRecording() {
- return this.player.recorder.recording;
- }
-
- }
-
- window.Jessibuca = Jessibuca;
-
- return Jessibuca;
+ meta.codec = codecString;
+ }
+
+ let ppsCount = v.getUint8(offset); // numOfPictureParameterSets
+
+ if (ppsCount === 0) {
+ // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');
+ return;
+ }
+
+ offset++;
+
+ for (let i = 0; i < ppsCount; i++) {
+ let len = v.getUint16(offset, false); // pictureParameterSetLength
+
+ offset += 2;
+
+ if (len === 0) {
+ continue;
+ }
+
+ new Uint8Array(arrayBuffer.buffer, offset, len); // pps is useless for extracting video information
+
+ offset += len;
+ }
+
+ meta.videoType = 'avc'; // meta.avcc = arrayBuffer;
+
+ return meta;
+ }
+
+ class SPSParser {
+ static parseSPS(uint8array) {}
+
+ }
+
+ function parseHEVCDecoderConfigurationRecord(arrayBuffer) {
+ const meta = {};
+ meta.videoType = 'hevc';
+ let offset = 28 - 5; //
+
+ const vpsTag = arrayBuffer[offset];
+
+ if (vpsTag !== H265_NAL_TYPE.vps) {
+ return meta;
+ }
+
+ offset += 2;
+ offset += 1;
+ const vpsLength = arrayBuffer[offset + 1] | arrayBuffer[offset] << 8;
+ offset += 2;
+ const vpsData = arrayBuffer.slice(offset, offset + vpsLength);
+ console.log(Uint8Array.from(vpsData));
+ offset += vpsLength;
+ const spsTag = arrayBuffer[offset];
+
+ if (spsTag !== H265_NAL_TYPE.sps) {
+ return meta;
+ }
+
+ offset += 2;
+ offset += 1;
+ const spsLength = arrayBuffer[offset + 1] | arrayBuffer[offset] << 8;
+ offset += 2;
+ const spsData = arrayBuffer.slice(offset, offset + spsLength);
+ console.log(Uint8Array.from(spsData));
+ offset += spsLength;
+ const ppsTag = arrayBuffer[offset];
+
+ if (ppsTag !== H265_NAL_TYPE.pps) {
+ return meta;
+ }
+
+ offset += 2;
+ offset += 1;
+ const ppsLength = arrayBuffer[offset + 1] | arrayBuffer[offset] << 8;
+ offset += 2;
+ const ppsData = arrayBuffer.slice(offset, offset + ppsLength);
+ console.log(Uint8Array.from(ppsData));
+ let sps = Uint8Array.from(spsData);
+ let config = SPSParser.parseSPS(sps);
+ meta.codecWidth = config.codec_size.width;
+ meta.codecHeight = config.codec_size.height;
+ meta.presentWidth = config.present_size.width;
+ meta.presentHeight = config.present_size.height;
+ meta.profile = config.profile_string;
+ meta.level = config.level_string;
+ meta.bitDepth = config.bit_depth;
+ meta.chromaFormat = config.chroma_format;
+ meta.sarRatio = config.sar_ratio;
+ return meta;
+ }
+
+ class MseDecoder extends Emitter {
+ constructor(player) {
+ super();
+ this.player = player;
+ this.isAvc = true;
+ this.mediaSource = new window.MediaSource();
+ this.sourceBuffer = null;
+ this.hasInit = false;
+ this.isInitInfo = false;
+ this.cacheTrack = {};
+ this.timeInit = false;
+ this.sequenceNumber = 0;
+ this.mediaSourceOpen = false;
+ this.bufferList = [];
+ this.dropping = false;
+ this.player.video.$videoElement.src = window.URL.createObjectURL(this.mediaSource);
+ const {
+ debug,
+ events: {
+ proxy
+ }
+ } = player;
+ proxy(this.mediaSource, 'sourceopen', () => {
+ this.mediaSourceOpen = true;
+ this.player.emit(EVENTS.mseSourceOpen);
+ });
+ proxy(this.mediaSource, 'sourceclose', () => {
+ this.player.emit(EVENTS.mseSourceClose);
+ });
+ player.debug.log('MediaSource', 'init');
+ }
+
+ destroy() {
+ this.stop();
+ this.bufferList = [];
+ this.mediaSource = null;
+ this.mediaSourceOpen = false;
+ this.sourceBuffer = null;
+ this.hasInit = false;
+ this.isInitInfo = false;
+ this.sequenceNumber = 0;
+ this.cacheTrack = null;
+ this.timeInit = false;
+ this.off();
+ this.player.debug.log('MediaSource', 'destroy');
+ }
+
+ get state() {
+ return this.mediaSource.readyState;
+ }
+
+ get isStateOpen() {
+ return this.state === MEDIA_SOURCE_STATE.open;
+ }
+
+ get isStateClosed() {
+ return this.state === MEDIA_SOURCE_STATE.closed;
+ }
+
+ get isStateEnded() {
+ return this.state === MEDIA_SOURCE_STATE.ended;
+ }
+
+ get duration() {
+ return this.mediaSource.duration;
+ }
+
+ set duration(duration) {
+ this.mediaSource.duration = duration;
+ }
+
+ decodeVideo(payload, ts, isIframe) {
+ const player = this.player;
+
+ if (!this.hasInit) {
+ if (isIframe && payload[1] === 0) {
+ const videoCodec = payload[0] & 0x0F;
+ player.video.updateVideoInfo({
+ encTypeCode: videoCodec
+ }); // 如果解码出来的是
+
+ if (videoCodec === VIDEO_ENC_CODE.h265) {
+ this.emit(EVENTS_ERROR.mediaSourceH265NotSupport);
+ return;
+ }
+
+ if (!player._times.decodeStart) {
+ player._times.decodeStart = now();
+ }
+
+ this._decodeConfigurationRecord(payload, ts, isIframe, videoCodec);
+
+ this.hasInit = true;
+ }
+ } else {
+ this._decodeVideo(payload, ts, isIframe);
+ }
+ }
+
+ _doDecode() {
+ const bufferItem = this.bufferList.shift();
+
+ if (bufferItem) {
+ this._decodeVideo(bufferItem.payload, bufferItem.ts, bufferItem.isIframe);
+ }
+ }
+
+ _decodeConfigurationRecord(payload, ts, isIframe, videoCodec) {
+ let data = payload.slice(5);
+ let config = {};
+
+ if (videoCodec === VIDEO_ENC_CODE.h264) {
+ config = parseAVCDecoderConfigurationRecord(data);
+ } else if (videoCodec === VIDEO_ENC_CODE.h265) {
+ config = parseHEVCDecoderConfigurationRecord(data);
+ }
+
+ const metaData = {
+ id: 1,
+ // video tag data
+ type: 'video',
+ timescale: 1000,
+ duration: 0,
+ avcc: data,
+ codecWidth: config.codecWidth,
+ codecHeight: config.codecHeight,
+ videoType: config.videoType
+ }; // ftyp
+
+ const metaBox = MP4$1.generateInitSegment(metaData);
+ this.isAvc = true;
+ this.appendBuffer(metaBox.buffer);
+ this.sequenceNumber = 0;
+ this.cacheTrack = null;
+ this.timeInit = false;
+ } //
+
+
+ _decodeVideo(payload, ts, isIframe) {
+ const player = this.player;
+ let arrayBuffer = payload.slice(5);
+ let bytes = arrayBuffer.byteLength;
+ let cts = 0;
+ let dts = ts; // player.debug.log('MediaSource', '_decodeVideo', ts);
+
+ const $video = player.video.$videoElement;
+
+ if ($video.buffered.length > 1) {
+ this.removeBuffer($video.buffered.start(0), $video.buffered.end(0));
+ this.timeInit = false;
+ }
+
+ if (this.dropping && dts - this.cacheTrack.dts > 1000) {
+ this.dropping = false;
+ this.cacheTrack = {};
+ } else if (this.cacheTrack && dts > this.cacheTrack.dts) {
+ // 需要额外加8个size
+ let mdatBytes = 8 + this.cacheTrack.size;
+ let mdatbox = new Uint8Array(mdatBytes);
+ mdatbox[0] = mdatBytes >>> 24 & 255;
+ mdatbox[1] = mdatBytes >>> 16 & 255;
+ mdatbox[2] = mdatBytes >>> 8 & 255;
+ mdatbox[3] = mdatBytes & 255;
+ mdatbox.set(MP4$1.types.mdat, 4);
+ mdatbox.set(this.cacheTrack.data, 8);
+ this.cacheTrack.duration = dts - this.cacheTrack.dts; // moof
+
+ let moofbox = MP4$1.moof(this.cacheTrack, this.cacheTrack.dts);
+ let result = new Uint8Array(moofbox.byteLength + mdatbox.byteLength);
+ result.set(moofbox, 0);
+ result.set(mdatbox, moofbox.byteLength); // appendBuffer
+
+ this.appendBuffer(result.buffer);
+ player.handleRender();
+ player.updateStats({
+ fps: true,
+ ts: ts,
+ buf: player.demux.delay
+ });
+
+ if (!player._times.videoStart) {
+ player._times.videoStart = now();
+ player.handlePlayToRenderTimes();
+ }
+ } else {
+ player.debug.log('MediaSource', 'timeInit set false , cacheTrack = {}');
+ this.timeInit = false;
+ this.cacheTrack = {};
+ }
+
+ this.cacheTrack.id = 1;
+ this.cacheTrack.sequenceNumber = ++this.sequenceNumber;
+ this.cacheTrack.size = bytes;
+ this.cacheTrack.dts = dts;
+ this.cacheTrack.cts = cts;
+ this.cacheTrack.isKeyframe = isIframe;
+ this.cacheTrack.data = arrayBuffer; //
+
+ this.cacheTrack.flags = {
+ isLeading: 0,
+ dependsOn: isIframe ? 2 : 1,
+ isDependedOn: isIframe ? 1 : 0,
+ hasRedundancy: 0,
+ isNonSync: isIframe ? 0 : 1
+ }; //
+
+ if (!this.timeInit && $video.buffered.length === 1) {
+ player.debug.log('MediaSource', 'timeInit set true');
+ this.timeInit = true;
+ $video.currentTime = $video.buffered.end(0);
+ }
+
+ if (!this.isInitInfo && $video.videoWidth > 0 && $video.videoHeight > 0) {
+ player.debug.log('MediaSource', `updateVideoInfo: ${$video.videoWidth},${$video.videoHeight}`);
+ player.video.updateVideoInfo({
+ width: $video.videoWidth,
+ height: $video.videoHeight
+ });
+ player.video.initCanvasViewSize();
+ this.isInitInfo = true;
+ }
+ }
+
+ appendBuffer(buffer) {
+ const {
+ debug,
+ events: {
+ proxy
+ }
+ } = this.player;
+
+ if (this.sourceBuffer === null) {
+ this.sourceBuffer = this.mediaSource.addSourceBuffer(MP4_CODECS.avc);
+ proxy(this.sourceBuffer, 'error', error => {
+ this.player.emit(EVENTS.mseSourceBufferError, error); // this.dropSourceBuffer(false)
+ });
+ }
+
+ if (this.sourceBuffer.updating === false && this.isStateOpen) {
+ this.sourceBuffer.appendBuffer(buffer);
+ return;
+ }
+
+ if (this.isStateClosed) {
+ this.player.emit(EVENTS.mseSourceBufferError, 'mediaSource is not attached to video or mediaSource is closed');
+ } else if (this.isStateEnded) {
+ this.player.emit(EVENTS.mseSourceBufferError, 'mediaSource is closed');
+ } else {
+ if (this.sourceBuffer.updating === true) {
+ this.player.emit(EVENTS.mseSourceBufferBusy); // this.dropSourceBuffer(false);
+ }
+ }
+ }
+
+ stop() {
+ if (this.isStateOpen) {
+ if (this.sourceBuffer) {
+ this.sourceBuffer.abort();
+ }
+ }
+
+ this.endOfStream();
+ }
+
+ dropSourceBuffer(flag) {
+ const video = this.player.video;
+ const $video = video.$videoElement;
+ this.dropping = flag;
+
+ if ($video.buffered.length > 0) {
+ if ($video.buffered.end(0) - $video.currentTime > 1) {
+ $video.currentTime = $video.buffered.end(0);
+ }
+ }
+ }
+
+ removeBuffer(start, end) {
+ if (this.isStateOpen && this.sourceBuffer.updating === false) {
+ try {
+ this.sourceBuffer.remove(start, end);
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ }
+
+ endOfStream() {
+ if (this.isStateOpen) {
+ this.mediaSource.endOfStream();
+ }
+ }
+
+ }
+
+ // tks: https://github.com/richtr/NoSleep.js
+ const WEBM = "data:video/webm;base64,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";
+ const MP4 = "data:video/mp4;base64,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"; // Detect iOS browsers < version 10
+
+ const oldIOS = () => typeof navigator !== "undefined" && parseFloat(("" + (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0, ""])[1]).replace("undefined", "3_2").replace("_", ".").replace("_", "")) < 10 && !window.MSStream; // Detect native Wake Lock API support
+
+
+ const nativeWakeLock = () => "wakeLock" in navigator;
+
+ class NoSleep {
+ constructor(player) {
+ this.player = player;
+ this.enabled = false;
+
+ if (nativeWakeLock()) {
+ this._wakeLock = null;
+
+ const handleVisibilityChange = () => {
+ if (this._wakeLock !== null && document.visibilityState === "visible") {
+ this.enable();
+ }
+ };
+
+ document.addEventListener("visibilitychange", handleVisibilityChange);
+ document.addEventListener("fullscreenchange", handleVisibilityChange);
+ } else if (oldIOS()) {
+ this.noSleepTimer = null;
+ } else {
+ // Set up no sleep video element
+ this.noSleepVideo = document.createElement("video");
+ this.noSleepVideo.setAttribute("title", "No Sleep");
+ this.noSleepVideo.setAttribute("playsinline", "");
+
+ this._addSourceToVideo(this.noSleepVideo, "webm", WEBM);
+
+ this._addSourceToVideo(this.noSleepVideo, "mp4", MP4);
+
+ this.noSleepVideo.addEventListener("loadedmetadata", () => {
+ if (this.noSleepVideo.duration <= 1) {
+ // webm source
+ this.noSleepVideo.setAttribute("loop", "");
+ } else {
+ // mp4 source
+ this.noSleepVideo.addEventListener("timeupdate", () => {
+ if (this.noSleepVideo.currentTime > 0.5) {
+ this.noSleepVideo.currentTime = Math.random();
+ }
+ });
+ }
+ });
+ }
+ }
+
+ _addSourceToVideo(element, type, dataURI) {
+ var source = document.createElement("source");
+ source.src = dataURI;
+ source.type = `video/${type}`;
+ element.appendChild(source);
+ }
+
+ get isEnabled() {
+ return this.enabled;
+ }
+
+ enable() {
+ const debug = this.player.debug;
+
+ if (nativeWakeLock()) {
+ return navigator.wakeLock.request("screen").then(wakeLock => {
+ this._wakeLock = wakeLock;
+ this.enabled = true;
+ debug.log('wakeLock', 'Wake Lock active.');
+
+ this._wakeLock.addEventListener("release", () => {
+ // ToDo: Potentially emit an event for the page to observe since
+ // Wake Lock releases happen when page visibility changes.
+ // (https://web.dev/wakelock/#wake-lock-lifecycle)
+ debug.log('wakeLock', 'Wake Lock released.');
+ });
+ }).catch(err => {
+ this.enabled = false;
+ debug.error('wakeLock', `${err.name}, ${err.message}`);
+ throw err;
+ });
+ } else if (oldIOS()) {
+ this.disable();
+ this.noSleepTimer = window.setInterval(() => {
+ if (!document.hidden) {
+ window.location.href = window.location.href.split("#")[0];
+ window.setTimeout(window.stop, 0);
+ }
+ }, 15000);
+ this.enabled = true;
+ return Promise.resolve();
+ } else {
+ let playPromise = this.noSleepVideo.play();
+ return playPromise.then(res => {
+ this.enabled = true;
+ return res;
+ }).catch(err => {
+ this.enabled = false;
+ throw err;
+ });
+ }
+ }
+
+ disable() {
+ const debug = this.player.debug;
+
+ if (nativeWakeLock()) {
+ if (this._wakeLock) {
+ this._wakeLock.release();
+ }
+
+ this._wakeLock = null;
+ } else if (oldIOS()) {
+ if (this.noSleepTimer) {
+ debug.warn('wakeLock', 'NoSleep now disabled for older iOS devices.');
+ window.clearInterval(this.noSleepTimer);
+ this.noSleepTimer = null;
+ }
+ } else {
+ this.noSleepVideo.pause();
+ }
+
+ this.enabled = false;
+ }
+
+ }
+
+ class Player extends Emitter {
+ constructor(container, options) {
+ super();
+ this.$container = container;
+ this._opt = Object.assign({}, DEFAULT_PLAYER_OPTIONS, options);
+ this.debug = new Debug(this);
+
+ if (this._opt.useWCS) {
+ this._opt.useWCS = supportWCS();
+ }
+
+ if (this._opt.useMSE) {
+ this._opt.useMSE = supportMSE();
+ } // 如果使用mse则强制不允许 webcodecs
+
+
+ if (this._opt.useMSE) {
+ if (this._opt.useWCS) {
+ this.debug.log('Player', 'useWCS set true->false');
+ }
+
+ if (!this._opt.forceNoOffscreen) {
+ this.debug.log('Player', 'forceNoOffscreen set false->true');
+ }
+
+ this._opt.useWCS = false;
+ this._opt.forceNoOffscreen = true;
+ } else if (this._opt.useWCS) ;
+
+ if (!this._opt.forceNoOffscreen) {
+ if (!supportOffscreenV2()) {
+ this._opt.forceNoOffscreen = true;
+ this._opt.useOffscreen = false;
+ } else {
+ this._opt.useOffscreen = true;
+ }
+ }
+
+ if (!this._opt.hasAudio) {
+ this._opt.operateBtns.audio = false;
+ }
+
+ this._opt.hasControl = this._hasControl(); //
+
+ this._loading = false;
+ this._playing = false;
+ this._hasLoaded = false; //
+
+ this._checkHeartTimeout = null;
+ this._checkLoadingTimeout = null; //
+
+ this._startBpsTime = null;
+ this._isPlayingBeforePageHidden = false;
+ this._stats = {
+ buf: 0,
+ // 当前缓冲区时长,单位毫秒,
+ fps: 0,
+ // 当前视频帧率
+ abps: 0,
+ // 当前音频码率,单位bit
+ vbps: 0,
+ // 当前视频码率,单位bit
+ ts: 0 // 当前视频帧pts,单位毫秒
+
+ }; // 各个步骤的时间统计
+
+ this._times = initPlayTimes(); //
+
+ this._videoTimestamp = 0;
+ this._audioTimestamp = 0;
+ property$1(this);
+ this.events = new Events(this);
+ this.video = new Video(this);
+
+ if (this._opt.hasAudio) {
+ this.audio = new Audio(this);
+ }
+
+ this.recorder = new Recorder(this);
+
+ if (!this._onlyMseOrWcsVideo()) {
+ this.decoderWorker = new DecoderWorker(this);
+ } else {
+ this.loaded = true;
+ }
+
+ this.stream = null;
+ this.demux = null;
+
+ if (this._opt.useWCS) {
+ this.webcodecsDecoder = new WebcodecsDecoder(this);
+ }
+
+ if (this._opt.useMSE) {
+ this.mseDecoder = new MseDecoder(this);
+ } //
+
+
+ this.control = new Control(this);
+ this.keepScreenOn = new NoSleep(this);
+ events$1(this);
+ observer(this);
+
+ if (this._opt.useWCS) {
+ this.debug.log('Player', 'use WCS');
+ }
+
+ if (this._opt.useMSE) {
+ this.debug.log('Player', 'use MSE');
+ }
+
+ if (this._opt.useOffscreen) {
+ this.debug.log('Player', 'use offscreen');
+ }
+
+ this.debug.log('Player options', this._opt);
+ }
+
+ destroy() {
+ this._loading = false;
+ this._playing = false;
+ this._hasLoaded = false;
+ this._times = initPlayTimes();
+
+ if (this.decoderWorker) {
+ this.decoderWorker.destroy();
+ this.decoderWorker = null;
+ }
+
+ if (this.video) {
+ this.video.destroy();
+ this.video = null;
+ }
+
+ if (this.audio) {
+ this.audio.destroy();
+ this.audio = null;
+ }
+
+ if (this.stream) {
+ this.stream.destroy();
+ this.stream = null;
+ }
+
+ if (this.recorder) {
+ this.recorder.destroy();
+ this.recorder = null;
+ }
+
+ if (this.control) {
+ this.control.destroy();
+ this.control = null;
+ }
+
+ if (this.webcodecsDecoder) {
+ this.webcodecsDecoder.destroy();
+ this.webcodecsDecoder = null;
+ }
+
+ if (this.mseDecoder) {
+ this.mseDecoder.destroy();
+ this.mseDecoder = null;
+ }
+
+ if (this.demux) {
+ this.demux.destroy();
+ this.demux = null;
+ }
+
+ if (this.events) {
+ this.events.destroy();
+ this.events = null;
+ }
+
+ this.clearCheckHeartTimeout();
+ this.clearCheckLoadingTimeout(); //
+
+ this.releaseWakeLock();
+ this.keepScreenOn = null; // reset stats
+
+ this.resetStats();
+ this._audioTimestamp = 0;
+ this._videoTimestamp = 0; // 其他没法解耦的,通过 destroy 方式
+
+ this.emit('destroy'); // 接触所有绑定事件
+
+ this.off();
+ this.debug.log('play', 'destroy end');
+ }
+
+ set fullscreen(value) {
+ if (isMobile()) {
+ this.emit(EVENTS.webFullscreen, value);
+ setTimeout(() => {
+ this.updateOption({
+ rotate: value ? 270 : 0
+ });
+ this.resize();
+ }, 10);
+ } else {
+ this.emit(EVENTS.fullscreen, value);
+ }
+ }
+
+ get fullscreen() {
+ return isFullScreen() || this.webFullscreen;
+ }
+
+ set webFullscreen(value) {
+ this.emit(EVENTS.webFullscreen, value);
+ }
+
+ get webFullscreen() {
+ return this.$container.classList.contains('jessibuca-fullscreen-web');
+ }
+
+ set loaded(value) {
+ this._hasLoaded = value;
+ }
+
+ get loaded() {
+ return this._hasLoaded;
+ } //
+
+
+ set playing(value) {
+ if (value) {
+ // 将loading 设置为 false
+ this.loading = false;
+ }
+
+ if (this.playing !== value) {
+ this._playing = value;
+ this.emit(EVENTS.playing, value);
+ this.emit(EVENTS.volumechange, this.volume);
+
+ if (value) {
+ this.emit(EVENTS.play);
+ } else {
+ this.emit(EVENTS.pause);
+ }
+ }
+ }
+
+ get playing() {
+ return this._playing;
+ }
+
+ get volume() {
+ return this.audio && this.audio.volume || 0;
+ }
+
+ set volume(value) {
+ this.audio && this.audio.setVolume(value);
+ }
+
+ set loading(value) {
+ if (this.loading !== value) {
+ this._loading = value;
+ this.emit(EVENTS.loading, this._loading);
+ }
+ }
+
+ get loading() {
+ return this._loading;
+ }
+
+ set recording(value) {
+ if (value) {
+ if (this.playing) {
+ this.recorder.startRecord();
+ }
+ } else {
+ this.recorder.stopRecordAndSave();
+ }
+ }
+
+ get recording() {
+ return this.recorder && this.recorder.recording;
+ }
+
+ set audioTimestamp(value) {
+ if (value === null) {
+ return;
+ }
+
+ this._audioTimestamp = value;
+ } //
+
+
+ get audioTimestamp() {
+ return this._audioTimestamp;
+ } //
+
+
+ set videoTimestamp(value) {
+ if (value === null) {
+ return;
+ }
+
+ this._videoTimestamp = value; // just for wasm
+
+ if (!this._opt.useWCS && !this._opt.useMSE) {
+ if (this.audioTimestamp && this.videoTimestamp) {
+ this.audio && this.audio.emit(EVENTS.videoSyncAudio, {
+ audioTimestamp: this.audioTimestamp,
+ videoTimestamp: this.videoTimestamp,
+ diff: this.audioTimestamp - this.videoTimestamp
+ });
+ }
+ }
+ } //
+
+
+ get videoTimestamp() {
+ return this._videoTimestamp;
+ }
+ /**
+ *
+ * @param options
+ */
+
+
+ updateOption(options) {
+ this._opt = Object.assign({}, this._opt, options);
+ }
+ /**
+ *
+ * @returns {Promise}
+ */
+
+
+ init() {
+ return new Promise((resolve, reject) => {
+ if (!this.stream) {
+ this.stream = new Stream(this);
+ }
+
+ if (!this.demux) {
+ this.demux = new Demux(this);
+ }
+
+ if (this._opt.useWCS) {
+ if (!this.webcodecsDecoder) {
+ this.webcodecsDecoder = new WebcodecsDecoder(this);
+ }
+ }
+
+ if (this._opt.useMSE) {
+ if (!this.mseDecoder) {
+ this.mseDecoder = new MseDecoder(this);
+ }
+ }
+
+ if (!this.decoderWorker && !this._onlyMseOrWcsVideo()) {
+ this.decoderWorker = new DecoderWorker(this);
+ this.once(EVENTS.decoderWorkerInit, () => {
+ resolve();
+ });
+ } else {
+ resolve();
+ }
+ });
+ }
+ /**
+ *
+ * @param url
+ * @returns {Promise}
+ */
+
+
+ play(url) {
+ return new Promise((resolve, reject) => {
+ if (!url && !this._opt.url) {
+ return reject();
+ }
+
+ this.loading = true;
+ this.playing = false;
+ this._times.playInitStart = now();
+
+ if (!url) {
+ url = this._opt.url;
+ }
+
+ this._opt.url = url;
+ this.clearCheckHeartTimeout();
+ this.init().then(() => {
+ this._times.playStart = now(); //
+
+ if (this._opt.isNotMute) {
+ this.mute(false);
+ }
+
+ if (this.webcodecsDecoder) {
+ this.webcodecsDecoder.once(EVENTS_ERROR.webcodecsH265NotSupport, () => {
+ this.emit(EVENTS_ERROR.webcodecsH265NotSupport);
+
+ if (!this._opt.autoWasm) {
+ this.emit(EVENTS.error, EVENTS_ERROR.webcodecsH265NotSupport);
+ }
+ });
+ }
+
+ if (this.mseDecoder) {
+ this.mseDecoder.once(EVENTS_ERROR.mediaSourceH265NotSupport, () => {
+ this.emit(EVENTS_ERROR.mediaSourceH265NotSupport);
+
+ if (!this._opt.autoWasm) {
+ this.emit(EVENTS.error, EVENTS_ERROR.mediaSourceH265NotSupport);
+ }
+ });
+ }
+
+ this.enableWakeLock();
+ this.stream.fetchStream(url); //
+
+ this.checkLoadingTimeout(); // fetch error
+
+ this.stream.once(EVENTS_ERROR.fetchError, error => {
+ reject(error);
+ }); // ws
+
+ this.stream.once(EVENTS_ERROR.websocketError, error => {
+ reject(error);
+ }); // success
+
+ this.stream.once(EVENTS.streamSuccess, () => {
+ resolve();
+ this._times.streamResponse = now(); //
+
+ this.video.play();
+ });
+ }).catch(e => {
+ reject(e);
+ });
+ });
+ }
+ /**
+ *
+ */
+
+
+ close() {
+ return new Promise((resolve, reject) => {
+ this._close().then(() => {
+ this.video.clearView();
+ resolve();
+ });
+ });
+ }
+
+ _close() {
+ return new Promise((resolve, reject) => {
+ //
+ if (this.stream) {
+ this.stream.destroy();
+ this.stream = null;
+ }
+
+ if (this.demux) {
+ this.demux.destroy();
+ this.demux = null;
+ } //
+
+
+ if (this.decoderWorker) {
+ this.decoderWorker.destroy();
+ this.decoderWorker = null;
+ }
+
+ if (this.webcodecsDecoder) {
+ this.webcodecsDecoder.destroy();
+ this.webcodecsDecoder = null;
+ }
+
+ if (this.mseDecoder) {
+ this.mseDecoder.destroy();
+ this.mseDecoder = null;
+ }
+
+ this.clearCheckHeartTimeout();
+ this.clearCheckLoadingTimeout();
+ this.playing = false;
+ this.loading = false;
+ this.recording = false; // release audio buffer
+
+ this.audio && this.audio.pause();
+ this.video && this.video.pause(); // release lock
+
+ this.releaseWakeLock(); // reset stats
+
+ this.resetStats(); //
+
+ this._audioTimestamp = 0;
+ this._videoTimestamp = 0; //
+
+ this._times = initPlayTimes(); //
+
+ setTimeout(() => {
+ resolve();
+ }, 0);
+ });
+ }
+ /**
+ *
+ * @param flag {boolean} 是否清除画面
+ * @returns {Promise}
+ */
+
+
+ pause(flag) {
+ if (flag) {
+ return this.close();
+ } else {
+ return this._close();
+ }
+ }
+ /**
+ *
+ * @param flag
+ */
+
+
+ mute(flag) {
+ this.audio && this.audio.mute(flag);
+ }
+ /**
+ *
+ */
+
+
+ resize() {
+ this.video.resize();
+ }
+ /**
+ *
+ * @param fileName
+ * @param fileType
+ */
+
+
+ startRecord(fileName, fileType) {
+ if (this.recording) {
+ return;
+ }
+
+ this.recorder.setFileName(fileName, fileType);
+ this.recording = true;
+ }
+ /**
+ *
+ */
+
+
+ stopRecordAndSave() {
+ if (this.recording) {
+ this.recording = false;
+ }
+ }
+
+ _hasControl() {
+ let result = false;
+ let hasBtnShow = false;
+ Object.keys(this._opt.operateBtns).forEach(key => {
+ if (this._opt.operateBtns[key]) {
+ hasBtnShow = true;
+ }
+ });
+
+ if (this._opt.showBandwidth || this._opt.text || hasBtnShow) {
+ result = true;
+ }
+
+ return result;
+ }
+
+ _onlyMseOrWcsVideo() {
+ return this._opt.hasAudio === false && (this._opt.useMSE || this._opt.useWCS && !this._opt.useOffscreen);
+ }
+
+ checkHeart() {
+ this.clearCheckHeartTimeout();
+ this.checkHeartTimeout();
+ } // 心跳检查,如果渲染间隔暂停了多少时间之后,就会抛出异常
+
+
+ checkHeartTimeout() {
+ this._checkHeartTimeout = setTimeout(() => {
+ this.pause(false).then(() => {
+ this.emit(EVENTS.timeout, EVENTS.delayTimeout);
+ this.emit(EVENTS.delayTimeout);
+ });
+ }, this._opt.heartTimeout * 1000);
+ } //
+
+
+ clearCheckHeartTimeout() {
+ if (this._checkHeartTimeout) {
+ clearTimeout(this._checkHeartTimeout);
+ this._checkHeartTimeout = null;
+ }
+ } // loading 等待时间
+
+
+ checkLoadingTimeout() {
+ this._checkLoadingTimeout = setTimeout(() => {
+ this.pause(false).then(() => {
+ this.emit(EVENTS.timeout, EVENTS.loadingTimeout);
+ this.emit(EVENTS.loadingTimeout);
+ });
+ }, this._opt.loadingTimeout * 1000);
+ }
+
+ clearCheckLoadingTimeout() {
+ if (this._checkLoadingTimeout) {
+ clearTimeout(this._checkLoadingTimeout);
+ this._checkLoadingTimeout = null;
+ }
+ }
+
+ handleRender() {
+ if (this.loading) {
+ this.emit(EVENTS.start);
+ this.loading = false;
+ this.clearCheckLoadingTimeout();
+ }
+
+ if (!this.playing) {
+ this.playing = true;
+ }
+
+ this.checkHeart();
+ } //
+
+
+ updateStats(options) {
+ options = options || {};
+
+ if (!this._startBpsTime) {
+ this._startBpsTime = now();
+ }
+
+ if (isNotEmpty(options.ts)) {
+ this._stats.ts = options.ts;
+ }
+
+ if (isNotEmpty(options.buf)) {
+ this._stats.buf = options.buf;
+ }
+
+ if (options.fps) {
+ this._stats.fps += 1;
+ }
+
+ if (options.abps) {
+ this._stats.abps += options.abps;
+ }
+
+ if (options.vbps) {
+ this._stats.vbps += options.vbps;
+ }
+
+ const _nowTime = now();
+
+ const timestamp = _nowTime - this._startBpsTime;
+
+ if (timestamp < 1 * 1000) {
+ return;
+ }
+
+ this.emit(EVENTS.stats, this._stats);
+ this.emit(EVENTS.performance, fpsStatus(this._stats.fps));
+ this._stats.fps = 0;
+ this._stats.abps = 0;
+ this._stats.vbps = 0;
+ this._startBpsTime = _nowTime;
+ }
+
+ resetStats() {
+ this._startBpsTime = null;
+ this._stats = {
+ buf: 0,
+ //ms
+ fps: 0,
+ abps: 0,
+ vbps: 0,
+ ts: 0
+ };
+ }
+
+ enableWakeLock() {
+ if (this._opt.keepScreenOn) {
+ this.keepScreenOn.enable();
+ }
+ }
+
+ releaseWakeLock() {
+ if (this._opt.keepScreenOn) {
+ this.keepScreenOn.disable();
+ }
+ }
+
+ handlePlayToRenderTimes() {
+ const _times = this._times;
+ _times.playTimestamp = _times.playStart - _times.playInitStart;
+ _times.streamTimestamp = _times.streamStart - _times.playStart;
+ _times.streamResponseTimestamp = _times.streamResponse - _times.streamStart;
+ _times.demuxTimestamp = _times.demuxStart - _times.streamResponse;
+ _times.decodeTimestamp = _times.decodeStart - _times.demuxStart;
+ _times.videoTimestamp = _times.videoStart - _times.decodeStart;
+ _times.allTimestamp = _times.videoStart - _times.playInitStart;
+ this.emit(EVENTS.playToRenderTimes, _times);
+ }
+
+ }
+
+ class Jessibuca extends Emitter {
+ constructor(options) {
+ super();
+ let _opt = options;
+ let $container = options.container;
+
+ if (typeof options.container === 'string') {
+ $container = document.querySelector(options.container);
+ }
+
+ if (!$container) {
+ throw new Error('Jessibuca need container option');
+ }
+
+ $container.classList.add('jessibuca-container');
+ delete _opt.container; // s -> ms
+
+ if (isNotEmpty(_opt.videoBuffer)) {
+ _opt.videoBuffer = Number(_opt.videoBuffer) * 1000;
+ } // setting
+
+
+ if (isNotEmpty(_opt.timeout)) {
+ if (isEmpty(_opt.loadingTimeout)) {
+ _opt.loadingTimeout = _opt.timeout;
+ }
+
+ if (isEmpty(_opt.heartTimeout)) {
+ _opt.heartTimeout = _opt.timeout;
+ }
+ }
+
+ this._opt = _opt;
+ this.$container = $container;
+ this._loadingTimeoutReplayTimes = 0;
+ this._heartTimeoutReplayTimes = 0;
+ this.events = new Events(this);
+
+ this._initPlayer($container, _opt);
+ }
+ /**
+ *
+ */
+
+
+ destroy() {
+ if (this.events) {
+ this.events.destroy();
+ this.events = null;
+ }
+
+ if (this.player) {
+ this.player.destroy();
+ this.player = null;
+ }
+
+ this.$container = null;
+ this._opt = null;
+ this._loadingTimeoutReplayTimes = 0;
+ this._heartTimeoutReplayTimes = 0;
+ this.off();
+ }
+
+ _initPlayer($container, options) {
+ this.player = new Player($container, options);
+
+ this._bindEvents();
+ }
+
+ _resetPlayer() {
+ let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ this.player.destroy();
+ this.player = null;
+
+ const _options = Object.assign(this._opt, options);
+
+ this._initPlayer(this.$container, _options);
+ }
+
+ _bindEvents() {
+ // 对外的事件
+ Object.keys(JESSIBUCA_EVENTS).forEach(key => {
+ this.player.on(JESSIBUCA_EVENTS[key], value => {
+ this.emit(key, value);
+ });
+ });
+ }
+ /**
+ * 是否开启控制台调试打印
+ * @param value {Boolean}
+ */
+
+
+ setDebug(value) {
+ this.player.updateOption({
+ isDebug: !!value
+ });
+ }
+ /**
+ *
+ */
+
+
+ mute() {
+ this.player.mute(true);
+ }
+ /**
+ *
+ */
+
+
+ cancelMute() {
+ this.player.mute(false);
+ }
+ /**
+ *
+ * @param value {number}
+ */
+
+
+ setVolume(value) {
+ this.player.volume = value;
+ }
+ /**
+ *
+ */
+
+
+ audioResume() {
+ this.player.audio && this.player.audio.audioEnabled(true);
+ }
+ /**
+ * 设置超时时长, 单位秒 在连接成功之前和播放中途,如果超过设定时长无数据返回,则回调timeout事件
+ * @param value {number}
+ */
+
+
+ setTimeout(time) {
+ time = Number(time);
+ this.player.updateOption({
+ timeout: time,
+ loadingTimeout: time,
+ heartTimeout: time
+ });
+ }
+ /**
+ *
+ * @param type {number}: 0,1,2
+ */
+
+
+ setScaleMode(type) {
+ type = Number(type);
+ let options = {
+ isFullResize: false,
+ isResize: false
+ };
+
+ switch (type) {
+ case SCALE_MODE_TYPE.full:
+ options.isFullResize = false;
+ options.isResize = false;
+ break;
+
+ case SCALE_MODE_TYPE.auto:
+ options.isFullResize = false;
+ options.isResize = true;
+ break;
+
+ case SCALE_MODE_TYPE.fullAuto:
+ options.isFullResize = true;
+ options.isResize = true;
+ break;
+ }
+
+ this.player.updateOption(options);
+ this.resize();
+ }
+ /**
+ *
+ * @returns {Promise}
+ */
+
+
+ pause() {
+ return this.player.pause();
+ }
+ /**
+ *
+ */
+
+
+ close() {
+ // clear url
+ this._opt.url = '';
+ return this.player.close();
+ }
+ /**
+ *
+ */
+
+
+ clearView() {
+ this.player.video.clearView();
+ }
+ /**
+ *
+ * @param url {string}
+ * @returns {Promise}
+ */
+
+
+ play(url) {
+ return new Promise((resolve, reject) => {
+ if (!url && !this._opt.url) {
+ this.emit(EVENTS.error, EVENTS_ERROR.playError);
+ reject();
+ return;
+ }
+
+ if (url) {
+ // url 相等的时候。
+ if (this._opt.url) {
+ // 存在相同的 url
+ if (url === this._opt.url) {
+ // 正在播放
+ if (this.player.playing) {
+ resolve();
+ } else {
+ // pause -> play
+ this.clearView();
+ this.player.play(this._opt.url).then(() => {
+ resolve();
+ }).catch(() => {
+ this.player.pause().then(() => {
+ reject();
+ });
+ });
+ }
+ } else {
+ // url 发生改变了
+ this.player.pause().then(() => {
+ // 清除 画面
+ this.clearView();
+ return this._play(url);
+ }).catch(() => {
+ reject();
+ });
+ }
+ } else {
+ return this._play(url);
+ }
+ } else {
+ // url 不存在的时候
+ // 就是从 play -> pause -> play
+ this.player.play(this._opt.url).then(() => {
+ resolve();
+ }).catch(() => {
+ this.player.pause().then(() => {
+ reject();
+ });
+ });
+ }
+ });
+ }
+ /**
+ *
+ * @param url {string}
+ * @returns {Promise}
+ * @private
+ */
+
+
+ _play(url) {
+ return new Promise((resolve, reject) => {
+ this._opt.url = url; // 新的url
+
+ const isHttp = url.indexOf("http") === 0; //
+
+ const protocol = isHttp ? PLAYER_PLAY_PROTOCOL.fetch : PLAYER_PLAY_PROTOCOL.websocket; //
+
+ const demuxType = isHttp || url.indexOf(".flv") !== -1 || this._opt.isFlv ? DEMUX_TYPE.flv : DEMUX_TYPE.m7s;
+ this.player.updateOption({
+ protocol,
+ demuxType
+ });
+ this.player.once(EVENTS_ERROR.mediaSourceH265NotSupport, () => {
+ this.close().then(() => {
+ if (this.player._opt.autoWasm) {
+ this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play');
+
+ this._resetPlayer({
+ useMSE: false
+ });
+
+ this.play(url).then(() => {
+ // resolve();
+ this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play success');
+ }).catch(() => {
+ // reject();
+ this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play error');
+ });
+ }
+ });
+ });
+ this.player.once(EVENTS_ERROR.webcodecsH265NotSupport, () => {
+ this.close().then(() => {
+ if (this.player._opt.autoWasm) {
+ this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play');
+
+ this._resetPlayer({
+ useWCS: false
+ });
+
+ this.play(url).then(() => {
+ // resolve();
+ this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play success');
+ }).catch(() => {
+ // reject();
+ this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play error');
+ });
+ }
+ });
+ }); // 解码报错。
+
+ this.player.once(EVENTS_ERROR.wasmDecodeError, () => {
+ if (this.player._opt.wasmDecodeErrorReplay) {
+ this.close().then(() => {
+ this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play');
+
+ this._resetPlayer({
+ useWCS: false
+ });
+
+ this.play(url).then(() => {
+ // resolve();
+ this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play success');
+ }).catch(() => {
+ // reject();
+ this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play error');
+ });
+ });
+ }
+ }); // 监听 delay timeout
+
+ this.player.once(EVENTS.delayTimeout, () => {
+ if (this.player._opt.heartTimeoutReplay && this._heartTimeoutReplayTimes < this.player._opt.heartTimeoutReplayTimes) {
+ this._heartTimeoutReplayTimes += 1;
+ this.play(url).then(() => {
+ // resolve();
+ this._heartTimeoutReplayTimes = 0;
+ }).catch(() => {// reject();
+ });
+ }
+ }); // 监听 loading timeout
+
+ this.player.once(EVENTS.loadingTimeout, () => {
+ if (this.player._opt.loadingTimeoutReplay && this._loadingTimeoutReplayTimes < this.player._opt.loadingTimeoutReplayTimes) {
+ this._loadingTimeoutReplayTimes += 1;
+ this.play(url).then(() => {
+ // resolve();
+ this._loadingTimeoutReplayTimes = 0;
+ }).catch(() => {// reject();
+ });
+ }
+ });
+
+ if (this.hasLoaded()) {
+ this.player.play(url).then(() => {
+ resolve();
+ }).catch(() => {
+ this.player.pause().then(() => {
+ reject();
+ });
+ });
+ } else {
+ this.player.once(EVENTS.decoderWorkerInit, () => {
+ this.player.play(url).then(() => {
+ resolve();
+ }).catch(() => {
+ this.player.pause().then(() => {
+ reject();
+ });
+ });
+ });
+ }
+ });
+ }
+ /**
+ *
+ */
+
+
+ resize() {
+ this.player.resize();
+ }
+ /**
+ *
+ * @param time {number} s
+ */
+
+
+ setBufferTime(time) {
+ time = Number(time); // s -> ms
+
+ this.player.updateOption({
+ videoBuffer: time * 1000
+ }); // update worker config
+
+ this.player.decoderWorker && this.player.decoderWorker.updateWorkConfig({
+ key: 'videoBuffer',
+ value: time * 1000
+ });
+ }
+ /**
+ *
+ * @param deg {number}
+ */
+
+
+ setRotate(deg) {
+ deg = parseInt(deg, 10);
+ const list = [0, 90, 270];
+
+ if (this._opt.rotate === deg || list.indexOf(deg) === -1) {
+ return;
+ }
+
+ this.player.updateOption({
+ rotate: deg
+ });
+ this.resize();
+ }
+ /**
+ *
+ * @returns {boolean}
+ */
+
+
+ hasLoaded() {
+ return this.player.loaded;
+ }
+ /**
+ *
+ */
+
+
+ setKeepScreenOn() {
+ this.player.updateOption({
+ keepScreenOn: true
+ });
+ }
+ /**
+ *
+ * @param flag {Boolean}
+ */
+
+
+ setFullscreen(flag) {
+ const fullscreen = !!flag;
+
+ if (this.player.fullscreen !== fullscreen) {
+ this.player.fullscreen = fullscreen;
+ }
+ }
+ /**
+ *
+ * @param filename {string}
+ * @param format {string}
+ * @param quality {number}
+ * @param type {string} download,base64,blob
+ */
+
+
+ screenshot(filename, format, quality, type) {
+ return this.player.video.screenshot(filename, format, quality, type);
+ }
+ /**
+ *
+ * @param fileName {string}
+ * @param fileType {string}
+ * @returns {Promise}
+ */
+
+
+ startRecord(fileName, fileType) {
+ return new Promise((resolve, reject) => {
+ if (this.player.playing) {
+ this.player.startRecord(fileName, fileType);
+ resolve();
+ } else {
+ reject();
+ }
+ });
+ }
+
+ stopRecordAndSave() {
+ if (this.player.recording) {
+ this.player.stopRecordAndSave();
+ }
+ }
+ /**
+ *
+ * @returns {Boolean}
+ */
+
+
+ isPlaying() {
+ return this.player.playing;
+ }
+ /**
+ * 是否静音状态
+ * @returns {Boolean}
+ */
+
+
+ isMute() {
+ return this.player.audio ? this.player.audio.isMute : true;
+ }
+ /**
+ * 是否在录制视频
+ * @returns {*}
+ */
+
+
+ isRecording() {
+ return this.player.recorder.recording;
+ }
+
+ }
+
+ _defineProperty(Jessibuca, "ERROR", EVENTS_ERROR);
+
+ _defineProperty(Jessibuca, "TIMEOUT", {
+ loadingTimeout: EVENTS.loadingTimeout,
+ delayTimeout: EVENTS.delayTimeout
+ });
+
+ window.Jessibuca = Jessibuca;
+
+ return Jessibuca;
}));
//# sourceMappingURL=jessibuca.js.map
diff --git a/demo/public/jessibuca.js.map b/demo/public/jessibuca.js.map
index b19a5a91..d315fd46 100644
--- a/demo/public/jessibuca.js.map
+++ b/demo/public/jessibuca.js.map
@@ -1 +1 @@
-{"version":3,"file":"jessibuca.js","sources":["../../src/constant/index.js","../../src/utils/debug.js","../../src/utils/events.js","../../src/player/property.js","../../node_modules/screenfull/dist/screenfull.js","../../src/utils/index.js","../../src/player/events.js","../../src/utils/emitter.js","../../src/utils/webgl.js","../../src/video/commonLoader.js","../../src/video/canvasLoader.js","../../src/video/videoLoader.js","../../src/video/index.js","../../src/audio/audioContextLoader.js","../../src/audio/index.js","../../src/stream/fetchLoader.js","../../src/stream/websocketLoader.js","../../src/stream/index.js","../../node_modules/recordrtc/RecordRTC.js","../../src/recorder/recordRTCLoader.js","../../src/recorder/index.js","../../src/worker/index.js","../../src/demux/commonLoader.js","../../src/demux/flvLoader.js","../../src/demux/m7sLoader.js","../../src/demux/index.js","../../src/decoder/webcodecs.js","../../src/control/icons.js","../../src/control/template.js","../../src/control/observer.js","../../src/control/property.js","../../src/control/events.js","../../node_modules/style-inject/dist/style-inject.es.js","../../src/control/hotkey.js","../../src/control/index.js","../../src/player/observer.js","../../src/remux/fmp4-generator.js","../../src/utils/exp-golomb.js","../../src/utils/h264-sps-parser.js","../../src/utils/h264.js","../../src/utils/h265-sps-parser.js","../../src/utils/h265.js","../../src/decoder/mediaSource.js","../../src/utils/noSleep.js","../../src/player/index.js","../../src/jessibuca.js"],"sourcesContent":["// 播放协议\nexport const PLAYER_PLAY_PROTOCOL = {\n websocket: 0,\n fetch: 1\n}\n\nexport const DEMUX_TYPE = {\n flv: 'flv',\n m7s: 'm7s'\n}\n\n\n// default player options\nexport const DEFAULT_PLAYER_OPTIONS = {\n videoBuffer: 1000, //1000ms == 1 second\n isResize: true,\n isFullResize: false, //\n isFlv: false,\n debug: false,\n hotKey: false, // 快捷键\n loadingTimeout: 10, // loading timeout\n heartTimeout: 5, // heart timeout\n timeout: 10, // second\n loadingTimeoutReplay: false, // loading timeout replay\n heartTimeoutReplay: false,// heart timeout replay。\n loadingTimeoutReplayTimes: 3, // loading timeout replay fail times\n heartTimeoutReplayTimes: 3, // heart timeout replay fail times\n supportDblclickFullscreen: false,\n showBandwidth: false, //\n keepScreenOn: false,\n isNotMute: false,\n hasAudio: true,\n hasVideo: true,\n operateBtns: {\n fullscreen: false,\n screenshot: false,\n play: false,\n audio: false,\n record: false,\n },\n controlAutoHide: false,\n hasControl: false,\n loadingText: '',\n background: '',\n decoder: 'decoder.js',\n url: '',//\n rotate: 0,\n // text: '',\n forceNoOffscreen: true, // 默认是不采用\n hiddenAutoPause: false,\n protocol: PLAYER_PLAY_PROTOCOL.fetch,\n demuxType: DEMUX_TYPE.flv, //\n useWCS: false, //\n wcsUseVideoRender: false,\n useMSE: false, //\n useOffscreen: false, //\n autoWasm: true, // 自动降级到 wasm 模式\n wasmDecodeErrorReplay: true, // 解码失败重新播放。\n openWebglAlignment: false,// https://github.com/langhuihui/jessibuca/issues/152\n}\n\n\nexport const WORKER_CMD_TYPE = {\n init: 'init',\n initVideo: 'initVideo',\n render: 'render',\n playAudio: 'playAudio',\n initAudio: 'initAudio',\n kBps: 'kBps',\n decode: 'decode',\n audioCode: 'audioCode',\n videoCode: 'videoCode',\n wasmError: 'wasmError'\n}\n\nexport const WASM_ERROR = {\n invalidNalUnitSize: 'Invalid NAL unit size',\n // errorSplittingTheInputIntoNALUnits: 'Error splitting the input into NAL units'\n}\n\nexport const MEDIA_TYPE = {\n audio: 1,\n video: 2\n}\n\nexport const FLV_MEDIA_TYPE = {\n audio: 8,\n video: 9\n}\n\nexport const WORKER_SEND_TYPE = {\n init: 'init',\n decode: 'decode',\n audioDecode: 'audioDecode',\n videoDecode: 'videoDecode',\n close: 'close',\n updateConfig: 'updateConfig'\n}\n\n\n//\nexport const EVENTS = {\n fullscreen: 'fullscreen$2',\n webFullscreen: 'webFullscreen',\n decoderWorkerInit: 'decoderWorkerInit',\n play: 'play',\n playing: 'playing',\n pause: 'pause',\n mute: 'mute',\n load: 'load',\n loading: 'loading',\n videoInfo: 'videoInfo',\n timeUpdate: 'timeUpdate',\n audioInfo: \"audioInfo\",\n log: 'log',\n error: \"error\",\n kBps: 'kBps',\n timeout: 'timeout',\n delayTimeout: 'delayTimeout',\n loadingTimeout: 'loadingTimeout',\n stats: 'stats',\n performance: \"performance\",\n record: 'record',\n recording: 'recording',\n recordingTimestamp: 'recordingTimestamp',\n recordStart: 'recordStart',\n recordEnd: 'recordEnd',\n recordCreateError: 'recordCreateError',\n buffer: 'buffer',\n videoFrame: 'videoFrame',\n start: 'start',\n metadata: 'metadata',\n resize: 'resize',\n streamEnd: 'streamEnd',\n streamSuccess: 'streamSuccess',\n streamMessage: 'streamMessage',\n streamError: 'streamError',\n volumechange: 'volumechange',\n destroy: 'destroy',\n mseSourceOpen: 'mseSourceOpen',\n mseSourceClose: 'mseSourceClose',\n mseSourceBufferError: 'mseSourceBufferError',\n mseSourceBufferBusy: 'mseSourceBufferBusy',\n videoWaiting: 'videoWaiting',\n videoTimeUpdate: 'videoTimeUpdate',\n videoSyncAudio: 'videoSyncAudio',\n playToRenderTimes: 'playToRenderTimes'\n}\n\n\nexport const JESSIBUCA_EVENTS = {\n load: EVENTS.load,\n timeUpdate: EVENTS.timeUpdate,\n videoInfo: EVENTS.videoInfo,\n audioInfo: EVENTS.audioInfo,\n error: EVENTS.error,\n kBps: EVENTS.kBps,\n log: EVENTS.log,\n start: EVENTS.start,\n timeout: EVENTS.timeout,\n loadingTimeout: EVENTS.loadingTimeout,\n delayTimeout: EVENTS.delayTimeout,\n fullscreen: 'fullscreen',\n play: EVENTS.play,\n pause: EVENTS.pause,\n mute: EVENTS.mute,\n stats: EVENTS.stats,\n performance: EVENTS.performance,\n recordingTimestamp: EVENTS.recordingTimestamp,\n recordStart: EVENTS.recordStart,\n recordEnd: EVENTS.recordEnd,\n playToRenderTimes: EVENTS.playToRenderTimes\n}\n\nexport const EVENTS_ERROR = {\n playError: 'playIsNotPauseOrUrlIsNull',\n fetchError: \"fetchError\",\n websocketError: 'websocketError',\n webcodecsH265NotSupport: 'webcodecsH265NotSupport',\n mediaSourceH265NotSupport: 'mediaSourceH265NotSupport',\n wasmDecodeError: 'wasmDecodeError'\n}\n\n\nexport const WEBSOCKET_STATUS = {\n notConnect: 'notConnect',\n open: 'open',\n close: 'close',\n error: 'error'\n}\n\nexport const BUFFER_STATUS = {\n empty: 'empty',\n buffering: 'buffering',\n full: 'full'\n}\n\n\nexport const SCREENSHOT_TYPE = {\n download: 'download',\n base64: 'base64',\n blob: 'blob'\n}\n\n\nexport const VIDEO_ENC_TYPE = {\n 7: 'H264(AVC)', //\n 12: 'H265(HEVC)' //\n}\n\nexport const VIDEO_ENC_CODE = {\n h264: 7,\n h265: 12\n}\n\n\nexport const AUDIO_ENC_TYPE = {\n 10: 'AAC',\n 7: 'ALAW',\n 8: 'MULAW'\n}\n\nexport const H265_NAL_TYPE = {\n vps: 32,\n sps: 33,\n pps: 34\n}\n\nexport const CONTROL_HEIGHT = 38\n\nexport const SCALE_MODE_TYPE = {\n full: 0, // 视频画面完全填充canvas区域,画面会被拉伸\n auto: 1, // 视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边\n fullAuto: 2 // 视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全\n}\n\n\nexport const FILE_SUFFIX = {\n mp4: 'mp4',\n webm: 'webm'\n};\n\n\nexport const CANVAS_RENDER_TYPE = {\n webcodecs: 'webcodecs',\n webgl: 'webgl',\n offscreen: 'offscreen'\n}\n\nexport const ENCODED_VIDEO_TYPE = {\n key: 'key',\n delta: 'delta'\n}\n\n\nexport const MP4_CODECS = {\n avc: 'video/mp4; codecs=\"avc1.64002A\"',\n hev: 'video/mp4; codecs=\"hev1.1.6.L123.b0\"',\n}\n\n\nexport const MEDIA_SOURCE_STATE = {\n ended: 'ended',\n open: 'open',\n closed: 'closed'\n}\n\n\n// frag duration\nexport const FRAG_DURATION = Math.ceil(1000 / 25)\n\n\nexport const AUDIO_SYNC_VIDEO_DIFF = 1000;\n\n\nexport const HOT_KEY = {\n esc: 27, //\n arrowUp: 38, //\n arrowDown: 40, //\n}\n","export default class Debug {\n constructor(master) {\n this.log = (name, ...args) => {\n if (master._opt.debug) {\n console.log(`Jessibuca: [${name}]`, ...args);\n }\n };\n\n this.warn = (name, ...args) => {\n if (master._opt.debug) {\n console.warn(`Jessibuca: [${name}]`, ...args);\n }\n };\n\n this.error = (name, ...args) => {\n if (master._opt.debug) {\n console.error(`Jessibuca: [${name}]`, ...args);\n }\n };\n }\n}\n","export default class Events {\n constructor(master) {\n this.destroys = [];\n this.proxy = this.proxy.bind(this);\n this.master = master;\n }\n\n proxy(target, name, callback, option = {}) {\n if (!target) {\n return;\n }\n if (Array.isArray(name)) {\n return name.map(item => this.proxy(target, item, callback, option));\n }\n target.addEventListener(name, callback, option);\n const destroy = () => target.removeEventListener(name, callback, option);\n this.destroys.push(destroy);\n return destroy;\n }\n\n destroy() {\n this.master.debug && this.master.debug.log(`Events`, 'destroy');\n this.destroys.forEach(event => event());\n }\n}\n","export default (player) => {\n Object.defineProperty(player, 'rect', {\n get: () => {\n const clientRect = player.$container.getBoundingClientRect()\n clientRect.width = Math.max(clientRect.width, player.$container.clientWidth);\n clientRect.height = Math.max(clientRect.height, player.$container.clientHeight);\n return clientRect;\n },\n });\n\n ['bottom', 'height', 'left', 'right', 'top', 'width'].forEach(key => {\n Object.defineProperty(player, key, {\n get: () => {\n return player.rect[key];\n },\n });\n });\n}\n","/*!\n* screenfull\n* v5.1.0 - 2020-12-24\n* (c) Sindre Sorhus; MIT License\n*/\n(function () {\n\t'use strict';\n\n\tvar document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};\n\tvar isCommonjs = typeof module !== 'undefined' && module.exports;\n\n\tvar fn = (function () {\n\t\tvar val;\n\n\t\tvar fnMap = [\n\t\t\t[\n\t\t\t\t'requestFullscreen',\n\t\t\t\t'exitFullscreen',\n\t\t\t\t'fullscreenElement',\n\t\t\t\t'fullscreenEnabled',\n\t\t\t\t'fullscreenchange',\n\t\t\t\t'fullscreenerror'\n\t\t\t],\n\t\t\t// New WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullscreen',\n\t\t\t\t'webkitExitFullscreen',\n\t\t\t\t'webkitFullscreenElement',\n\t\t\t\t'webkitFullscreenEnabled',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t// Old WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullScreen',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitCurrentFullScreenElement',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t[\n\t\t\t\t'mozRequestFullScreen',\n\t\t\t\t'mozCancelFullScreen',\n\t\t\t\t'mozFullScreenElement',\n\t\t\t\t'mozFullScreenEnabled',\n\t\t\t\t'mozfullscreenchange',\n\t\t\t\t'mozfullscreenerror'\n\t\t\t],\n\t\t\t[\n\t\t\t\t'msRequestFullscreen',\n\t\t\t\t'msExitFullscreen',\n\t\t\t\t'msFullscreenElement',\n\t\t\t\t'msFullscreenEnabled',\n\t\t\t\t'MSFullscreenChange',\n\t\t\t\t'MSFullscreenError'\n\t\t\t]\n\t\t];\n\n\t\tvar i = 0;\n\t\tvar l = fnMap.length;\n\t\tvar ret = {};\n\n\t\tfor (; i < l; i++) {\n\t\t\tval = fnMap[i];\n\t\t\tif (val && val[1] in document) {\n\t\t\t\tfor (i = 0; i < val.length; i++) {\n\t\t\t\t\tret[fnMap[0][i]] = val[i];\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t})();\n\n\tvar eventNameMap = {\n\t\tchange: fn.fullscreenchange,\n\t\terror: fn.fullscreenerror\n\t};\n\n\tvar screenfull = {\n\t\trequest: function (element, options) {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tvar onFullScreenEntered = function () {\n\t\t\t\t\tthis.off('change', onFullScreenEntered);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenEntered);\n\n\t\t\t\telement = element || document.documentElement;\n\n\t\t\t\tvar returnPromise = element[fn.requestFullscreen](options);\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenEntered).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\texit: function () {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tif (!this.isFullscreen) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar onFullScreenExit = function () {\n\t\t\t\t\tthis.off('change', onFullScreenExit);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenExit);\n\n\t\t\t\tvar returnPromise = document[fn.exitFullscreen]();\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenExit).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\ttoggle: function (element, options) {\n\t\t\treturn this.isFullscreen ? this.exit() : this.request(element, options);\n\t\t},\n\t\tonchange: function (callback) {\n\t\t\tthis.on('change', callback);\n\t\t},\n\t\tonerror: function (callback) {\n\t\t\tthis.on('error', callback);\n\t\t},\n\t\ton: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.addEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\toff: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.removeEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\traw: fn\n\t};\n\n\tif (!fn) {\n\t\tif (isCommonjs) {\n\t\t\tmodule.exports = {isEnabled: false};\n\t\t} else {\n\t\t\twindow.screenfull = {isEnabled: false};\n\t\t}\n\n\t\treturn;\n\t}\n\n\tObject.defineProperties(screenfull, {\n\t\tisFullscreen: {\n\t\t\tget: function () {\n\t\t\t\treturn Boolean(document[fn.fullscreenElement]);\n\t\t\t}\n\t\t},\n\t\telement: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\treturn document[fn.fullscreenElement];\n\t\t\t}\n\t\t},\n\t\tisEnabled: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\t// Coerce to boolean in case of old WebKit\n\t\t\t\treturn Boolean(document[fn.fullscreenEnabled]);\n\t\t\t}\n\t\t}\n\t});\n\n\tif (isCommonjs) {\n\t\tmodule.exports = screenfull;\n\t} else {\n\t\twindow.screenfull = screenfull;\n\t}\n})();\n","import {MP4_CODECS, FILE_SUFFIX} from \"../constant\";\n\nexport function noop() {\n}\n\n\nexport function supportOffscreen($canvas) {\n return typeof $canvas.transferControlToOffscreen === 'function';\n}\n\n\nexport function supportOffscreenV2() {\n return typeof OffscreenCanvas !== \"undefined\";\n}\n\n\nexport function createContextGL($canvas) {\n let gl = null;\n\n const validContextNames = [\"webgl\", \"experimental-webgl\", \"moz-webgl\", \"webkit-3d\"];\n let nameIndex = 0;\n\n while (!gl && nameIndex < validContextNames.length) {\n const contextName = validContextNames[nameIndex];\n\n try {\n let contextOptions = {preserveDrawingBuffer: true};\n gl = $canvas.getContext(contextName, contextOptions);\n } catch (e) {\n gl = null;\n }\n\n if (!gl || typeof gl.getParameter !== \"function\") {\n gl = null;\n }\n\n ++nameIndex;\n }\n\n\n return gl;\n}\n\n\nexport function audioContextUnlock(context) {\n context.resume();\n const source = context.createBufferSource();\n source.buffer = context.createBuffer(1, 1, 22050);\n source.connect(context.destination);\n if (source.noteOn) {\n source.noteOn(0);\n } else {\n source.start(0);\n }\n}\n\nexport function dataURLToFile(dataURL = '') {\n const arr = dataURL.split(\",\");\n const bstr = atob(arr[1]);\n const type = arr[0].replace(\"data:\", \"\").replace(\";base64\", \"\")\n let n = bstr.length, u8arr = new Uint8Array(n);\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n return new File([u8arr], 'file', {type});\n}\n\nexport function downloadFile(file, fileName) {\n if (file instanceof Blob || file instanceof File) {\n file = new Blob([file]);\n }\n const aLink = document.createElement(\"a\");\n aLink.download = fileName;\n aLink.href = file;\n aLink.click();\n}\n\n\nexport function downloadImg(content, fileName) {\n const aLink = document.createElement(\"a\");\n aLink.download = fileName;\n aLink.href = URL.createObjectURL(content);\n aLink.click();\n setTimeout(() => {\n URL.revokeObjectURL(content);\n }, isIOS() ? 1000 : 0)\n}\n\nexport function checkFull() {\n let isFull = document.fullscreenElement || window.webkitFullscreenElement || document.msFullscreenElement;\n if (isFull === undefined) isFull = false;\n return !!isFull;\n}\n\nexport function now() {\n return new Date().getTime();\n}\n\nexport const supportedWasm = (() => {\n try {\n if (typeof WebAssembly === \"object\"\n && typeof WebAssembly.instantiate === \"function\") {\n const module = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00));\n if (module instanceof WebAssembly.Module)\n return new WebAssembly.Instance(module) instanceof WebAssembly.Instance;\n }\n } catch (e) {\n }\n return false;\n})();\n\nexport function clamp(num, a, b) {\n return Math.max(Math.min(num, Math.max(a, b)), Math.min(a, b));\n}\n\nexport function setStyle(element, key, value) {\n if (!element) {\n return\n }\n if (typeof key === 'object') {\n Object.keys(key).forEach(item => {\n setStyle(element, item, key[item]);\n });\n }\n element.style[key] = value;\n return element;\n}\n\n\nexport function getStyle(element, key, numberType = true) {\n if (!element) {\n return 0\n }\n\n const value = getComputedStyle(element, null).getPropertyValue(key);\n return numberType ? parseFloat(value) : value;\n}\n\nexport function getNowTime() {\n if (performance && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n}\n\nexport function calculationRate(callback) {\n let totalSize = 0;\n let lastTime = getNowTime();\n return size => {\n totalSize += size;\n const thisTime = getNowTime();\n const diffTime = thisTime - lastTime;\n if (diffTime >= 1000) {\n callback((totalSize / diffTime) * 1000);\n lastTime = thisTime;\n totalSize = 0;\n }\n };\n}\n\nexport function downloadRecord(blob, name, suffix) {\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = (name || now()) + '.' + (suffix || FILE_SUFFIX.webm);\n a.click();\n setTimeout(() => {\n window.URL.revokeObjectURL(url);\n }, isIOS() ? 1000 : 0)\n}\n\nexport const env = '__ENV__';\n\nexport function isMobile() {\n return (/iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(window.navigator.userAgent.toLowerCase()));\n}\n\nexport function isAndroid() {\n const UA = window.navigator.userAgent.toLowerCase();\n return (/android/i.test(UA));\n}\n\nexport function isIOS() {\n const UA = window.navigator.userAgent.toLowerCase();\n return UA && /iphone|ipad|ipod|ios/.test(UA);\n}\n\n\nexport function parseTime(time, cFormat) {\n if (arguments.length === 0) {\n return null\n }\n var format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'\n var date;\n if (typeof time === 'object') {\n date = time\n } else {\n if (('' + time).length === 10) time = parseInt(time) * 1000;\n time = +time; // 转成int 型\n date = new Date(time)\n }\n var formatObj = {\n y: date.getFullYear(),\n m: date.getMonth() + 1,\n d: date.getDate(),\n h: date.getHours(),\n i: date.getMinutes(),\n s: date.getSeconds(),\n a: date.getDay()\n };\n var time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {\n var value = formatObj[key]\n if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]\n if (result.length > 0 && value < 10) {\n value = '0' + value\n }\n return value || 0\n });\n return time_str\n}\n\n// 是否支持 webcodecs\nexport function supportWCS() {\n return \"VideoEncoder\" in window;\n}\n\nexport function toNumber(value) {\n if (typeof value !== 'string') {\n return value;\n } else {\n // 转换成 number 类型\n var parsed = Number(value);\n return isNaN(parsed) ? value : parsed;\n }\n}\n\nexport function uuid16() {\n return 'xxxxxxxxxxxx4xxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8)\n return v.toString(16)\n })\n}\n\nexport function throttle(callback, delay) {\n let isThrottled = false;\n let args;\n let context;\n\n function fn(...args2) {\n if (isThrottled) {\n args = args2;\n context = this;\n return;\n }\n\n isThrottled = true;\n callback.apply(this, args2);\n setTimeout(() => {\n isThrottled = false;\n if (args) {\n fn.apply(context, args);\n args = null;\n context = null;\n }\n }, delay);\n }\n\n return fn;\n}\n\n\nexport function isDef(v) {\n return v !== undefined && v !== null;\n}\n\nexport function formatVideoDecoderConfigure(avcC) {\n let codecArray = avcC.subarray(1, 4);\n let codecString = \"avc1.\";\n for (let j = 0; j < 3; j++) {\n let h = codecArray[j].toString(16);\n if (h.length < 2) {\n h = \"0\" + h\n }\n codecString += h\n }\n\n return {\n codec: codecString,\n description: avcC\n }\n}\n\nexport function isFullScreen() {\n return document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen;\n}\n\nexport function bpsSize(value) {\n if (null == value || value === '') {\n return \"0 KB/S\";\n }\n let size = parseFloat(value);\n size = size.toFixed(2);\n return size + 'KB/S';\n}\n\n\nexport function fpsStatus(fps) {\n let result = 0;\n if (fps >= 24) {\n result = 2;\n } else if (fps >= 15) {\n result = 1;\n }\n\n return result;\n}\n\nexport function createEmptyImageBitmap(width, height) {\n const $canvasElement = document.createElement(\"canvas\");\n $canvasElement.width = width;\n $canvasElement.height = height;\n return createImageBitmap($canvasElement, 0, 0, width, height);\n}\n\n\nexport function supportMSE() {\n return window.MediaSource && window.MediaSource.isTypeSupported(MP4_CODECS.avc);\n}\n\n\nexport function formatMp4VideoCodec(codec) {\n return `video/mp4; codecs=\"${codec}\"`\n}\n\n\nexport function saveBlobToFile(fileName, blob) {\n let url = window.URL.createObjectURL(blob);\n let aLink = window.document.createElement('a');\n aLink.download = fileName;\n aLink.href = url;\n //创建内置事件并触发\n let evt = window.document.createEvent('MouseEvents');\n evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n aLink.dispatchEvent(evt);\n}\n\nexport function isEmpty(value) {\n return value === null || value === undefined\n}\n\nexport function isBoolean(value) {\n return value === true || value === false;\n}\n\nexport function isNotEmpty(value) {\n return !isEmpty(value)\n}\n\nexport function initPlayTimes() {\n return {\n playInitStart: '', //1\n playStart: '', // 2\n streamStart: '', //3\n streamResponse: '', // 4\n demuxStart: '', // 5\n decodeStart: '', // 6\n videoStart: '', // 7\n playTimestamp: '',// playStart- playInitStart\n streamTimestamp: '',// streamStart - playStart\n streamResponseTimestamp: '',// streamResponse - streamStart\n demuxTimestamp: '', // demuxStart - streamResponse\n decodeTimestamp: '', // decodeStart - demuxStart\n videoTimestamp: '',// videoStart - decodeStart\n allTimestamp: '' // videoStart - playInitStart\n }\n}\n\n// create watermark\nexport function createWatermark(options) {\n let defaultConfig = {\n container: '',\n left: '',\n right: '',\n top: '',\n bottom: '',\n image: {\n src: '',\n width: '100',\n height: '60',\n },\n text: {\n content: '',\n fontSize: '14',\n color: '#000'\n },\n }\n defaultConfig = Object.assign(defaultConfig, options)\n\n const $container = defaultConfig.container;\n\n if ($container) {\n return\n }\n\n let shadowRoot = null;\n const otDiv = document.createElement('div');\n otDiv.setAttribute('style', 'pointer-events: none !important; display: block !important');\n\n if (typeof otDiv.attachShadow === \"function\") {\n shadowRoot = otDiv.attachShadow({mode: 'open'});\n } else if (otDiv.shadowRoot) {\n shadowRoot = otDiv.shadowRoot;\n } else {\n shadowRoot = otDiv;\n }\n\n const nodeList = $container.children;\n const index = Math.floor(Math.random() * (nodeList.length - 1));\n\n if (nodeList[index]) {\n $container.insertBefore(otDiv, nodeList[index]);\n } else {\n $container.appendChild(otDiv);\n }\n\n\n const maskDiv = document.createElement('div');\n let innerDom = null;\n if (defaultConfig.text && defaultConfig.text.content) {\n innerDom = document.createTextNode(defaultConfig.text);\n } else if (defaultConfig.image && defaultConfig.image.src) {\n innerDom = document.createElement('img')\n innerDom.style.height = '100%'\n innerDom.style.width = '100%'\n innerDom.src = defaultConfig.image.src;\n }\n\n if (!innerDom) {\n return;\n }\n\n maskDiv.appendChild(innerDom);\n\n maskDiv.style.visibility = '';\n maskDiv.style.position = \"absolute\";\n maskDiv.style.display = 'block'\n maskDiv.style['-ms-user-select'] = \"none\";\n maskDiv.style.left = defaultConfig.left;\n maskDiv.style.right = defaultConfig.right;\n maskDiv.style.top = defaultConfig.top;\n maskDiv.style.bottom = defaultConfig.bottom;\n maskDiv.style.overflow = 'hidden';\n maskDiv.style.zIndex = \"9999999\";\n if (defaultConfig.text && defaultConfig.text.content) {\n maskDiv.style.fontSize = defaultConfig.text.fontSize;\n maskDiv.style.color = defaultConfig.text.color;\n } else if (defaultConfig.image && defaultConfig.image.src) {\n maskDiv.style.width = defaultConfig.image.width + 'px';\n maskDiv.style.height = defaultConfig.image.height + 'px';\n }\n\n shadowRoot.appendChild(maskDiv)\n\n // remove function\n return () => {\n $container.removeChild(otDiv);\n }\n}\n","import {EVENTS, EVENTS_ERROR, JESSIBUCA_EVENTS} from \"../constant\";\nimport screenfull from \"screenfull\";\nimport {setStyle} from \"../utils\";\n\nexport default (player) => {\n\n\n try {\n const screenfullChange = () => {\n player.emit(JESSIBUCA_EVENTS.fullscreen, player.fullscreen)\n\n // 如果不是fullscreen,则触发下 resize 方法\n if (!player.fullscreen) {\n player.resize();\n } else {\n if(player._opt.useMSE){\n player.resize();\n }\n }\n\n };\n screenfull.on('change', screenfullChange);\n player.events.destroys.push(() => {\n screenfull.off('change', screenfullChange);\n });\n } catch (error) {\n //\n }\n //\n player.on(EVENTS.decoderWorkerInit, () => {\n player.debug.log('player', 'has loaded');\n player.loaded = true;\n })\n\n //\n player.on(EVENTS.play, () => {\n player.loading = false;\n })\n\n //\n player.on(EVENTS.fullscreen, (value) => {\n if (value) {\n try {\n screenfull.request(player.$container).then(() => {\n\n }).catch((e) => {\n player.webFullscreen = true;\n });\n\n } catch (e) {\n player.webFullscreen = true;\n }\n } else {\n try {\n screenfull.exit().then(() => {\n }).catch(() => {\n player.webFullscreen = false;\n\n });\n } catch (e) {\n player.webFullscreen = false;\n }\n }\n })\n\n player.on(EVENTS.webFullscreen, (value) => {\n if (value) {\n player.$container.classList.add('jessibuca-fullscreen-web')\n } else {\n player.$container.classList.remove('jessibuca-fullscreen-web')\n }\n })\n\n //\n player.on(EVENTS.resize, () => {\n player.video.resize();\n })\n\n\n if (player._opt.debug) {\n const ignoreList = [EVENTS.timeUpdate];\n Object.keys(EVENTS).forEach((key) => {\n player.on(EVENTS[key], (value) => {\n if (ignoreList.includes(key)) {\n return;\n }\n\n player.debug.log('player events', EVENTS[key], value);\n })\n })\n\n Object.keys(EVENTS_ERROR).forEach((key) => {\n player.on(EVENTS_ERROR[key], (value) => {\n player.debug.log('player event error', EVENTS_ERROR[key], value);\n })\n })\n }\n}\n","export default class Emitter {\n on(name, fn, ctx) {\n const e = this.e || (this.e = {});\n (e[name] || (e[name] = [])).push({fn, ctx});\n return this;\n }\n\n once(name, fn, ctx) {\n const self = this;\n\n function listener(...args) {\n self.off(name, listener);\n fn.apply(ctx, args);\n }\n\n listener._ = fn;\n return this.on(name, listener, ctx);\n }\n\n emit(name, ...data) {\n const evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n for (let i = 0; i < evtArr.length; i += 1) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n return this;\n }\n\n off(name, callback) {\n const e = this.e || (this.e = {});\n\n if (!name) {\n Object.keys(e).forEach((key) => {\n delete e[key];\n })\n delete this.e\n return;\n }\n\n const evts = e[name];\n const liveEvents = [];\n if (evts && callback) {\n for (let i = 0, len = evts.length; i < len; i += 1) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback) liveEvents.push(evts[i]);\n }\n }\n if (liveEvents.length) {\n e[name] = liveEvents;\n } else {\n delete e[name];\n }\n return this;\n }\n}\n","export default (gl, openWebglAlignment) => {\n var vertexShaderScript = [\n 'attribute vec4 vertexPos;',\n 'attribute vec4 texturePos;',\n 'varying vec2 textureCoord;',\n\n 'void main()',\n '{',\n 'gl_Position = vertexPos;',\n 'textureCoord = texturePos.xy;',\n '}'\n ].join('\\n');\n\n var fragmentShaderScript = [\n 'precision highp float;',\n 'varying highp vec2 textureCoord;',\n 'uniform sampler2D ySampler;',\n 'uniform sampler2D uSampler;',\n 'uniform sampler2D vSampler;',\n 'const mat4 YUV2RGB = mat4',\n '(',\n '1.1643828125, 0, 1.59602734375, -.87078515625,',\n '1.1643828125, -.39176171875, -.81296875, .52959375,',\n '1.1643828125, 2.017234375, 0, -1.081390625,',\n '0, 0, 0, 1',\n ');',\n\n 'void main(void) {',\n 'highp float y = texture2D(ySampler, textureCoord).r;',\n 'highp float u = texture2D(uSampler, textureCoord).r;',\n 'highp float v = texture2D(vSampler, textureCoord).r;',\n 'gl_FragColor = vec4(y, u, v, 1) * YUV2RGB;',\n '}'\n ].join('\\n');\n\n if (openWebglAlignment) {\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n }\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexShaderScript);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n console.log('Vertex shader failed to compile: ' + gl.getShaderInfoLog(vertexShader));\n }\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentShaderScript);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n console.log('Fragment shader failed to compile: ' + gl.getShaderInfoLog(fragmentShader));\n }\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.log('Program failed to compile: ' + gl.getProgramInfoLog(program));\n }\n\n gl.useProgram(program);\n\n // initBuffers\n var vertexPosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexPosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW);\n\n var vertexPosRef = gl.getAttribLocation(program, 'vertexPos');\n gl.enableVertexAttribArray(vertexPosRef);\n gl.vertexAttribPointer(vertexPosRef, 2, gl.FLOAT, false, 0, 0);\n\n var texturePosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, texturePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 0, 0, 0, 1, 1, 0, 1]), gl.STATIC_DRAW);\n\n var texturePosRef = gl.getAttribLocation(program, 'texturePos');\n gl.enableVertexAttribArray(texturePosRef);\n gl.vertexAttribPointer(texturePosRef, 2, gl.FLOAT, false, 0, 0);\n\n function _initTexture(name, index) {\n var textureRef = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, textureRef);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.uniform1i(gl.getUniformLocation(program, name), index);\n return textureRef;\n }\n\n var yTextureRef = _initTexture('ySampler', 0);\n var uTextureRef = _initTexture('uSampler', 1);\n var vTextureRef = _initTexture('vSampler', 2);\n\n return {\n render: function (w, h, y, u, v) {\n gl.viewport(0, 0, w, h);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, yTextureRef);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, w, h, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, y);\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, uTextureRef);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, w / 2, h / 2, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, u);\n gl.activeTexture(gl.TEXTURE2);\n gl.bindTexture(gl.TEXTURE_2D, vTextureRef);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, w / 2, h / 2, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, v);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n },\n destroy: function () {\n try {\n gl.deleteProgram(program);\n\n gl.deleteBuffer(vertexPosBuffer)\n gl.deleteBuffer(texturePosBuffer);\n\n gl.deleteTexture(yTextureRef);\n gl.deleteTexture(uTextureRef);\n gl.deleteBuffer(vTextureRef);\n } catch (e) {\n // console.error(e);\n }\n\n }\n }\n};\n","import Emitter from \"../utils/emitter\";\nimport {CONTROL_HEIGHT, EVENTS, VIDEO_ENC_TYPE} from \"../constant\";\n\nexport default class CommonLoader extends Emitter {\n constructor() {\n super();\n this.init = false;\n }\n\n //\n updateVideoInfo(data) {\n if (data.encTypeCode) {\n this.videoInfo.encType = VIDEO_ENC_TYPE[data.encTypeCode];\n }\n\n if (data.width) {\n this.videoInfo.width = data.width;\n }\n\n if (data.height) {\n this.videoInfo.height = data.height;\n }\n\n // video 基本信息\n if (this.videoInfo.encType && this.videoInfo.height && this.videoInfo.width && !this.init) {\n this.player.emit(EVENTS.videoInfo, this.videoInfo);\n this.init = true;\n }\n }\n\n play(){\n\n }\n}\n","import Emitter from \"../utils/emitter\";\nimport {\n createContextGL,\n createEmptyImageBitmap,\n dataURLToFile,\n downloadImg,\n isMobile,\n now,\n supportOffscreen\n} from \"../utils\";\nimport createWebGL from \"../utils/webgl\";\nimport {CANVAS_RENDER_TYPE, CONTROL_HEIGHT, EVENTS, SCREENSHOT_TYPE, VIDEO_ENC_TYPE} from \"../constant\";\nimport CommonLoader from \"./commonLoader\";\n\nexport default class CanvasVideoLoader extends CommonLoader {\n\n constructor(player) {\n super()\n this.player = player;\n const $canvasElement = document.createElement(\"canvas\");\n $canvasElement.style.position = \"absolute\";\n $canvasElement.style.top = 0;\n $canvasElement.style.left = 0;\n this.$videoElement = $canvasElement;\n player.$container.appendChild(this.$videoElement);\n\n this.context2D = null;\n this.contextGl = null;\n this.contextGlRender = null;\n this.contextGlDestroy = null;\n this.bitmaprenderer = null;\n this.renderType = null;\n this.videoInfo = {\n width: '',\n height: '',\n encType: '',\n }\n //\n this._initCanvasRender();\n this.player.debug.log('CanvasVideo', 'init');\n }\n\n destroy() {\n if (this.contextGl) {\n this.contextGl = null;\n }\n\n if (this.context2D) {\n this.context2D = null;\n }\n\n if (this.contextGlRender) {\n this.contextGlDestroy && this.contextGlDestroy();\n this.contextGlDestroy = null;\n this.contextGlRender = null;\n }\n if (this.bitmaprenderer) {\n this.bitmaprenderer = null;\n }\n\n this.renderType = null;\n\n this.videoInfo = {\n width: '',\n height: '',\n encType: '',\n encTypeCode: ''\n }\n\n this.player.$container.removeChild(this.$videoElement);\n this.init = false;\n this.off();\n this.player.debug.log(`CanvasVideoLoader`, 'destroy');\n }\n\n\n _initContextGl() {\n this.contextGl = createContextGL(this.$videoElement);\n const webgl = createWebGL(this.contextGl, this.player._opt.openWebglAlignment);\n this.contextGlRender = webgl.render;\n this.contextGlDestroy = webgl.destroy\n }\n\n _initContext2D() {\n this.context2D = this.$videoElement.getContext('2d');\n }\n\n\n // 渲染类型\n _initCanvasRender() {\n if (this.player._opt.useWCS && !this._supportOffscreen()) {\n this.renderType = CANVAS_RENDER_TYPE.webcodecs;\n this._initContext2D();\n } else if (this._supportOffscreen()) {\n this.renderType = CANVAS_RENDER_TYPE.offscreen;\n this._bindOffscreen();\n } else {\n this.renderType = CANVAS_RENDER_TYPE.webgl;\n this._initContextGl();\n }\n }\n\n _supportOffscreen() {\n return supportOffscreen(this.$videoElement) && this.player._opt.useOffscreen;\n }\n\n //\n _bindOffscreen() {\n this.bitmaprenderer = this.$videoElement.getContext('bitmaprenderer');\n }\n\n initCanvasViewSize() {\n this.$videoElement.width = this.videoInfo.width;\n this.$videoElement.height = this.videoInfo.height;\n this.resize();\n }\n\n //\n render(msg) {\n this.player.videoTimestamp = msg.ts;\n switch (this.renderType) {\n case CANVAS_RENDER_TYPE.offscreen:\n this.bitmaprenderer.transferFromImageBitmap(msg.buffer);\n break;\n case CANVAS_RENDER_TYPE.webgl:\n this.contextGlRender(this.$videoElement.width, this.$videoElement.height, msg.output[0], msg.output[1], msg.output[2]);\n break;\n case CANVAS_RENDER_TYPE.webcodecs:\n this.context2D.drawImage(msg.videoFrame, 0, 0, this.$videoElement.width, this.$videoElement.height);\n break;\n }\n }\n\n screenshot(filename, format, quality, type) {\n filename = filename || now();\n type = type || SCREENSHOT_TYPE.download;\n const formatType = {\n png: 'image/png',\n jpeg: 'image/jpeg',\n webp: 'image/webp'\n };\n let encoderOptions = 0.92;\n if (!formatType[format] && SCREENSHOT_TYPE[format]) {\n type = format;\n format = 'png';\n quality = undefined\n }\n\n if (typeof quality === \"string\") {\n type = quality;\n quality = undefined;\n }\n\n if (typeof quality !== 'undefined') {\n encoderOptions = Number(quality);\n }\n const dataURL = this.$videoElement.toDataURL(formatType[format] || formatType.png, encoderOptions);\n\n const file = dataURLToFile(dataURL)\n if (type === SCREENSHOT_TYPE.base64) {\n return dataURL;\n } else if (type === SCREENSHOT_TYPE.blob) {\n return file;\n } else if (type === SCREENSHOT_TYPE.download) {\n downloadImg(file, filename);\n }\n }\n\n //\n clearView() {\n switch (this.renderType) {\n case CANVAS_RENDER_TYPE.offscreen:\n createEmptyImageBitmap(this.$videoElement.width, this.$videoElement.height).then((imageBitMap) => {\n this.bitmaprenderer.transferFromImageBitmap(imageBitMap);\n })\n break;\n case CANVAS_RENDER_TYPE.webgl:\n this.contextGl.clear(this.contextGl.COLOR_BUFFER_BIT);\n break;\n case CANVAS_RENDER_TYPE.webcodecs:\n this.context2D.clearRect(0, 0, this.$videoElement.width, this.$videoElement.height)\n break;\n }\n }\n\n resize() {\n this.player.debug.log('canvasVideo', 'resize');\n const option = this.player._opt;\n let width = this.player.width;\n let height = this.player.height;\n if (option.hasControl && !option.controlAutoHide) {\n if (isMobile() && this.player.fullscreen) {\n width -= CONTROL_HEIGHT;\n } else {\n height -= CONTROL_HEIGHT;\n }\n }\n let resizeWidth = this.$videoElement.width;\n let resizeHeight = this.$videoElement.height;\n const rotate = option.rotate;\n let left = ((width - resizeWidth) / 2)\n let top = ((height - resizeHeight) / 2)\n if (rotate === 270 || rotate === 90) {\n resizeWidth = this.$videoElement.height;\n resizeHeight = this.$videoElement.width;\n }\n\n const wScale = width / resizeWidth;\n const hScale = height / resizeHeight;\n\n let scale = wScale > hScale ? hScale : wScale;\n //\n if (!option.isResize) {\n if (wScale !== hScale) {\n scale = wScale + ',' + hScale;\n }\n }\n //\n if (option.isFullResize) {\n scale = wScale > hScale ? wScale : hScale;\n }\n let transform = \"scale(\" + scale + \")\";\n\n if (rotate) {\n transform += ' rotate(' + rotate + 'deg)'\n }\n\n this.$videoElement.style.transform = transform;\n this.$videoElement.style.left = left + \"px\"\n this.$videoElement.style.top = top + \"px\"\n }\n\n\n}\n","import Emitter from \"../utils/emitter\";\nimport {CONTROL_HEIGHT, EVENTS, SCREENSHOT_TYPE, VIDEO_ENC_TYPE} from \"../constant\";\nimport {dataURLToFile, downloadImg, isMobile, now} from \"../utils\";\nimport CommonLoader from \"./commonLoader\";\n\nexport default class VideoLoader extends CommonLoader {\n constructor(player) {\n super();\n this.player = player;\n const $videoElement = document.createElement('video');\n $videoElement.muted = true;\n $videoElement.style.position = \"absolute\";\n $videoElement.style.top = 0;\n $videoElement.style.left = 0;\n player.$container.appendChild($videoElement);\n this.$videoElement = $videoElement;\n this.videoInfo = {\n width: '',\n height: '',\n encType: '',\n }\n const _opt = this.player._opt;\n if (_opt.useWCS && _opt.wcsUseVideoRender) {\n this.trackGenerator = new MediaStreamTrackGenerator({kind: 'video'});\n $videoElement.srcObject = new MediaStream([this.trackGenerator]);\n this.vwriter = this.trackGenerator.writable.getWriter();\n }\n\n this.resize();\n\n const {proxy} = this.player.events;\n\n proxy(this.$videoElement, 'canplay', () => {\n this.player.debug.log('Video', 'canplay');\n })\n\n proxy(this.$videoElement, 'waiting', () => {\n this.player.emit(EVENTS.videoWaiting);\n })\n\n proxy(this.$videoElement, 'timeupdate', (event) => {\n // this.player.emit(EVENTS.videoTimeUpdate, event.timeStamp);\n })\n\n this.player.debug.log('Video', 'init');\n }\n\n destroy() {\n this.player.$container.removeChild(this.$videoElement);\n if (this.$videoElement) {\n this.$videoElement.src = ''\n this.$videoElement = null;\n }\n if (this.trackGenerator) {\n this.trackGenerator = null;\n }\n if (this.vwriter) {\n this.trackGenerator = null;\n }\n\n\n this.init = false;\n this.off();\n this.player.debug.log('Video', 'destroy');\n }\n\n play() {\n // this.$videoElement.autoplay = true;\n this.$videoElement.play();\n }\n\n clearView() {\n\n }\n\n screenshot(filename, format, quality, type) {\n filename = filename || now();\n type = type || SCREENSHOT_TYPE.download;\n const formatType = {\n png: 'image/png',\n jpeg: 'image/jpeg',\n webp: 'image/webp'\n };\n let encoderOptions = 0.92;\n if (!formatType[format] && SCREENSHOT_TYPE[format]) {\n type = format;\n format = 'png';\n quality = undefined\n }\n if (typeof quality === \"string\") {\n type = quality;\n quality = undefined;\n }\n\n if (typeof quality !== 'undefined') {\n encoderOptions = Number(quality);\n }\n const $video = this.$videoElement;\n let canvas = document.createElement('canvas');\n canvas.width = $video.videoWidth;\n canvas.height = $video.videoHeight;\n const context = canvas.getContext('2d');\n context.drawImage($video, 0, 0, canvas.width, canvas.height);\n const dataURL = canvas.toDataURL(SCREENSHOT_TYPE[format] || SCREENSHOT_TYPE.png, encoderOptions);\n const file = dataURLToFile(dataURL)\n if (type === SCREENSHOT_TYPE.base64) {\n return dataURL;\n } else if (type === SCREENSHOT_TYPE.blob) {\n return file;\n } else if (type === SCREENSHOT_TYPE.download) {\n downloadImg(file, filename);\n }\n }\n\n initCanvasViewSize() {\n this.resize();\n }\n\n //\n render(msg) {\n if (this.vwriter) {\n this.vwriter.write(msg.videoFrame);\n }\n }\n\n\n resize() {\n let width = this.player.width;\n let height = this.player.height;\n const option = this.player._opt;\n const rotate = option.rotate;\n if (option.hasControl && !option.controlAutoHide) {\n if (isMobile() && this.player.fullscreen) {\n width -= CONTROL_HEIGHT;\n } else {\n height -= CONTROL_HEIGHT;\n }\n }\n\n this.$videoElement.width = width;\n this.$videoElement.height = height;\n\n if (rotate === 270 || rotate === 90) {\n this.$videoElement.width = height;\n this.$videoElement.height = width;\n }\n let resizeWidth = this.$videoElement.width;\n let resizeHeight = this.$videoElement.height;\n let left = ((width - resizeWidth) / 2)\n let top = ((height - resizeHeight) / 2)\n let objectFill = 'contain';\n\n // 默认是true\n // 视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边\n\n // 视频画面完全填充canvas区域,画面会被拉伸\n if (!option.isResize) {\n objectFill = 'fill';\n }\n\n // 视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全\n if (option.isFullResize) {\n objectFill = 'none';\n }\n this.$videoElement.style.objectFit = objectFill;\n this.$videoElement.style.transform = 'rotate(' + rotate + 'deg)';\n this.$videoElement.style.left = left + \"px\"\n this.$videoElement.style.top = top + \"px\"\n }\n}\n","import CanvasVideoLoader from './canvasLoader';\nimport VideoLoader from \"./videoLoader\";\n\nexport default class Video {\n constructor(player) {\n const Loader = Video.getLoaderFactory(player._opt);\n return new Loader(player);\n }\n\n static getLoaderFactory(opt) {\n if (opt.useMSE || (opt.useWCS && opt.wcsUseVideoRender)) {\n return VideoLoader;\n } else {\n return CanvasVideoLoader;\n }\n }\n}\n","import Emitter from \"../utils/emitter\";\nimport {AUDIO_ENC_TYPE, AUDIO_SYNC_VIDEO_DIFF, EVENTS, VIDEO_ENC_TYPE} from \"../constant\";\nimport {clamp, noop} from \"../utils\";\n\nexport default class AudioContextLoader extends Emitter {\n constructor(player) {\n super();\n this.bufferList = [];\n this.player = player;\n this.scriptNode = null;\n this.hasInitScriptNode = false;\n this.audioContextChannel = null;\n\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)();\n //\n this.gainNode = this.audioContext.createGain();\n // Get an AudioBufferSourceNode.\n // This is the AudioNode to use when we want to play an AudioBuffer\n const source = this.audioContext.createBufferSource();\n // set the buffer in the AudioBufferSourceNode\n source.buffer = this.audioContext.createBuffer(1, 1, 22050);\n // connect the AudioBufferSourceNode to the\n // destination so we can hear the sound\n source.connect(this.audioContext.destination);\n // noteOn as start\n // start the source playing\n if (source.noteOn) {\n source.noteOn(0);\n } else {\n source.start(0);\n }\n this.audioBufferSourceNode = source;\n //\n this.mediaStreamAudioDestinationNode = this.audioContext.createMediaStreamDestination();\n //\n this.audioEnabled(true);\n // default setting 0\n this.gainNode.gain.value = 0;\n\n this.playing = false;\n //\n this.audioSyncVideoOption = {\n diff: null\n };\n\n\n this.audioInfo = {\n encType: '',\n channels: '',\n sampleRate: ''\n }\n this.init = false;\n this.hasAudio = false;\n\n // update\n this.on(EVENTS.videoSyncAudio, (options) => {\n // this.player.debug.log('AudioContext', `videoSyncAudio , audioTimestamp: ${options.audioTimestamp},videoTimestamp: ${options.videoTimestamp},diff:${options.diff}`)\n this.audioSyncVideoOption = options;\n })\n\n this.player.debug.log('AudioContext', 'init');\n }\n\n\n destroy() {\n this.closeAudio();\n this.audioContext.close();\n this.audioContext = null;\n this.gainNode = null;\n this.init = false;\n this.hasAudio = false;\n this.playing = false;\n\n if (this.scriptNode) {\n this.scriptNode.onaudioprocess = noop;\n this.scriptNode = null;\n }\n this.audioBufferSourceNode = null;\n this.mediaStreamAudioDestinationNode = null;\n this.hasInitScriptNode = false;\n this.audioSyncVideoOption = {\n diff: null\n };\n this.audioInfo = {\n encType: '',\n channels: '',\n sampleRate: ''\n }\n this.off();\n this.player.debug.log('AudioContext', 'destroy');\n }\n\n updateAudioInfo(data) {\n if (data.encTypeCode) {\n this.audioInfo.encType = AUDIO_ENC_TYPE[data.encTypeCode];\n }\n\n if (data.channels) {\n this.audioInfo.channels = data.channels;\n }\n\n if (data.sampleRate) {\n this.audioInfo.sampleRate = data.sampleRate;\n }\n\n // audio 基本信息\n if (this.audioInfo.sampleRate && this.audioInfo.channels && this.audioInfo.encType && !this.init) {\n this.player.emit(EVENTS.audioInfo, this.audioInfo);\n this.init = true;\n }\n }\n\n //\n get isPlaying() {\n return this.playing;\n }\n\n get isMute() {\n return this.gainNode.gain.value === 0 || this.isStateSuspended();\n }\n\n get volume() {\n return this.gainNode.gain.value;\n }\n\n get bufferSize() {\n return this.bufferList.length;\n }\n\n\n initScriptNode() {\n this.playing = true;\n\n if (this.hasInitScriptNode) {\n return;\n }\n const channels = this.audioInfo.channels;\n\n const scriptNode = this.audioContext.createScriptProcessor(1024, 0, channels);\n // tips: if audio isStateSuspended onaudioprocess method not working\n scriptNode.onaudioprocess = (audioProcessingEvent) => {\n const outputBuffer = audioProcessingEvent.outputBuffer;\n\n if (this.bufferList.length && this.playing) {\n // just for wasm\n if (!this.player._opt.useWCS && !this.player._opt.useMSE) {\n // audio > video\n // wait\n if (this.audioSyncVideoOption.diff > AUDIO_SYNC_VIDEO_DIFF) {\n this.player.debug.warn('AudioContext', `audioSyncVideoOption more than diff :${this.audioSyncVideoOption.diff}, waiting`)\n // wait\n return;\n }\n // audio < video\n // throw away then chase video\n else if (this.audioSyncVideoOption.diff < -AUDIO_SYNC_VIDEO_DIFF) {\n this.player.debug.warn('AudioContext', `audioSyncVideoOption less than diff :${this.audioSyncVideoOption.diff}, dropping`)\n\n //\n let bufferItem = this.bufferList.shift();\n //\n while ((bufferItem.ts - this.player.videoTimestamp < -AUDIO_SYNC_VIDEO_DIFF) && this.bufferList.length > 0) {\n // this.player.debug.warn('AudioContext', `audioSyncVideoOption less than inner ts is:${bufferItem.ts}, videoTimestamp is ${this.player.videoTimestamp},diff:${bufferItem.ts - this.player.videoTimestamp}`)\n bufferItem = this.bufferList.shift();\n }\n\n if (this.bufferList.length === 0) {\n return;\n }\n }\n }\n\n if (this.bufferList.length === 0) {\n return;\n }\n\n const bufferItem = this.bufferList.shift();\n\n // update audio time stamp\n if (bufferItem && bufferItem.ts) {\n this.player.audioTimestamp = bufferItem.ts;\n }\n\n for (let channel = 0; channel < channels; channel++) {\n const b = bufferItem.buffer[channel]\n const nowBuffering = outputBuffer.getChannelData(channel);\n for (let i = 0; i < 1024; i++) {\n nowBuffering[i] = b[i] || 0\n }\n }\n }\n }\n\n scriptNode.connect(this.gainNode);\n this.scriptNode = scriptNode;\n this.gainNode.connect(this.audioContext.destination);\n this.gainNode.connect(this.mediaStreamAudioDestinationNode);\n this.hasInitScriptNode = true;\n }\n\n mute(flag) {\n if (flag) {\n if (!this.isMute) {\n this.player.emit(EVENTS.mute, flag);\n }\n this.setVolume(0);\n this.audioEnabled(false);\n this.clear();\n } else {\n if (this.isMute) {\n this.player.emit(EVENTS.mute, flag);\n }\n this.setVolume(0.5);\n this.audioEnabled(true);\n }\n }\n\n setVolume(volume) {\n volume = parseFloat(volume).toFixed(2);\n if (isNaN(volume)) {\n return;\n }\n this.audioEnabled(true);\n volume = clamp(volume, 0, 1);\n this.gainNode.gain.value = volume;\n this.gainNode.gain.setValueAtTime(volume, this.audioContext.currentTime);\n this.player.emit(EVENTS.volumechange, this.player.volume);\n }\n\n closeAudio() {\n if (this.hasInitScriptNode) {\n this.scriptNode && this.scriptNode.disconnect(this.gainNode);\n this.gainNode && this.gainNode.disconnect(this.audioContext.destination);\n this.gainNode && this.gainNode.disconnect(this.mediaStreamAudioDestinationNode);\n }\n this.clear();\n }\n\n // 是否播放。。。\n audioEnabled(flag) {\n if (flag) {\n if (this.audioContext.state === 'suspended') {\n // resume\n this.audioContext.resume();\n }\n } else {\n if (this.audioContext.state === 'running') {\n // suspend\n this.audioContext.suspend();\n }\n }\n }\n\n isStateRunning() {\n return this.audioContext.state === 'running';\n }\n\n isStateSuspended() {\n return this.audioContext.state === 'suspended';\n }\n\n clear() {\n this.bufferList = [];\n }\n\n play(buffer, ts) {\n // if is mute\n if (this.isMute) {\n return;\n }\n\n this.hasAudio = true;\n\n this.bufferList.push({\n buffer,\n ts\n });\n\n if (this.bufferList.length > 20) {\n this.player.debug.warn('AudioContext', `bufferList is large: ${this.bufferList.length}`)\n\n // out of memory\n if (this.bufferList.length > 50) {\n this.bufferList.shift();\n }\n }\n // this.player.debug.log('AudioContext', `bufferList is ${this.bufferList.length}`)\n }\n\n pause() {\n this.audioSyncVideoOption = {\n diff: null\n };\n this.playing = false;\n this.clear();\n }\n\n resume() {\n this.playing = true;\n }\n\n\n\n\n}\n","import AudioContextLoader from \"./audioContextLoader\";\nimport AudioLoader from \"./audioLoader\";\n\nexport default class Audio {\n constructor(player) {\n const Loader = Audio.getLoaderFactory();\n return new Loader(player);\n }\n\n static getLoaderFactory() {\n return AudioContextLoader;\n }\n}\n","import Emitter from \"../utils/emitter\";\nimport {EVENTS, EVENTS_ERROR, JESSIBUCA_EVENTS} from \"../constant\";\nimport {calculationRate, now} from \"../utils\";\n\nexport default class FetchLoader extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n this.playing = false;\n\n this.abortController = new AbortController();\n //\n this.streamRate = calculationRate(rate => {\n player.emit(EVENTS.kBps, (rate / 1024).toFixed(2));\n });\n player.debug.log('FetchStream', 'init');\n }\n\n destroy() {\n this.abort()\n this.off();\n this.streamRate = null;\n this.player.debug.log('FetchStream', 'destroy');\n }\n\n fetchStream(url) {\n const {demux} = this.player;\n this.player._times.streamStart = now();\n fetch(url, {signal: this.abortController.signal}).then((res) => {\n const reader = res.body.getReader();\n this.emit(EVENTS.streamSuccess);\n const fetchNext = () => {\n reader.read().then(({done, value}) => {\n if (done) {\n demux.close();\n } else {\n this.streamRate && this.streamRate(value.byteLength);\n demux.dispatch(value);\n fetchNext();\n }\n }\n ).catch((e) => {\n demux.close();\n // 这边会报用户 aborted a request 错误。\n this.emit(EVENTS_ERROR.fetchError, e);\n this.player.emit(EVENTS.error, EVENTS_ERROR.fetchError);\n this.abort();\n })\n }\n fetchNext();\n }).catch((e) => {\n this.abort();\n this.emit(EVENTS_ERROR.fetchError, e)\n this.player.emit(EVENTS.error, EVENTS_ERROR.fetchError);\n })\n }\n\n abort() {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null\n }\n }\n\n\n}\n","import Emitter from \"../utils/emitter\";\nimport {EVENTS, EVENTS_ERROR, WEBSOCKET_STATUS} from \"../constant\";\nimport {calculationRate, now} from \"../utils\";\n\nexport default class WebsocketLoader extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n this.socket = null;\n this.socketStatus = WEBSOCKET_STATUS.notConnect;\n this.wsUrl = null;\n //\n this.streamRate = calculationRate(rate => {\n player.emit(EVENTS.kBps, (rate / 1024).toFixed(2));\n });\n }\n\n destroy() {\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n this.socketStatus = WEBSOCKET_STATUS.notConnect;\n this.streamRate = null;\n this.wsUrl = null;\n this.off();\n this.player.debug.log('websocketLoader', 'destroy');\n }\n\n _createWebSocket() {\n const player = this.player;\n const {\n debug,\n events: {proxy},\n demux,\n } = player;\n\n this.socket = new WebSocket(this.wsUrl);\n this.socket.binaryType = 'arraybuffer';\n proxy(this.socket, 'open', () => {\n this.emit(EVENTS.streamSuccess);\n debug.log('websocketLoader', 'socket open');\n this.socketStatus = WEBSOCKET_STATUS.open;\n });\n\n proxy(this.socket, 'message', event => {\n this.streamRate && this.streamRate(event.data.byteLength);\n this._handleMessage(event.data);\n });\n\n\n proxy(this.socket, 'close', () => {\n debug.log('websocketLoader', 'socket close');\n this.emit(EVENTS.streamEnd);\n this.socketStatus = WEBSOCKET_STATUS.close;\n });\n\n proxy(this.socket, 'error', error => {\n debug.log('websocketLoader', 'socket error');\n this.emit(EVENTS_ERROR.websocketError, error);\n this.player.emit(EVENTS.error, EVENTS_ERROR.websocketError);\n this.socketStatus = WEBSOCKET_STATUS.error;\n demux.close();\n debug.log('websocketLoader', `socket error:`, error);\n });\n }\n\n //\n _handleMessage(message) {\n const {demux} = this.player;\n if (!demux) {\n this.player.debug.warn('websocketLoader', 'websocket handle message demux is null');\n return;\n }\n demux.dispatch(message);\n }\n\n\n fetchStream(url) {\n this.player._times.streamStart = now();\n this.wsUrl = url;\n this._createWebSocket();\n }\n\n\n}\n","import FetchLoader from \"./fetchLoader\";\nimport WebsocketLoader from \"./websocketLoader\";\nimport {PLAYER_PLAY_PROTOCOL} from \"../constant\";\n\nexport default class Stream {\n constructor(player) {\n const Loader = Stream.getLoaderFactory(player._opt.protocol);\n return new Loader(player);\n }\n\n static getLoaderFactory(protocol) {\n if (protocol === PLAYER_PLAY_PROTOCOL.fetch) {\n return FetchLoader;\n } else if (protocol === PLAYER_PLAY_PROTOCOL.websocket) {\n return WebsocketLoader;\n }\n }\n}\n","'use strict';\r\n\r\n// Last time updated: 2021-03-09 3:20:22 AM UTC\r\n\r\n// ________________\r\n// RecordRTC v5.6.2\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/RecordRTC\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\n// ____________\r\n// RecordRTC.js\r\n\r\n/**\r\n * {@link https://github.com/muaz-khan/RecordRTC|RecordRTC} is a WebRTC JavaScript library for audio/video as well as screen activity recording. It supports Chrome, Firefox, Opera, Android, and Microsoft Edge. Platforms: Linux, Mac and Windows. \r\n * @summary Record audio, video or screen inside the browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTC\r\n * @class\r\n * @example\r\n * var recorder = RecordRTC(mediaStream or [arrayOfMediaStream], {\r\n * type: 'video', // audio or video or gif or canvas\r\n * recorderType: MediaStreamRecorder || CanvasRecorder || StereoAudioRecorder || Etc\r\n * });\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, desiredSampRate: 16000, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction RecordRTC(mediaStream, config) {\r\n if (!mediaStream) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n config = config || {\r\n type: 'video'\r\n };\r\n\r\n config = new RecordRTCConfiguration(mediaStream, config);\r\n\r\n // a reference to user's recordRTC object\r\n var self = this;\r\n\r\n function startRecording(config2) {\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC version: ', self.version);\r\n }\r\n\r\n if (!!config2) {\r\n // allow users to set options using startRecording method\r\n // config2 is similar to main \"config\" object (second parameter over RecordRTC constructor)\r\n config = new RecordRTCConfiguration(mediaStream, config2);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('started recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n return self;\r\n }\r\n\r\n initRecorder(function() {\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n });\r\n\r\n return self;\r\n }\r\n\r\n function initRecorder(initCallback) {\r\n if (initCallback) {\r\n config.initCallback = function() {\r\n initCallback();\r\n initCallback = config.initCallback = null; // recorder.initRecorder should be call-backed once.\r\n };\r\n }\r\n\r\n var Recorder = new GetRecorderType(mediaStream, config);\r\n\r\n mediaRecorder = new Recorder(mediaStream, config);\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (!config.disableLogs) {\r\n console.log('Initialized recorderType:', mediaRecorder.constructor.name, 'for output-type:', config.type);\r\n }\r\n }\r\n\r\n function stopRecording(callback) {\r\n callback = callback || function() {};\r\n\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state === 'paused') {\r\n self.resumeRecording();\r\n\r\n setTimeout(function() {\r\n stopRecording(callback);\r\n }, 1);\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording' && !config.disableLogs) {\r\n console.warn('Recording state should be: \"recording\", however current state is: ', self.state);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Stopped recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (config.type !== 'gif') {\r\n mediaRecorder.stop(_callback);\r\n } else {\r\n mediaRecorder.stop();\r\n _callback();\r\n }\r\n\r\n setState('stopped');\r\n\r\n function _callback(__blob) {\r\n if (!mediaRecorder) {\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, '');\r\n } else {\r\n callback('');\r\n }\r\n return;\r\n }\r\n\r\n Object.keys(mediaRecorder).forEach(function(key) {\r\n if (typeof mediaRecorder[key] === 'function') {\r\n return;\r\n }\r\n\r\n self[key] = mediaRecorder[key];\r\n });\r\n\r\n var blob = mediaRecorder.blob;\r\n\r\n if (!blob) {\r\n if (__blob) {\r\n mediaRecorder.blob = blob = __blob;\r\n } else {\r\n throw 'Recording failed.';\r\n }\r\n }\r\n\r\n if (blob && !config.disableLogs) {\r\n console.log(blob.type, '->', bytesToSize(blob.size));\r\n }\r\n\r\n if (callback) {\r\n var url;\r\n\r\n try {\r\n url = URL.createObjectURL(blob);\r\n } catch (e) {}\r\n\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, url);\r\n } else {\r\n callback(url);\r\n }\r\n }\r\n\r\n if (!config.autoWriteToDisk) {\r\n return;\r\n }\r\n\r\n getDataURL(function(dataURL) {\r\n var parameter = {};\r\n parameter[config.type + 'Blob'] = dataURL;\r\n DiskStorage.Store(parameter);\r\n });\r\n }\r\n }\r\n\r\n function pauseRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to pause the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('paused');\r\n\r\n mediaRecorder.pause();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Paused recording.');\r\n }\r\n }\r\n\r\n function resumeRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'paused') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to resume the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('recording');\r\n\r\n // not all libs have this method yet\r\n mediaRecorder.resume();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Resumed recording.');\r\n }\r\n }\r\n\r\n function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n }\r\n\r\n function getDataURL(callback, _mediaRecorder) {\r\n if (!callback) {\r\n throw 'Pass a callback function over getDataURL.';\r\n }\r\n\r\n var blob = _mediaRecorder ? _mediaRecorder.blob : (mediaRecorder || {}).blob;\r\n\r\n if (!blob) {\r\n if (!config.disableLogs) {\r\n console.warn('Blob encoder did not finish its job yet.');\r\n }\r\n\r\n setTimeout(function() {\r\n getDataURL(callback, _mediaRecorder);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (typeof Worker !== 'undefined' && !navigator.mozGetUserMedia) {\r\n var webWorker = processInWebWorker(readFile);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback(event.target.result);\r\n };\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n try {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n } catch (e) {}\r\n }\r\n }\r\n\r\n function handleRecordingDuration(counter) {\r\n counter = counter || 0;\r\n\r\n if (self.state === 'paused') {\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (self.state === 'stopped') {\r\n return;\r\n }\r\n\r\n if (counter >= self.recordingDuration) {\r\n stopRecording(self.onRecordingStopped);\r\n return;\r\n }\r\n\r\n counter += 1000; // 1-second\r\n\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n }\r\n\r\n function setState(state) {\r\n if (!self) {\r\n return;\r\n }\r\n\r\n self.state = state;\r\n\r\n if (typeof self.onStateChanged.call === 'function') {\r\n self.onStateChanged.call(self, state);\r\n } else {\r\n self.onStateChanged(state);\r\n }\r\n }\r\n\r\n var WARNING = 'It seems that recorder is destroyed or \"startRecording\" is not invoked for ' + config.type + ' recorder.';\r\n\r\n function warningLog() {\r\n if (config.disableLogs === true) {\r\n return;\r\n }\r\n\r\n console.warn(WARNING);\r\n }\r\n\r\n var mediaRecorder;\r\n\r\n var returnObject = {\r\n /**\r\n * This method starts the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var recorder = RecordRTC(mediaStream, {\r\n * type: 'video'\r\n * });\r\n * recorder.startRecording();\r\n */\r\n startRecording: startRecording,\r\n\r\n /**\r\n * This method stops the recording. It is strongly recommended to get \"blob\" or \"URI\" inside the callback to make sure all recorders finished their job.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * // use either \"this\" or \"recorder\" object; both are identical\r\n * video.src = this.toURL();\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n stopRecording: stopRecording,\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Firefox is unable to pause the recording. Fix it.\r\n * @example\r\n * recorder.pauseRecording(); // pause the recording\r\n * recorder.resumeRecording(); // resume again\r\n */\r\n pauseRecording: pauseRecording,\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.pauseRecording(); // first of all, pause the recording\r\n * recorder.resumeRecording(); // now resume it\r\n */\r\n resumeRecording: resumeRecording,\r\n\r\n /**\r\n * This method initializes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * recorder.initRecorder();\r\n */\r\n initRecorder: initRecorder,\r\n\r\n /**\r\n * Ask RecordRTC to auto-stop the recording after 5 minutes.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var fiveMinutes = 5 * 1000 * 60;\r\n * recorder.setRecordingDuration(fiveMinutes, function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n * \r\n * // or otherwise\r\n * recorder.setRecordingDuration(fiveMinutes).onRecordingStopped(function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n */\r\n setRecordingDuration: function(recordingDuration, callback) {\r\n if (typeof recordingDuration === 'undefined') {\r\n throw 'recordingDuration is required.';\r\n }\r\n\r\n if (typeof recordingDuration !== 'number') {\r\n throw 'recordingDuration must be a number.';\r\n }\r\n\r\n self.recordingDuration = recordingDuration;\r\n self.onRecordingStopped = callback || function() {};\r\n\r\n return {\r\n onRecordingStopped: function(callback) {\r\n self.onRecordingStopped = callback;\r\n }\r\n };\r\n },\r\n\r\n /**\r\n * This method can be used to clear/reset all the recorded data.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Figure out the difference between \"reset\" and \"clearRecordedData\" methods.\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n clearRecordedData: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n mediaRecorder.clearRecordedData();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Cleared old recorded data.');\r\n }\r\n },\r\n\r\n /**\r\n * Get the recorded blob. Use this method inside the \"stopRecording\" callback.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.getBlob();\r\n *\r\n * var file = new File([blob], 'filename.webm', {\r\n * type: 'video/webm'\r\n * });\r\n *\r\n * var formData = new FormData();\r\n * formData.append('file', file); // upload \"File\" object rather than a \"Blob\"\r\n * uploadToServer(formData);\r\n * });\r\n * @returns {Blob} Returns recorded data as \"Blob\" object.\r\n */\r\n getBlob: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return mediaRecorder.blob;\r\n },\r\n\r\n /**\r\n * Get data-URI instead of Blob.\r\n * @param {function} callback - Callback to get the Data-URI.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * recorder.getDataURL(function(dataURI) {\r\n * video.src = dataURI;\r\n * });\r\n * });\r\n */\r\n getDataURL: getDataURL,\r\n\r\n /**\r\n * Get virtual/temporary URL. Usage of this URL is limited to current tab.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * video.src = this.toURL();\r\n * });\r\n * @returns {String} Returns a virtual/temporary URL for the recorded \"Blob\".\r\n */\r\n toURL: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return URL.createObjectURL(mediaRecorder.blob);\r\n },\r\n\r\n /**\r\n * Get internal recording object (i.e. internal module) e.g. MutliStreamRecorder, MediaStreamRecorder, StereoAudioRecorder or WhammyRecorder etc.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var internalRecorder = recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n getInternalRecorder: function() {\r\n return mediaRecorder;\r\n },\r\n\r\n /**\r\n * Invoke save-as dialog to save the recorded blob into your disk.\r\n * @param {string} fileName - Set your own file name.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * this.save('file-name');\r\n *\r\n * // or manually:\r\n * invokeSaveAsDialog(this.getBlob(), 'filename.webm');\r\n * });\r\n */\r\n save: function(fileName) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n invokeSaveAsDialog(mediaRecorder.blob, fileName);\r\n },\r\n\r\n /**\r\n * This method gets a blob from indexed-DB storage.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.getFromDisk(function(dataURL) {\r\n * video.src = dataURL;\r\n * });\r\n */\r\n getFromDisk: function(callback) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n RecordRTC.getFromDisk(config.type, callback);\r\n },\r\n\r\n /**\r\n * This method appends an array of webp images to the recorded video-blob. It takes an \"array\" object.\r\n * @type {Array.}\r\n * @param {Array} arrayOfWebPImages - Array of webp images.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * var arrayOfWebPImages = [];\r\n * arrayOfWebPImages.push({\r\n * duration: index,\r\n * image: 'data:image/webp;base64,...'\r\n * });\r\n * recorder.setAdvertisementArray(arrayOfWebPImages);\r\n */\r\n setAdvertisementArray: function(arrayOfWebPImages) {\r\n config.advertisement = [];\r\n\r\n var length = arrayOfWebPImages.length;\r\n for (var i = 0; i < length; i++) {\r\n config.advertisement.push({\r\n duration: i,\r\n image: arrayOfWebPImages[i]\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * It is equivalent to \"recorder.getBlob()\"
method. Usage of \"getBlob\" is recommended, though.\r\n * @property {Blob} blob - Recorded Blob can be accessed using this property.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.blob;\r\n *\r\n * // below one is recommended\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n blob: null,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} bufferSize - Buffer-size used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used this buffer-size: ' + this.bufferSize);\r\n * });\r\n */\r\n bufferSize: 0,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} sampleRate - Sample-rates used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used these sample-rates: ' + this.sampleRate);\r\n * });\r\n */\r\n sampleRate: 0,\r\n\r\n /**\r\n * {recorderType:StereoAudioRecorder} returns ArrayBuffer object.\r\n * @property {ArrayBuffer} buffer - Audio ArrayBuffer, supported only in Chrome.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var arrayBuffer = this.buffer;\r\n * alert(arrayBuffer.byteLength);\r\n * });\r\n */\r\n buffer: null,\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.reset();\r\n * recorder.startRecording();\r\n */\r\n reset: function() {\r\n if (self.state === 'recording' && !config.disableLogs) {\r\n console.warn('Stop an active recorder.');\r\n }\r\n\r\n if (mediaRecorder && typeof mediaRecorder.clearRecordedData === 'function') {\r\n mediaRecorder.clearRecordedData();\r\n }\r\n mediaRecorder = null;\r\n setState('inactive');\r\n self.blob = null;\r\n },\r\n\r\n /**\r\n * This method is called whenever recorder's state changes. Use this as an \"event\".\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.onStateChanged = function(state) {\r\n * console.log('Recorder state: ', state);\r\n * };\r\n */\r\n onStateChanged: function(state) {\r\n if (!config.disableLogs) {\r\n console.log('Recorder state changed:', state);\r\n }\r\n },\r\n\r\n /**\r\n * A recorder can have inactive, recording, paused or stopped states.\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * // this looper function will keep you updated about the recorder's states.\r\n * (function looper() {\r\n * document.querySelector('h1').innerHTML = 'Recorder\\'s state is: ' + recorder.state;\r\n * if(recorder.state === 'stopped') return; // ignore+stop\r\n * setTimeout(looper, 1000); // update after every 3-seconds\r\n * })();\r\n * recorder.startRecording();\r\n */\r\n state: 'inactive',\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n getState: function() {\r\n return self.state;\r\n },\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n destroy: function() {\r\n var disableLogsCache = config.disableLogs;\r\n\r\n config = {\r\n disableLogs: true\r\n };\r\n self.reset();\r\n setState('destroyed');\r\n returnObject = self = null;\r\n\r\n if (Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor.close();\r\n Storage.AudioContextConstructor = null;\r\n }\r\n\r\n config.disableLogs = disableLogsCache;\r\n\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC is destroyed.');\r\n }\r\n },\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n version: '5.6.2'\r\n };\r\n\r\n if (!this) {\r\n self = returnObject;\r\n return returnObject;\r\n }\r\n\r\n // if someone wants to use RecordRTC with the \"new\" keyword.\r\n for (var prop in returnObject) {\r\n this[prop] = returnObject[prop];\r\n }\r\n\r\n self = this;\r\n\r\n return returnObject;\r\n}\r\n\r\nRecordRTC.version = '5.6.2';\r\n\r\nif (typeof module !== 'undefined' /* && !!module.exports*/ ) {\r\n module.exports = RecordRTC;\r\n}\r\n\r\nif (typeof define === 'function' && define.amd) {\r\n define('RecordRTC', [], function() {\r\n return RecordRTC;\r\n });\r\n}\n\r\nRecordRTC.getFromDisk = function(type, callback) {\r\n if (!callback) {\r\n throw 'callback is mandatory.';\r\n }\r\n\r\n console.log('Getting recorded ' + (type === 'all' ? 'blobs' : type + ' blob ') + ' from disk!');\r\n DiskStorage.Fetch(function(dataURL, _type) {\r\n if (type !== 'all' && _type === type + 'Blob' && callback) {\r\n callback(dataURL);\r\n }\r\n\r\n if (type === 'all' && callback) {\r\n callback(dataURL, _type.replace('Blob', ''));\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * RecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nRecordRTC.writeToDisk = function(options) {\r\n console.log('Writing recorded blob(s) to disk!');\r\n options = options || {};\r\n if (options.audio && options.video && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.video) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.video && options.gif) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL\r\n });\r\n });\r\n } else if (options.video) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n } else if (options.gif) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n }\r\n};\n\r\n// __________________________\r\n// RecordRTC-Configuration.js\r\n\r\n/**\r\n * {@link RecordRTCConfiguration} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It configures the 2nd parameter passed over {@link RecordRTC} and returns a valid \"config\" object.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCConfiguration\r\n * @class\r\n * @example\r\n * var options = RecordRTCConfiguration(mediaStream, options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, getNativeBlob:true, etc.}\r\n */\r\n\r\nfunction RecordRTCConfiguration(mediaStream, config) {\r\n if (!config.recorderType && !config.type) {\r\n if (!!config.audio && !!config.video) {\r\n config.type = 'video';\r\n } else if (!!config.audio && !config.video) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n if (config.recorderType && !config.type) {\r\n if (config.recorderType === WhammyRecorder || config.recorderType === CanvasRecorder || (typeof WebAssemblyRecorder !== 'undefined' && config.recorderType === WebAssemblyRecorder)) {\r\n config.type = 'video';\r\n } else if (config.recorderType === GifRecorder) {\r\n config.type = 'gif';\r\n } else if (config.recorderType === StereoAudioRecorder) {\r\n config.type = 'audio';\r\n } else if (config.recorderType === MediaStreamRecorder) {\r\n if (getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (!getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (getTracks(mediaStream, 'audio').length && !getTracks(mediaStream, 'video').length) {\r\n config.type = 'audio';\r\n } else {\r\n // config.type = 'UnKnown';\r\n }\r\n }\r\n }\r\n\r\n if (typeof MediaStreamRecorder !== 'undefined' && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (!config.mimeType) {\r\n config.mimeType = 'video/webm';\r\n }\r\n\r\n if (!config.type) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n\r\n if (!config.bitsPerSecond) {\r\n // config.bitsPerSecond = 128000;\r\n }\r\n }\r\n\r\n // consider default type=audio\r\n if (!config.type) {\r\n if (config.mimeType) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n if (!config.type) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n return config;\r\n}\n\r\n// __________________\r\n// GetRecorderType.js\r\n\r\n/**\r\n * {@link GetRecorderType} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It returns best recorder-type available for your browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GetRecorderType\r\n * @class\r\n * @example\r\n * var RecorderType = GetRecorderType(options);\r\n * var recorder = new RecorderType(options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction GetRecorderType(mediaStream, config) {\r\n var recorder;\r\n\r\n // StereoAudioRecorder can work with all three: Edge, Firefox and Chrome\r\n // todo: detect if it is Edge, then auto use: StereoAudioRecorder\r\n if (isChrome || isEdge || isOpera) {\r\n // Media Stream Recording API has not been implemented in chrome yet;\r\n // That's why using WebAudio API to record stereo audio in WAV format\r\n recorder = StereoAudioRecorder;\r\n }\r\n\r\n if (typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype && !isChrome) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n // video recorder (in WebM format)\r\n if (config.type === 'video' && (isChrome || isOpera)) {\r\n recorder = WhammyRecorder;\r\n\r\n if (typeof WebAssemblyRecorder !== 'undefined' && typeof ReadableStream !== 'undefined') {\r\n recorder = WebAssemblyRecorder;\r\n }\r\n }\r\n\r\n // video recorder (in Gif format)\r\n if (config.type === 'gif') {\r\n recorder = GifRecorder;\r\n }\r\n\r\n // html2canvas recording!\r\n if (config.type === 'canvas') {\r\n recorder = CanvasRecorder;\r\n }\r\n\r\n if (isMediaRecorderCompatible() && recorder !== CanvasRecorder && recorder !== GifRecorder && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (getTracks(mediaStream, 'video').length || getTracks(mediaStream, 'audio').length) {\r\n // audio-only recording\r\n if (config.type === 'audio') {\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('audio/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n // else recorder = StereoAudioRecorder;\r\n } else {\r\n // video or screen tracks\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('video/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (mediaStream instanceof Array && mediaStream.length) {\r\n recorder = MultiStreamRecorder;\r\n }\r\n\r\n if (config.recorderType) {\r\n recorder = config.recorderType;\r\n }\r\n\r\n if (!config.disableLogs && !!recorder && !!recorder.name) {\r\n console.log('Using recorderType:', recorder.name || recorder.constructor.name);\r\n }\r\n\r\n if (!recorder && isSafari) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n return recorder;\r\n}\n\r\n// _____________\r\n// MRecordRTC.js\r\n\r\n/**\r\n * MRecordRTC runs on top of {@link RecordRTC} to bring multiple recordings in a single place, by providing simple API.\r\n * @summary MRecordRTC stands for \"Multiple-RecordRTC\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MRecordRTC\r\n * @class\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.addStream(MediaStream);\r\n * recorder.mediaType = {\r\n * audio: true, // or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif: true // or GifRecorder\r\n * };\r\n * // mimeType is optional and should be set only in advance cases.\r\n * recorder.mimeType = {\r\n * audio: 'audio/wav',\r\n * video: 'video/webm',\r\n * gif: 'image/gif'\r\n * };\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC/tree/master/MRecordRTC|MRecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction MRecordRTC(mediaStream) {\r\n\r\n /**\r\n * This method attaches MediaStream object to {@link MRecordRTC}.\r\n * @param {MediaStream} mediaStream - A MediaStream object, either fetched using getUserMedia API, or generated using captureStreamUntilEnded or WebAudio API.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.addStream(MediaStream);\r\n */\r\n this.addStream = function(_mediaStream) {\r\n if (_mediaStream) {\r\n mediaStream = _mediaStream;\r\n }\r\n };\r\n\r\n /**\r\n * This property can be used to set the recording type e.g. audio, or video, or gif, or canvas.\r\n * @property {object} mediaType - {audio: true, video: true, gif: true}\r\n * @memberof MRecordRTC\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.mediaType = {\r\n * audio: true, // TRUE or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // TRUE or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif : true // TRUE or GifRecorder\r\n * };\r\n */\r\n this.mediaType = {\r\n audio: true,\r\n video: true\r\n };\r\n\r\n /**\r\n * This method starts recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.startRecording();\r\n */\r\n this.startRecording = function() {\r\n var mediaType = this.mediaType;\r\n var recorderType;\r\n var mimeType = this.mimeType || {\r\n audio: null,\r\n video: null,\r\n gif: null\r\n };\r\n\r\n if (typeof mediaType.audio !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'audio').length) {\r\n mediaType.audio = false;\r\n }\r\n\r\n if (typeof mediaType.video !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.video = false;\r\n }\r\n\r\n if (typeof mediaType.gif !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.gif = false;\r\n }\r\n\r\n if (!mediaType.audio && !mediaType.video && !mediaType.gif) {\r\n throw 'MediaStream must have either audio or video tracks.';\r\n }\r\n\r\n if (!!mediaType.audio) {\r\n recorderType = null;\r\n if (typeof mediaType.audio === 'function') {\r\n recorderType = mediaType.audio;\r\n }\r\n\r\n this.audioRecorder = new RecordRTC(mediaStream, {\r\n type: 'audio',\r\n bufferSize: this.bufferSize,\r\n sampleRate: this.sampleRate,\r\n numberOfAudioChannels: this.numberOfAudioChannels || 2,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.audio,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp\r\n });\r\n\r\n if (!mediaType.video) {\r\n this.audioRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.video) {\r\n recorderType = null;\r\n if (typeof mediaType.video === 'function') {\r\n recorderType = mediaType.video;\r\n }\r\n\r\n var newStream = mediaStream;\r\n\r\n if (isMediaRecorderCompatible() && !!mediaType.audio && typeof mediaType.audio === 'function') {\r\n var videoTrack = getTracks(mediaStream, 'video')[0];\r\n\r\n if (isFirefox) {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n\r\n if (recorderType && recorderType === WhammyRecorder) {\r\n // Firefox does NOT supports webp-encoding yet\r\n // But Firefox do supports WebAssemblyRecorder\r\n recorderType = MediaStreamRecorder;\r\n }\r\n } else {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n }\r\n }\r\n\r\n this.videoRecorder = new RecordRTC(newStream, {\r\n type: 'video',\r\n video: this.video,\r\n canvas: this.canvas,\r\n frameInterval: this.frameInterval || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.video,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp,\r\n workerPath: this.workerPath,\r\n webAssemblyPath: this.webAssemblyPath,\r\n frameRate: this.frameRate, // used by WebAssemblyRecorder; values: usually 30; accepts any.\r\n bitrate: this.bitrate // used by WebAssemblyRecorder; values: 0 to 1000+\r\n });\r\n\r\n if (!mediaType.audio) {\r\n this.videoRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.audio && !!mediaType.video) {\r\n var self = this;\r\n\r\n var isSingleRecorder = isMediaRecorderCompatible() === true;\r\n\r\n if (mediaType.audio instanceof StereoAudioRecorder && !!mediaType.video) {\r\n isSingleRecorder = false;\r\n } else if (mediaType.audio !== true && mediaType.video !== true && mediaType.audio !== mediaType.video) {\r\n isSingleRecorder = false;\r\n }\r\n\r\n if (isSingleRecorder === true) {\r\n self.audioRecorder = null;\r\n self.videoRecorder.startRecording();\r\n } else {\r\n self.videoRecorder.initRecorder(function() {\r\n self.audioRecorder.initRecorder(function() {\r\n // Both recorders are ready to record things accurately\r\n self.videoRecorder.startRecording();\r\n self.audioRecorder.startRecording();\r\n });\r\n });\r\n }\r\n }\r\n\r\n if (!!mediaType.gif) {\r\n recorderType = null;\r\n if (typeof mediaType.gif === 'function') {\r\n recorderType = mediaType.gif;\r\n }\r\n this.gifRecorder = new RecordRTC(mediaStream, {\r\n type: 'gif',\r\n frameRate: this.frameRate || 200,\r\n quality: this.quality || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.gif\r\n });\r\n this.gifRecorder.startRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording.\r\n * @param {function} callback - Callback function is invoked when all encoders finished their jobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.stopRecording(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n */\r\n this.stopRecording = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (this.audioRecorder) {\r\n this.audioRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'audio');\r\n });\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'video');\r\n });\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'gif');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.pauseRecording();\r\n */\r\n this.pauseRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.pauseRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.pauseRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.pauseRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.resumeRecording();\r\n */\r\n this.resumeRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.resumeRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.resumeRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.resumeRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs.\r\n * @param {function} callback - All recorded blobs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getBlob(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n * // or\r\n * var audioBlob = recorder.getBlob().audio;\r\n * var videoBlob = recorder.getBlob().video;\r\n */\r\n this.getBlob = function(callback) {\r\n var output = {};\r\n\r\n if (this.audioRecorder) {\r\n output.audio = this.audioRecorder.getBlob();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n output.video = this.videoRecorder.getBlob();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n output.gif = this.gifRecorder.getBlob();\r\n }\r\n\r\n if (callback) {\r\n callback(output);\r\n }\r\n\r\n return output;\r\n };\r\n\r\n /**\r\n * Destroy all recorder instances.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n this.destroy = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.destroy();\r\n this.audioRecorder = null;\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.destroy();\r\n this.videoRecorder = null;\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.destroy();\r\n this.gifRecorder = null;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs' DataURLs.\r\n * @param {function} callback - All recorded blobs' DataURLs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getDataURL(function(recording){\r\n * var audioDataURL = recording.audio;\r\n * var videoDataURL = recording.video;\r\n * var gifDataURL = recording.gif;\r\n * });\r\n */\r\n this.getDataURL = function(callback) {\r\n this.getBlob(function(blob) {\r\n if (blob.audio && blob.video) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n audio: _audioDataURL,\r\n video: _videoDataURL\r\n });\r\n });\r\n });\r\n } else if (blob.audio) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n callback({\r\n audio: _audioDataURL\r\n });\r\n });\r\n } else if (blob.video) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n video: _videoDataURL\r\n });\r\n });\r\n }\r\n });\r\n\r\n function getDataURL(blob, callback00) {\r\n if (typeof Worker !== 'undefined') {\r\n var webWorker = processInWebWorker(function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n });\r\n\r\n webWorker.onmessage = function(event) {\r\n callback00(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback00(event.target.result);\r\n };\r\n }\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n var url;\r\n if (typeof URL !== 'undefined') {\r\n url = URL;\r\n } else if (typeof webkitURL !== 'undefined') {\r\n url = webkitURL;\r\n } else {\r\n throw 'Neither URL nor webkitURL detected.';\r\n }\r\n url.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to ask {@link MRecordRTC} to write all recorded blobs into IndexedDB storage.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.writeToDisk();\r\n */\r\n this.writeToDisk = function() {\r\n RecordRTC.writeToDisk({\r\n audio: this.audioRecorder,\r\n video: this.videoRecorder,\r\n gif: this.gifRecorder\r\n });\r\n };\r\n\r\n /**\r\n * This method can be used to invoke a save-as dialog for all recorded blobs.\r\n * @param {object} args - {audio: 'audio-name', video: 'video-name', gif: 'gif-name'}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.save({\r\n * audio: 'audio-file-name',\r\n * video: 'video-file-name',\r\n * gif : 'gif-file-name'\r\n * });\r\n */\r\n this.save = function(args) {\r\n args = args || {\r\n audio: true,\r\n video: true,\r\n gif: true\r\n };\r\n\r\n if (!!args.audio && this.audioRecorder) {\r\n this.audioRecorder.save(typeof args.audio === 'string' ? args.audio : '');\r\n }\r\n\r\n if (!!args.video && this.videoRecorder) {\r\n this.videoRecorder.save(typeof args.video === 'string' ? args.video : '');\r\n }\r\n if (!!args.gif && this.gifRecorder) {\r\n this.gifRecorder.save(typeof args.gif === 'string' ? args.gif : '');\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * This method can be used to get all recorded blobs from IndexedDB storage.\r\n * @param {string} type - 'all' or 'audio' or 'video' or 'gif'\r\n * @param {function} callback - Callback function to get all stored blobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.getFromDisk('all', function(dataURL, type){\r\n * if(type === 'audio') { }\r\n * if(type === 'video') { }\r\n * if(type === 'gif') { }\r\n * });\r\n */\r\nMRecordRTC.getFromDisk = RecordRTC.getFromDisk;\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nMRecordRTC.writeToDisk = RecordRTC.writeToDisk;\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MRecordRTC = MRecordRTC;\r\n}\n\r\nvar browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n(function(that) {\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n})(typeof global !== 'undefined' ? global : null);\n\r\n// _____________________________\r\n// Cross-Browser-Declarations.js\r\n\r\n// animation-frame used in WebM recording\r\n\r\n/*jshint -W079 */\r\nvar requestAnimationFrame = window.requestAnimationFrame;\r\nif (typeof requestAnimationFrame === 'undefined') {\r\n if (typeof webkitRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = webkitRequestAnimationFrame;\r\n } else if (typeof mozRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = mozRequestAnimationFrame;\r\n } else if (typeof msRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = msRequestAnimationFrame;\r\n } else if (typeof requestAnimationFrame === 'undefined') {\r\n // via: https://gist.github.com/paulirish/1579671\r\n var lastTime = 0;\r\n\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = function(callback, element) {\r\n var currTime = new Date().getTime();\r\n var timeToCall = Math.max(0, 16 - (currTime - lastTime));\r\n var id = setTimeout(function() {\r\n callback(currTime + timeToCall);\r\n }, timeToCall);\r\n lastTime = currTime + timeToCall;\r\n return id;\r\n };\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar cancelAnimationFrame = window.cancelAnimationFrame;\r\nif (typeof cancelAnimationFrame === 'undefined') {\r\n if (typeof webkitCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = webkitCancelAnimationFrame;\r\n } else if (typeof mozCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = mozCancelAnimationFrame;\r\n } else if (typeof msCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = msCancelAnimationFrame;\r\n } else if (typeof cancelAnimationFrame === 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = function(id) {\r\n clearTimeout(id);\r\n };\r\n }\r\n}\r\n\r\n// WebAudio API representer\r\nvar AudioContext = window.AudioContext;\r\n\r\nif (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar URL = window.URL;\r\n\r\nif (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n}\r\n\r\nif (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n}\r\n\r\nvar isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveBlob || !!navigator.msSaveOrOpenBlob);\r\nvar isOpera = !!window.opera || navigator.userAgent.indexOf('OPR/') !== -1;\r\nvar isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1 && ('netscape' in window) && / rv:/.test(navigator.userAgent);\r\nvar isChrome = (!isOpera && !isEdge && !!navigator.webkitGetUserMedia) || isElectron() || navigator.userAgent.toLowerCase().indexOf('chrome/') !== -1;\r\n\r\nvar isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n\r\nif (isSafari && !isChrome && navigator.userAgent.indexOf('CriOS') !== -1) {\r\n isSafari = false;\r\n isChrome = true;\r\n}\r\n\r\nvar MediaStream = window.MediaStream;\r\n\r\nif (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n}\r\n\r\n/*global MediaStream:true */\r\nif (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n}\r\n\r\n// below function via: http://goo.gl/B3ae8c\r\n/**\r\n * Return human-readable file size.\r\n * @param {number} bytes - Pass bytes and get formatted string.\r\n * @returns {string} - formatted string\r\n * @example\r\n * bytesToSize(1024*1024*5) === '5 GB'\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction bytesToSize(bytes) {\r\n var k = 1000;\r\n var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n if (bytes === 0) {\r\n return '0 Bytes';\r\n }\r\n var i = parseInt(Math.floor(Math.log(bytes) / Math.log(k)), 10);\r\n return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object. This parameter is required.\r\n * @param {string} fileName - Optional file name e.g. \"Recorded-Video.webm\"\r\n * @example\r\n * invokeSaveAsDialog(blob or file, [optional] fileName);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction invokeSaveAsDialog(file, fileName) {\r\n if (!file) {\r\n throw 'Blob object is required.';\r\n }\r\n\r\n if (!file.type) {\r\n try {\r\n file.type = 'video/webm';\r\n } catch (e) {}\r\n }\r\n\r\n var fileExtension = (file.type || 'video/webm').split('/')[1];\r\n if (fileExtension.indexOf(';') !== -1) {\r\n // extended mimetype, e.g. 'video/webm;codecs=vp8,opus'\r\n fileExtension = fileExtension.split(';')[0];\r\n }\r\n if (fileName && fileName.indexOf('.') !== -1) {\r\n var splitted = fileName.split('.');\r\n fileName = splitted[0];\r\n fileExtension = splitted[1];\r\n }\r\n\r\n var fileFullName = (fileName || (Math.round(Math.random() * 9999999999) + 888888888)) + '.' + fileExtension;\r\n\r\n if (typeof navigator.msSaveOrOpenBlob !== 'undefined') {\r\n return navigator.msSaveOrOpenBlob(file, fileFullName);\r\n } else if (typeof navigator.msSaveBlob !== 'undefined') {\r\n return navigator.msSaveBlob(file, fileFullName);\r\n }\r\n\r\n var hyperlink = document.createElement('a');\r\n hyperlink.href = URL.createObjectURL(file);\r\n hyperlink.download = fileFullName;\r\n\r\n hyperlink.style = 'display:none;opacity:0;color:transparent;';\r\n (document.body || document.documentElement).appendChild(hyperlink);\r\n\r\n if (typeof hyperlink.click === 'function') {\r\n hyperlink.click();\r\n } else {\r\n hyperlink.target = '_blank';\r\n hyperlink.dispatchEvent(new MouseEvent('click', {\r\n view: window,\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n }\r\n\r\n URL.revokeObjectURL(hyperlink.href);\r\n}\r\n\r\n/**\r\n * from: https://github.com/cheton/is-electron/blob/master/index.js\r\n **/\r\nfunction isElectron() {\r\n // Renderer process\r\n if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {\r\n return true;\r\n }\r\n\r\n // Main process\r\n if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) {\r\n return true;\r\n }\r\n\r\n // Detect the user agent when the `nodeIntegration` option is set to true\r\n if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getTracks(stream, kind) {\r\n if (!stream || !stream.getTracks) {\r\n return [];\r\n }\r\n\r\n return stream.getTracks().filter(function(t) {\r\n return t.kind === (kind || 'audio');\r\n });\r\n}\r\n\r\nfunction setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object.\r\n * @param {function} callback - Callback function.\r\n * @example\r\n * getSeekableBlob(blob or file, callback);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction getSeekableBlob(inputBlob, callback) {\r\n // EBML.js copyrights goes to: https://github.com/legokichi/ts-ebml\r\n if (typeof EBML === 'undefined') {\r\n throw new Error('Please link: https://www.webrtc-experiment.com/EBML.js');\r\n }\r\n\r\n var reader = new EBML.Reader();\r\n var decoder = new EBML.Decoder();\r\n var tools = EBML.tools;\r\n\r\n var fileReader = new FileReader();\r\n fileReader.onload = function(e) {\r\n var ebmlElms = decoder.decode(this.result);\r\n ebmlElms.forEach(function(element) {\r\n reader.read(element);\r\n });\r\n reader.stop();\r\n var refinedMetadataBuf = tools.makeMetadataSeekable(reader.metadatas, reader.duration, reader.cues);\r\n var body = this.result.slice(reader.metadataSize);\r\n var newBlob = new Blob([refinedMetadataBuf, body], {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(newBlob);\r\n };\r\n fileReader.readAsArrayBuffer(inputBlob);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.invokeSaveAsDialog = invokeSaveAsDialog;\r\n RecordRTC.getTracks = getTracks;\r\n RecordRTC.getSeekableBlob = getSeekableBlob;\r\n RecordRTC.bytesToSize = bytesToSize;\r\n RecordRTC.isElectron = isElectron;\r\n}\r\n\r\n// __________ (used to handle stuff like http://goo.gl/xmE5eg) issue #129\r\n// Storage.js\r\n\r\n/**\r\n * Storage is a standalone object used by {@link RecordRTC} to store reusable objects e.g. \"new AudioContext\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * Storage.AudioContext === webkitAudioContext\r\n * @property {webkitAudioContext} AudioContext - Keeps a reference to AudioContext object.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Storage = {};\r\n\r\nif (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n} else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Storage = Storage;\r\n}\n\r\nfunction isMediaRecorderCompatible() {\r\n if (isFirefox || isSafari || isEdge) {\r\n return true;\r\n }\r\n\r\n var nVer = navigator.appVersion;\r\n var nAgt = navigator.userAgent;\r\n var fullVersion = '' + parseFloat(navigator.appVersion);\r\n var majorVersion = parseInt(navigator.appVersion, 10);\r\n var nameOffset, verOffset, ix;\r\n\r\n if (isChrome || isOpera) {\r\n verOffset = nAgt.indexOf('Chrome');\r\n fullVersion = nAgt.substring(verOffset + 7);\r\n }\r\n\r\n // trim the fullVersion string at semicolon/space if present\r\n if ((ix = fullVersion.indexOf(';')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n if ((ix = fullVersion.indexOf(' ')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n majorVersion = parseInt('' + fullVersion, 10);\r\n\r\n if (isNaN(majorVersion)) {\r\n fullVersion = '' + parseFloat(navigator.appVersion);\r\n majorVersion = parseInt(navigator.appVersion, 10);\r\n }\r\n\r\n return majorVersion >= 49;\r\n}\n\r\n// ______________________\r\n// MediaStreamRecorder.js\r\n\r\n/**\r\n * MediaStreamRecorder is an abstraction layer for {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}. It is used by {@link RecordRTC} to record MediaStream(s) in both Chrome and Firefox.\r\n * @summary Runs top over {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://github.com/muaz-khan|Muaz Khan}\r\n * @typedef MediaStreamRecorder\r\n * @class\r\n * @example\r\n * var config = {\r\n * mimeType: 'video/webm', // vp8, vp9, h264, mkv, opus/vorbis\r\n * audioBitsPerSecond : 256 * 8 * 1024,\r\n * videoBitsPerSecond : 256 * 8 * 1024,\r\n * bitsPerSecond: 256 * 8 * 1024, // if this is provided, skip above two\r\n * checkForInactiveTracks: true,\r\n * timeSlice: 1000, // concatenate intervals based blobs\r\n * ondataavailable: function() {} // get intervals based blobs\r\n * }\r\n * var recorder = new MediaStreamRecorder(mediaStream, config);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs:true, initCallback: function, mimeType: \"video/webm\", timeSlice: 1000}\r\n * @throws Will throw an error if first argument \"MediaStream\" is missing. Also throws error if \"MediaRecorder API\" are not supported by the browser.\r\n */\r\n\r\nfunction MediaStreamRecorder(mediaStream, config) {\r\n var self = this;\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n if (typeof MediaRecorder === 'undefined') {\r\n throw 'Your browser does not support the Media Recorder API. Please try other modules e.g. WhammyRecorder or StereoAudioRecorder.';\r\n }\r\n\r\n config = config || {\r\n // bitsPerSecond: 256 * 8 * 1024,\r\n mimeType: 'video/webm'\r\n };\r\n\r\n if (config.type === 'audio') {\r\n if (getTracks(mediaStream, 'video').length && getTracks(mediaStream, 'audio').length) {\r\n var stream;\r\n if (!!navigator.mozGetUserMedia) {\r\n stream = new MediaStream();\r\n stream.addTrack(getTracks(mediaStream, 'audio')[0]);\r\n } else {\r\n // webkitMediaStream\r\n stream = new MediaStream(getTracks(mediaStream, 'audio'));\r\n }\r\n mediaStream = stream;\r\n }\r\n\r\n if (!config.mimeType || config.mimeType.toString().toLowerCase().indexOf('audio') === -1) {\r\n config.mimeType = isChrome ? 'audio/webm' : 'audio/ogg';\r\n }\r\n\r\n if (config.mimeType && config.mimeType.toString().toLowerCase() !== 'audio/ogg' && !!navigator.mozGetUserMedia) {\r\n // forcing better codecs on Firefox (via #166)\r\n config.mimeType = 'audio/ogg';\r\n }\r\n }\r\n\r\n var arrayOfBlobs = [];\r\n\r\n /**\r\n * This method returns array of blobs. Use only with \"timeSlice\". Its useful to preview recording anytime, without using the \"stop\" method.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var arrayOfBlobs = recorder.getArrayOfBlobs();\r\n * @returns {Array} Returns array of recorded blobs.\r\n */\r\n this.getArrayOfBlobs = function() {\r\n return arrayOfBlobs;\r\n };\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // set defaults\r\n self.blob = null;\r\n self.clearRecordedData();\r\n self.timestamps = [];\r\n allStates = [];\r\n arrayOfBlobs = [];\r\n\r\n var recorderHints = config;\r\n\r\n if (!config.disableLogs) {\r\n console.log('Passing following config over MediaRecorder API.', recorderHints);\r\n }\r\n\r\n if (mediaRecorder) {\r\n // mandatory to make sure Firefox doesn't fails to record streams 3-4 times without reloading the page.\r\n mediaRecorder = null;\r\n }\r\n\r\n if (isChrome && !isMediaRecorderCompatible()) {\r\n // to support video-only recording on stable\r\n recorderHints = 'video/vp8';\r\n }\r\n\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && recorderHints.mimeType) {\r\n if (!MediaRecorder.isTypeSupported(recorderHints.mimeType)) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n\r\n recorderHints.mimeType = config.type === 'audio' ? 'audio/webm' : 'video/webm';\r\n }\r\n }\r\n\r\n // using MediaRecorder API here\r\n try {\r\n mediaRecorder = new MediaRecorder(mediaStream, recorderHints);\r\n\r\n // reset\r\n config.mimeType = recorderHints.mimeType;\r\n } catch (e) {\r\n // chrome-based fallback\r\n mediaRecorder = new MediaRecorder(mediaStream);\r\n }\r\n\r\n // old hack?\r\n if (recorderHints.mimeType && !MediaRecorder.isTypeSupported && 'canRecordMimeType' in mediaRecorder && mediaRecorder.canRecordMimeType(recorderHints.mimeType) === false) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n }\r\n\r\n // Dispatching OnDataAvailable Handler\r\n mediaRecorder.ondataavailable = function(e) {\r\n if (e.data) {\r\n allStates.push('ondataavailable: ' + bytesToSize(e.data.size));\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n if (e.data && e.data.size) {\r\n arrayOfBlobs.push(e.data);\r\n updateTimeStamp();\r\n\r\n if (typeof config.ondataavailable === 'function') {\r\n // intervals based blobs\r\n var blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n config.ondataavailable(blob);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (!e.data || !e.data.size || e.data.size < 100 || self.blob) {\r\n // make sure that stopRecording always getting fired\r\n // even if there is invalid data\r\n if (self.recordingCallback) {\r\n self.recordingCallback(new Blob([], {\r\n type: getMimeType(recorderHints)\r\n }));\r\n self.recordingCallback = null;\r\n }\r\n return;\r\n }\r\n\r\n self.blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n\r\n if (self.recordingCallback) {\r\n self.recordingCallback(self.blob);\r\n self.recordingCallback = null;\r\n }\r\n };\r\n\r\n mediaRecorder.onstart = function() {\r\n allStates.push('started');\r\n };\r\n\r\n mediaRecorder.onpause = function() {\r\n allStates.push('paused');\r\n };\r\n\r\n mediaRecorder.onresume = function() {\r\n allStates.push('resumed');\r\n };\r\n\r\n mediaRecorder.onstop = function() {\r\n allStates.push('stopped');\r\n };\r\n\r\n mediaRecorder.onerror = function(error) {\r\n if (!error) {\r\n return;\r\n }\r\n\r\n if (!error.name) {\r\n error.name = 'UnknownError';\r\n }\r\n\r\n allStates.push('error: ' + error);\r\n\r\n if (!config.disableLogs) {\r\n // via: https://w3c.github.io/mediacapture-record/MediaRecorder.html#exception-summary\r\n if (error.name.toString().toLowerCase().indexOf('invalidstate') !== -1) {\r\n console.error('The MediaRecorder is not in a state in which the proposed operation is allowed to be executed.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('notsupported') !== -1) {\r\n console.error('MIME type (', recorderHints.mimeType, ') is not supported.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('security') !== -1) {\r\n console.error('MediaRecorder security error', error);\r\n }\r\n\r\n // older code below\r\n else if (error.name === 'OutOfMemory') {\r\n console.error('The UA has exhaused the available memory. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'IllegalStreamModification') {\r\n console.error('A modification to the stream has occurred that makes it impossible to continue recording. An example would be the addition of a Track while recording is occurring. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'OtherRecordingError') {\r\n console.error('Used for an fatal error other than those listed above. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'GenericError') {\r\n console.error('The UA cannot provide the codec or recording option that has been requested.', error);\r\n } else {\r\n console.error('MediaRecorder Error', error);\r\n }\r\n }\r\n\r\n (function(looper) {\r\n if (!self.manuallyStopped && mediaRecorder && mediaRecorder.state === 'inactive') {\r\n delete config.timeslice;\r\n\r\n // 10 minutes, enough?\r\n mediaRecorder.start(10 * 60 * 1000);\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000);\r\n })();\r\n\r\n if (mediaRecorder.state !== 'inactive' && mediaRecorder.state !== 'stopped') {\r\n mediaRecorder.stop();\r\n }\r\n };\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n updateTimeStamp();\r\n mediaRecorder.start(config.timeSlice);\r\n } else {\r\n // default is 60 minutes; enough?\r\n // use config => {timeSlice: 1000} otherwise\r\n\r\n mediaRecorder.start(3.6e+6);\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback(); // old code\r\n }\r\n };\r\n\r\n /**\r\n * @property {Array} timestamps - Array of time stamps\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * console.log(recorder.timestamps);\r\n */\r\n this.timestamps = [];\r\n\r\n function updateTimeStamp() {\r\n self.timestamps.push(new Date().getTime());\r\n\r\n if (typeof config.onTimeStamp === 'function') {\r\n config.onTimeStamp(self.timestamps[self.timestamps.length - 1], self.timestamps);\r\n }\r\n }\r\n\r\n function getMimeType(secondObject) {\r\n if (mediaRecorder && mediaRecorder.mimeType) {\r\n return mediaRecorder.mimeType;\r\n }\r\n\r\n return secondObject.mimeType || 'video/webm';\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n self.manuallyStopped = true; // used inside the mediaRecorder.onerror\r\n\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.recordingCallback = callback;\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.stop();\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n setTimeout(function() {\r\n self.blob = new Blob(arrayOfBlobs, {\r\n type: getMimeType(config)\r\n });\r\n\r\n self.recordingCallback(self.blob);\r\n }, 100);\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'paused') {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder && mediaRecorder.state === 'recording') {\r\n self.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n arrayOfBlobs = [];\r\n mediaRecorder = null;\r\n self.timestamps = [];\r\n }\r\n\r\n // Reference to \"MediaRecorder\" object\r\n var mediaRecorder;\r\n\r\n /**\r\n * Access to native MediaRecorder API\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @instance\r\n * @example\r\n * var internal = recorder.getInternalRecorder();\r\n * internal.ondataavailable = function() {}; // override\r\n * internal.stream, internal.onpause, internal.onstop, etc.\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n this.getInternalRecorder = function() {\r\n return mediaRecorder;\r\n };\r\n\r\n function isMediaStreamActive() {\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n\r\n\r\n /**\r\n * Get MediaRecorder readonly state.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n if (!mediaRecorder) {\r\n return 'inactive';\r\n }\r\n\r\n return mediaRecorder.state || 'inactive';\r\n };\r\n\r\n // list of all recording states\r\n var allStates = [];\r\n\r\n /**\r\n * Get MediaRecorder all recording states.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getAllStates();\r\n * @returns {Array} Returns all recording states\r\n */\r\n this.getAllStates = function() {\r\n return allStates;\r\n };\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = false; // disable to minimize CPU usage\r\n }\r\n\r\n var self = this;\r\n\r\n // this method checks if media stream is stopped\r\n // or if any track is ended.\r\n (function looper() {\r\n if (!mediaRecorder || config.checkForInactiveTracks === false) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n self.stop();\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000); // check every second\r\n })();\r\n\r\n // for debugging\r\n this.name = 'MediaStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MediaStreamRecorder = MediaStreamRecorder;\r\n}\r\n\r\n// source code from: http://typedarray.org/wp-content/projects/WebAudioRecorder/script.js\r\n// https://github.com/mattdiamond/Recorderjs#license-mit\r\n// ______________________\r\n// StereoAudioRecorder.js\r\n\r\n/**\r\n * StereoAudioRecorder is a standalone class used by {@link RecordRTC} to bring \"stereo\" audio-recording in chrome.\r\n * @summary JavaScript standalone object for stereo audio recording.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef StereoAudioRecorder\r\n * @class\r\n * @example\r\n * var recorder = new StereoAudioRecorder(MediaStream, {\r\n * sampleRate: 44100,\r\n * bufferSize: 4096\r\n * });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {sampleRate: 44100, bufferSize: 4096, numberOfAudioChannels: 1, etc.}\r\n */\r\n\r\nfunction StereoAudioRecorder(mediaStream, config) {\r\n if (!getTracks(mediaStream, 'audio').length) {\r\n throw 'Your stream has no audio tracks.';\r\n }\r\n\r\n config = config || {};\r\n\r\n var self = this;\r\n\r\n // variables\r\n var leftchannel = [];\r\n var rightchannel = [];\r\n var recording = false;\r\n var recordingLength = 0;\r\n var jsAudioNode;\r\n\r\n var numberOfAudioChannels = 2;\r\n\r\n /**\r\n * Set sample rates such as 8K or 16K. Reference: http://stackoverflow.com/a/28977136/552182\r\n * @property {number} desiredSampRate - Desired Bits per sample * 1000\r\n * @memberof StereoAudioRecorder\r\n * @instance\r\n * @example\r\n * var recorder = StereoAudioRecorder(mediaStream, {\r\n * desiredSampRate: 16 * 1000 // bits-per-sample * 1000\r\n * });\r\n */\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n // backward compatibility\r\n if (config.leftChannel === true) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (config.numberOfAudioChannels === 1) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (!numberOfAudioChannels || numberOfAudioChannels < 1) {\r\n numberOfAudioChannels = 2;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('StereoAudioRecorder is set to record number of channels: ' + numberOfAudioChannels);\r\n }\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = true;\r\n }\r\n\r\n function isMediaStreamActive() {\r\n if (config.checkForInactiveTracks === false) {\r\n // always return \"true\"\r\n return true;\r\n }\r\n\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n resetVariables();\r\n\r\n isAudioProcessStarted = isPaused = false;\r\n recording = true;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n looper();\r\n }\r\n };\r\n\r\n function mergeLeftRightBuffers(config, callback) {\r\n function mergeAudioBuffers(config, cb) {\r\n var numberOfAudioChannels = config.numberOfAudioChannels;\r\n\r\n // todo: \"slice(0)\" --- is it causes loop? Should be removed?\r\n var leftBuffers = config.leftBuffers.slice(0);\r\n var rightBuffers = config.rightBuffers.slice(0);\r\n var sampleRate = config.sampleRate;\r\n var internalInterleavedLength = config.internalInterleavedLength;\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n rightBuffers = mergeBuffers(rightBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n rightBuffers = interpolateArray(rightBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n // set sample rate as desired sample rate\r\n if (desiredSampRate) {\r\n sampleRate = desiredSampRate;\r\n }\r\n\r\n // for changing the sampling rate, reference:\r\n // http://stackoverflow.com/a/28977136/552182\r\n function interpolateArray(data, newSampleRate, oldSampleRate) {\r\n var fitCount = Math.round(data.length * (newSampleRate / oldSampleRate));\r\n var newData = [];\r\n var springFactor = Number((data.length - 1) / (fitCount - 1));\r\n newData[0] = data[0];\r\n for (var i = 1; i < fitCount - 1; i++) {\r\n var tmp = i * springFactor;\r\n var before = Number(Math.floor(tmp)).toFixed();\r\n var after = Number(Math.ceil(tmp)).toFixed();\r\n var atPoint = tmp - before;\r\n newData[i] = linearInterpolate(data[before], data[after], atPoint);\r\n }\r\n newData[fitCount - 1] = data[data.length - 1];\r\n return newData;\r\n }\r\n\r\n function linearInterpolate(before, after, atPoint) {\r\n return before + (after - before) * atPoint;\r\n }\r\n\r\n function mergeBuffers(channelBuffer, rLength) {\r\n var result = new Float64Array(rLength);\r\n var offset = 0;\r\n var lng = channelBuffer.length;\r\n\r\n for (var i = 0; i < lng; i++) {\r\n var buffer = channelBuffer[i];\r\n result.set(buffer, offset);\r\n offset += buffer.length;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function interleave(leftChannel, rightChannel) {\r\n var length = leftChannel.length + rightChannel.length;\r\n\r\n var result = new Float64Array(length);\r\n\r\n var inputIndex = 0;\r\n\r\n for (var index = 0; index < length;) {\r\n result[index++] = leftChannel[inputIndex];\r\n result[index++] = rightChannel[inputIndex];\r\n inputIndex++;\r\n }\r\n return result;\r\n }\r\n\r\n function writeUTFBytes(view, offset, string) {\r\n var lng = string.length;\r\n for (var i = 0; i < lng; i++) {\r\n view.setUint8(offset + i, string.charCodeAt(i));\r\n }\r\n }\r\n\r\n // interleave both channels together\r\n var interleaved;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n interleaved = interleave(leftBuffers, rightBuffers);\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n interleaved = leftBuffers;\r\n }\r\n\r\n var interleavedLength = interleaved.length;\r\n\r\n // create wav file\r\n var resultingBufferLength = 44 + interleavedLength * 2;\r\n\r\n var buffer = new ArrayBuffer(resultingBufferLength);\r\n\r\n var view = new DataView(buffer);\r\n\r\n // RIFF chunk descriptor/identifier \r\n writeUTFBytes(view, 0, 'RIFF');\r\n\r\n // RIFF chunk length\r\n // changed \"44\" to \"36\" via #401\r\n view.setUint32(4, 36 + interleavedLength * 2, true);\r\n\r\n // RIFF type \r\n writeUTFBytes(view, 8, 'WAVE');\r\n\r\n // format chunk identifier \r\n // FMT sub-chunk\r\n writeUTFBytes(view, 12, 'fmt ');\r\n\r\n // format chunk length \r\n view.setUint32(16, 16, true);\r\n\r\n // sample format (raw)\r\n view.setUint16(20, 1, true);\r\n\r\n // stereo (2 channels)\r\n view.setUint16(22, numberOfAudioChannels, true);\r\n\r\n // sample rate \r\n view.setUint32(24, sampleRate, true);\r\n\r\n // byte rate (sample rate * block align)\r\n view.setUint32(28, sampleRate * numberOfAudioChannels * 2, true);\r\n\r\n // block align (channel count * bytes per sample) \r\n view.setUint16(32, numberOfAudioChannels * 2, true);\r\n\r\n // bits per sample \r\n view.setUint16(34, 16, true);\r\n\r\n // data sub-chunk\r\n // data chunk identifier \r\n writeUTFBytes(view, 36, 'data');\r\n\r\n // data chunk length \r\n view.setUint32(40, interleavedLength * 2, true);\r\n\r\n // write the PCM samples\r\n var lng = interleavedLength;\r\n var index = 44;\r\n var volume = 1;\r\n for (var i = 0; i < lng; i++) {\r\n view.setInt16(index, interleaved[i] * (0x7FFF * volume), true);\r\n index += 2;\r\n }\r\n\r\n if (cb) {\r\n return cb({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n postMessage({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n if (config.noWorker) {\r\n mergeAudioBuffers(config, function(data) {\r\n callback(data.buffer, data.view);\r\n });\r\n return;\r\n }\r\n\r\n\r\n var webWorker = processInWebWorker(mergeAudioBuffers);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data.buffer, event.data.view);\r\n\r\n // release memory\r\n URL.revokeObjectURL(webWorker.workerURL);\r\n\r\n // kill webworker (or Chrome will kill your page after ~25 calls)\r\n webWorker.terminate();\r\n };\r\n\r\n webWorker.postMessage(config);\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var workerURL = URL.createObjectURL(new Blob([_function.toString(),\r\n ';this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(workerURL);\r\n worker.workerURL = workerURL;\r\n return worker;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n // stop recording\r\n recording = false;\r\n\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: recordingLength,\r\n leftBuffers: leftchannel,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : rightchannel,\r\n noWorker: config.noWorker\r\n }, function(buffer, view) {\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n self.blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n\r\n /**\r\n * @property {ArrayBuffer} buffer - The recorded buffer object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var buffer = recorder.buffer;\r\n * });\r\n */\r\n self.buffer = new ArrayBuffer(view.buffer.byteLength);\r\n\r\n /**\r\n * @property {DataView} view - The recorded data-view object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var view = recorder.view;\r\n * });\r\n */\r\n self.view = view;\r\n\r\n self.sampleRate = desiredSampRate || sampleRate;\r\n self.bufferSize = bufferSize;\r\n\r\n // recorded audio length\r\n self.length = recordingLength;\r\n\r\n isAudioProcessStarted = false;\r\n\r\n if (callback) {\r\n callback(self.blob);\r\n }\r\n });\r\n };\r\n\r\n if (typeof RecordRTC.Storage === 'undefined') {\r\n RecordRTC.Storage = {\r\n AudioContextConstructor: null,\r\n AudioContext: window.AudioContext || window.webkitAudioContext\r\n };\r\n }\r\n\r\n if (!RecordRTC.Storage.AudioContextConstructor || RecordRTC.Storage.AudioContextConstructor.state === 'closed') {\r\n RecordRTC.Storage.AudioContextConstructor = new RecordRTC.Storage.AudioContext();\r\n }\r\n\r\n var context = RecordRTC.Storage.AudioContextConstructor;\r\n\r\n // creates an audio node from the microphone incoming stream\r\n var audioInput = context.createMediaStreamSource(mediaStream);\r\n\r\n var legalBufferValues = [0, 256, 512, 1024, 2048, 4096, 8192, 16384];\r\n\r\n /**\r\n * From the spec: This value controls how frequently the audioprocess event is\r\n * dispatched and how many sample-frames need to be processed each call.\r\n * Lower values for buffer size will result in a lower (better) latency.\r\n * Higher values will be necessary to avoid audio breakup and glitches\r\n * The size of the buffer (in sample-frames) which needs to\r\n * be processed each time onprocessaudio is called.\r\n * Legal values are (256, 512, 1024, 2048, 4096, 8192, 16384).\r\n * @property {number} bufferSize - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * bufferSize: 4096\r\n * });\r\n */\r\n\r\n // \"0\" means, let chrome decide the most accurate buffer-size for current platform.\r\n var bufferSize = typeof config.bufferSize === 'undefined' ? 4096 : config.bufferSize;\r\n\r\n if (legalBufferValues.indexOf(bufferSize) === -1) {\r\n if (!config.disableLogs) {\r\n console.log('Legal values for buffer-size are ' + JSON.stringify(legalBufferValues, null, '\\t'));\r\n }\r\n }\r\n\r\n if (context.createJavaScriptNode) {\r\n jsAudioNode = context.createJavaScriptNode(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else if (context.createScriptProcessor) {\r\n jsAudioNode = context.createScriptProcessor(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else {\r\n throw 'WebAudio API has no support on this browser.';\r\n }\r\n\r\n // connect the stream to the script processor\r\n audioInput.connect(jsAudioNode);\r\n\r\n if (!config.bufferSize) {\r\n bufferSize = jsAudioNode.bufferSize; // device buffer-size\r\n }\r\n\r\n /**\r\n * The sample rate (in sample-frames per second) at which the\r\n * AudioContext handles audio. It is assumed that all AudioNodes\r\n * in the context run at this rate. In making this assumption,\r\n * sample-rate converters or \"varispeed\" processors are not supported\r\n * in real-time processing.\r\n * The sampleRate parameter describes the sample-rate of the\r\n * linear PCM audio data in the buffer in sample-frames per second.\r\n * An implementation must support sample-rates in at least\r\n * the range 22050 to 96000.\r\n * @property {number} sampleRate - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * sampleRate: 44100\r\n * });\r\n */\r\n var sampleRate = typeof config.sampleRate !== 'undefined' ? config.sampleRate : context.sampleRate || 44100;\r\n\r\n if (sampleRate < 22050 || sampleRate > 96000) {\r\n // Ref: http://stackoverflow.com/a/26303918/552182\r\n if (!config.disableLogs) {\r\n console.log('sample-rate must be under range 22050 and 96000.');\r\n }\r\n }\r\n\r\n if (!config.disableLogs) {\r\n if (config.desiredSampRate) {\r\n console.log('Desired sample-rate: ' + config.desiredSampRate);\r\n }\r\n }\r\n\r\n var isPaused = false;\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n if (!recording) {\r\n if (!config.disableLogs) {\r\n console.log('Seems recording has been restarted.');\r\n }\r\n this.record();\r\n return;\r\n }\r\n\r\n isPaused = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n config.checkForInactiveTracks = false;\r\n\r\n if (recording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function resetVariables() {\r\n leftchannel = [];\r\n rightchannel = [];\r\n recordingLength = 0;\r\n isAudioProcessStarted = false;\r\n recording = false;\r\n isPaused = false;\r\n context = null;\r\n\r\n self.leftchannel = leftchannel;\r\n self.rightchannel = rightchannel;\r\n self.numberOfAudioChannels = numberOfAudioChannels;\r\n self.desiredSampRate = desiredSampRate;\r\n self.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n }\r\n\r\n function clearRecordedDataCB() {\r\n if (jsAudioNode) {\r\n jsAudioNode.onaudioprocess = null;\r\n jsAudioNode.disconnect();\r\n jsAudioNode = null;\r\n }\r\n\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n\r\n resetVariables();\r\n }\r\n\r\n // for debugging\r\n this.name = 'StereoAudioRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var isAudioProcessStarted = false;\r\n\r\n function onAudioProcessDataAvailable(e) {\r\n if (isPaused) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n jsAudioNode.disconnect();\r\n recording = false;\r\n }\r\n\r\n if (!recording) {\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n return;\r\n }\r\n\r\n /**\r\n * This method is called on \"onaudioprocess\" event's first invocation.\r\n * @method {function} onAudioProcessStarted\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.onAudioProcessStarted: function() { };\r\n */\r\n if (!isAudioProcessStarted) {\r\n isAudioProcessStarted = true;\r\n if (config.onAudioProcessStarted) {\r\n config.onAudioProcessStarted();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n }\r\n\r\n var left = e.inputBuffer.getChannelData(0);\r\n\r\n // we clone the samples\r\n var chLeft = new Float32Array(left);\r\n leftchannel.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n var right = e.inputBuffer.getChannelData(1);\r\n var chRight = new Float32Array(right);\r\n rightchannel.push(chRight);\r\n }\r\n\r\n recordingLength += bufferSize;\r\n\r\n // export raw PCM\r\n self.recordingLength = recordingLength;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n intervalsBasedBuffers.recordingLength += bufferSize;\r\n intervalsBasedBuffers.left.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n intervalsBasedBuffers.right.push(chRight);\r\n }\r\n }\r\n }\r\n\r\n jsAudioNode.onaudioprocess = onAudioProcessDataAvailable;\r\n\r\n // to prevent self audio to be connected with speakers\r\n if (context.createMediaStreamDestination) {\r\n jsAudioNode.connect(context.createMediaStreamDestination());\r\n } else {\r\n jsAudioNode.connect(context.destination);\r\n }\r\n\r\n // export raw PCM\r\n this.leftchannel = leftchannel;\r\n this.rightchannel = rightchannel;\r\n this.numberOfAudioChannels = numberOfAudioChannels;\r\n this.desiredSampRate = desiredSampRate;\r\n this.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n // helper for intervals based blobs\r\n var intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n\r\n // this looper is used to support intervals based blobs (via timeSlice+ondataavailable)\r\n function looper() {\r\n if (!recording || typeof config.ondataavailable !== 'function' || typeof config.timeSlice === 'undefined') {\r\n return;\r\n }\r\n\r\n if (intervalsBasedBuffers.left.length) {\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: intervalsBasedBuffers.recordingLength,\r\n leftBuffers: intervalsBasedBuffers.left,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : intervalsBasedBuffers.right\r\n }, function(buffer, view) {\r\n var blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n config.ondataavailable(blob);\r\n\r\n setTimeout(looper, config.timeSlice);\r\n });\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n } else {\r\n setTimeout(looper, config.timeSlice);\r\n }\r\n }\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.StereoAudioRecorder = StereoAudioRecorder;\r\n}\r\n\r\n// _________________\r\n// CanvasRecorder.js\r\n\r\n/**\r\n * CanvasRecorder is a standalone class used by {@link RecordRTC} to bring HTML5-Canvas recording into video WebM. It uses HTML2Canvas library and runs top over {@link Whammy}.\r\n * @summary HTML2Canvas recording into video WebM.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef CanvasRecorder\r\n * @class\r\n * @example\r\n * var recorder = new CanvasRecorder(htmlElement, { disableLogs: true, useWhammyRecorder: true });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {HTMLElement} htmlElement - querySelector/getElementById/getElementsByTagName[0]/etc.\r\n * @param {object} config - {disableLogs:true, initCallback: function}\r\n */\r\n\r\nfunction CanvasRecorder(htmlElement, config) {\r\n if (typeof html2canvas === 'undefined') {\r\n throw 'Please link: https://www.webrtc-experiment.com/screenshot.js';\r\n }\r\n\r\n config = config || {};\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n // via DetectRTC.js\r\n var isCanvasSupportsStreamCapturing = false;\r\n ['captureStream', 'mozCaptureStream', 'webkitCaptureStream'].forEach(function(item) {\r\n if (item in document.createElement('canvas')) {\r\n isCanvasSupportsStreamCapturing = true;\r\n }\r\n });\r\n\r\n var _isChrome = (!!window.webkitRTCPeerConnection || !!window.webkitGetUserMedia) && !!window.chrome;\r\n\r\n var chromeVersion = 50;\r\n var matchArray = navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\r\n if (_isChrome && matchArray && matchArray[2]) {\r\n chromeVersion = parseInt(matchArray[2], 10);\r\n }\r\n\r\n if (_isChrome && chromeVersion < 52) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n if (config.useWhammyRecorder) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n var globalCanvas, mediaStreamRecorder;\r\n\r\n if (isCanvasSupportsStreamCapturing) {\r\n if (!config.disableLogs) {\r\n console.log('Your browser supports both MediRecorder API and canvas.captureStream!');\r\n }\r\n\r\n if (htmlElement instanceof HTMLCanvasElement) {\r\n globalCanvas = htmlElement;\r\n } else if (htmlElement instanceof CanvasRenderingContext2D) {\r\n globalCanvas = htmlElement.canvas;\r\n } else {\r\n throw 'Please pass either HTMLCanvasElement or CanvasRenderingContext2D.';\r\n }\r\n } else if (!!navigator.mozGetUserMedia) {\r\n if (!config.disableLogs) {\r\n console.error('Canvas recording is NOT supported in Firefox.');\r\n }\r\n }\r\n\r\n var isRecording;\r\n\r\n /**\r\n * This method records Canvas.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n isRecording = true;\r\n\r\n if (isCanvasSupportsStreamCapturing && !config.useWhammyRecorder) {\r\n // CanvasCaptureMediaStream\r\n var canvasMediaStream;\r\n if ('captureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.captureStream(25); // 25 FPS\r\n } else if ('mozCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.mozCaptureStream(25);\r\n } else if ('webkitCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.webkitCaptureStream(25);\r\n }\r\n\r\n try {\r\n var mdStream = new MediaStream();\r\n mdStream.addTrack(getTracks(canvasMediaStream, 'video')[0]);\r\n canvasMediaStream = mdStream;\r\n } catch (e) {}\r\n\r\n if (!canvasMediaStream) {\r\n throw 'captureStream API are NOT available.';\r\n }\r\n\r\n // Note: Jan 18, 2016 status is that, \r\n // Firefox MediaRecorder API can't record CanvasCaptureMediaStream object.\r\n mediaStreamRecorder = new MediaStreamRecorder(canvasMediaStream, {\r\n mimeType: config.mimeType || 'video/webm'\r\n });\r\n mediaStreamRecorder.record();\r\n } else {\r\n whammy.frames = [];\r\n lastTime = new Date().getTime();\r\n drawCanvasFrame();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n this.getWebPImages = function(callback) {\r\n if (htmlElement.nodeName.toLowerCase() !== 'canvas') {\r\n callback();\r\n return;\r\n }\r\n\r\n var framesLength = whammy.frames.length;\r\n whammy.frames.forEach(function(frame, idx) {\r\n var framesRemaining = framesLength - idx;\r\n if (!config.disableLogs) {\r\n console.log(framesRemaining + '/' + framesLength + ' frames remaining');\r\n }\r\n\r\n if (config.onEncodingCallback) {\r\n config.onEncodingCallback(framesRemaining, framesLength);\r\n }\r\n\r\n var webp = frame.image.toDataURL('image/webp', 1);\r\n whammy.frames[idx].image = webp;\r\n });\r\n\r\n if (!config.disableLogs) {\r\n console.log('Generating WebM');\r\n }\r\n\r\n callback();\r\n };\r\n\r\n /**\r\n * This method stops recording Canvas.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n isRecording = false;\r\n\r\n var that = this;\r\n\r\n if (isCanvasSupportsStreamCapturing && mediaStreamRecorder) {\r\n mediaStreamRecorder.stop(callback);\r\n return;\r\n }\r\n\r\n this.getWebPImages(function() {\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n if (!config.disableLogs) {\r\n console.log('Recording finished!');\r\n }\r\n\r\n that.blob = blob;\r\n\r\n if (that.blob.forEach) {\r\n that.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(that.blob);\r\n }\r\n\r\n whammy.frames = [];\r\n });\r\n });\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.pause();\r\n return;\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.resume();\r\n return;\r\n }\r\n\r\n if (!isRecording) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (isRecording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isRecording = false;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'CanvasRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n function cloneCanvas() {\r\n //create a new canvas\r\n var newCanvas = document.createElement('canvas');\r\n var context = newCanvas.getContext('2d');\r\n\r\n //set dimensions\r\n newCanvas.width = htmlElement.width;\r\n newCanvas.height = htmlElement.height;\r\n\r\n //apply the old canvas to the new one\r\n context.drawImage(htmlElement, 0, 0);\r\n\r\n //return the new canvas\r\n return newCanvas;\r\n }\r\n\r\n function drawCanvasFrame() {\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawCanvasFrame, 500);\r\n }\r\n\r\n if (htmlElement.nodeName.toLowerCase() === 'canvas') {\r\n var duration = new Date().getTime() - lastTime;\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: cloneCanvas(),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n return;\r\n }\r\n\r\n html2canvas(htmlElement, {\r\n grabMouse: typeof config.showMousePointer === 'undefined' || config.showMousePointer,\r\n onrendered: function(canvas) {\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: canvas.toDataURL('image/webp', 1),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n }\r\n });\r\n }\r\n\r\n var lastTime = new Date().getTime();\r\n\r\n var whammy = new Whammy.Video(100);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.CanvasRecorder = CanvasRecorder;\r\n}\n\r\n// _________________\r\n// WhammyRecorder.js\r\n\r\n/**\r\n * WhammyRecorder is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It runs top over {@link Whammy}.\r\n * @summary Video recording feature in Chrome.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WhammyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WhammyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs: true, initCallback: function, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction WhammyRecorder(mediaStream, config) {\r\n\r\n config = config || {};\r\n\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Using frames-interval:', config.frameInterval);\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (!config.width) {\r\n config.width = 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n context = canvas.getContext('2d');\r\n\r\n // setting defaults\r\n if (config.video && config.video instanceof HTMLVideoElement) {\r\n video = config.video.cloneNode();\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n } else {\r\n video = document.createElement('video');\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.onloadedmetadata = function() { // \"onloadedmetadata\" may NOT work in FF?\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n video.width = config.video.width;\r\n video.height = config.video.height;\r\n }\r\n\r\n video.muted = true;\r\n video.play();\r\n\r\n lastTime = new Date().getTime();\r\n whammy = new Whammy.Video();\r\n\r\n if (!config.disableLogs) {\r\n console.log('canvas resolutions', canvas.width, '*', canvas.height);\r\n console.log('video width/height', video.width || canvas.width, '*', video.height || canvas.height);\r\n }\r\n\r\n drawFrames(config.frameInterval);\r\n };\r\n\r\n /**\r\n * Draw and push frames to Whammy\r\n * @param {integer} frameInterval - set minimum interval (in milliseconds) between each time we push a frame to Whammy\r\n */\r\n function drawFrames(frameInterval) {\r\n frameInterval = typeof frameInterval !== 'undefined' ? frameInterval : 10;\r\n\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawFrames, 100);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n if (video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n whammy.frames.push({\r\n duration: duration,\r\n image: canvas.toDataURL('image/webp')\r\n });\r\n\r\n if (!isStopDrawing) {\r\n setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n }\r\n\r\n function asyncLoop(o) {\r\n var i = -1,\r\n length = o.length;\r\n\r\n (function loop() {\r\n i++;\r\n if (i === length) {\r\n o.callback();\r\n return;\r\n }\r\n\r\n // \"setTimeout\" added by Jim McLeod\r\n setTimeout(function() {\r\n o.functionToLoop(loop, i);\r\n }, 1);\r\n })();\r\n }\r\n\r\n\r\n /**\r\n * remove black frames from the beginning to the specified frame\r\n * @param {Array} _frames - array of frames to be checked\r\n * @param {number} _framesToCheck - number of frame until check will be executed (-1 - will drop all frames until frame not matched will be found)\r\n * @param {number} _pixTolerance - 0 - very strict (only black pixel color) ; 1 - all\r\n * @param {number} _frameTolerance - 0 - very strict (only black frame color) ; 1 - all\r\n * @returns {Array} - array of frames\r\n */\r\n // pull#293 by @volodalexey\r\n function dropBlackFrames(_frames, _framesToCheck, _pixTolerance, _frameTolerance, callback) {\r\n var localCanvas = document.createElement('canvas');\r\n localCanvas.width = canvas.width;\r\n localCanvas.height = canvas.height;\r\n var context2d = localCanvas.getContext('2d');\r\n var resultFrames = [];\r\n\r\n var checkUntilNotBlack = _framesToCheck === -1;\r\n var endCheckFrame = (_framesToCheck && _framesToCheck > 0 && _framesToCheck <= _frames.length) ?\r\n _framesToCheck : _frames.length;\r\n var sampleColor = {\r\n r: 0,\r\n g: 0,\r\n b: 0\r\n };\r\n var maxColorDifference = Math.sqrt(\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2)\r\n );\r\n var pixTolerance = _pixTolerance && _pixTolerance >= 0 && _pixTolerance <= 1 ? _pixTolerance : 0;\r\n var frameTolerance = _frameTolerance && _frameTolerance >= 0 && _frameTolerance <= 1 ? _frameTolerance : 0;\r\n var doNotCheckNext = false;\r\n\r\n asyncLoop({\r\n length: endCheckFrame,\r\n functionToLoop: function(loop, f) {\r\n var matchPixCount, endPixCheck, maxPixCount;\r\n\r\n var finishImage = function() {\r\n if (!doNotCheckNext && maxPixCount - matchPixCount <= maxPixCount * frameTolerance) {\r\n // console.log('removed black frame : ' + f + ' ; frame duration ' + _frames[f].duration);\r\n } else {\r\n // console.log('frame is passed : ' + f);\r\n if (checkUntilNotBlack) {\r\n doNotCheckNext = true;\r\n }\r\n resultFrames.push(_frames[f]);\r\n }\r\n loop();\r\n };\r\n\r\n if (!doNotCheckNext) {\r\n var image = new Image();\r\n image.onload = function() {\r\n context2d.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n var imageData = context2d.getImageData(0, 0, canvas.width, canvas.height);\r\n matchPixCount = 0;\r\n endPixCheck = imageData.data.length;\r\n maxPixCount = imageData.data.length / 4;\r\n\r\n for (var pix = 0; pix < endPixCheck; pix += 4) {\r\n var currentColor = {\r\n r: imageData.data[pix],\r\n g: imageData.data[pix + 1],\r\n b: imageData.data[pix + 2]\r\n };\r\n var colorDifference = Math.sqrt(\r\n Math.pow(currentColor.r - sampleColor.r, 2) +\r\n Math.pow(currentColor.g - sampleColor.g, 2) +\r\n Math.pow(currentColor.b - sampleColor.b, 2)\r\n );\r\n // difference in color it is difference in color vectors (r1,g1,b1) <=> (r2,g2,b2)\r\n if (colorDifference <= maxColorDifference * pixTolerance) {\r\n matchPixCount++;\r\n }\r\n }\r\n finishImage();\r\n };\r\n image.src = _frames[f].image;\r\n } else {\r\n finishImage();\r\n }\r\n },\r\n callback: function() {\r\n resultFrames = resultFrames.concat(_frames.slice(endCheckFrame));\r\n\r\n if (resultFrames.length <= 0) {\r\n // at least one last frame should be available for next manipulation\r\n // if total duration of all frames will be < 1000 than ffmpeg doesn't work well...\r\n resultFrames.push(_frames[_frames.length - 1]);\r\n }\r\n callback(resultFrames);\r\n }\r\n });\r\n }\r\n\r\n var isStopDrawing = false;\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n isStopDrawing = true;\r\n\r\n var _this = this;\r\n // analyse of all frames takes some time!\r\n setTimeout(function() {\r\n // e.g. dropBlackFrames(frames, 10, 1, 1) - will cut all 10 frames\r\n // e.g. dropBlackFrames(frames, 10, 0.5, 0.5) - will analyse 10 frames\r\n // e.g. dropBlackFrames(frames, 10) === dropBlackFrames(frames, 10, 0, 0) - will analyse 10 frames with strict black color\r\n dropBlackFrames(whammy.frames, -1, null, null, function(frames) {\r\n whammy.frames = frames;\r\n\r\n // to display advertisement images!\r\n if (config.advertisement && config.advertisement.length) {\r\n whammy.frames = config.advertisement.concat(whammy.frames);\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n _this.blob = blob;\r\n\r\n if (_this.blob.forEach) {\r\n _this.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(_this.blob);\r\n }\r\n });\r\n });\r\n }, 10);\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (isStopDrawing) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (!isStopDrawing) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isStopDrawing = true;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'WhammyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n var video;\r\n var lastTime;\r\n var whammy;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WhammyRecorder = WhammyRecorder;\r\n}\n\r\n// https://github.com/antimatter15/whammy/blob/master/LICENSE\r\n// _________\r\n// Whammy.js\r\n\r\n// todo: Firefox now supports webp for webm containers!\r\n// their MediaRecorder implementation works well!\r\n// should we provide an option to record via Whammy.js or MediaRecorder API is a better solution?\r\n\r\n/**\r\n * Whammy is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It is written by {@link https://github.com/antimatter15|antimatter15}\r\n * @summary A real time javascript webm encoder based on a canvas hack.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef Whammy\r\n * @class\r\n * @example\r\n * var recorder = new Whammy().Video(15);\r\n * recorder.add(context || canvas || dataURL);\r\n * var output = recorder.compile();\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Whammy = (function() {\r\n // a more abstract-ish API\r\n\r\n function WhammyVideo(duration) {\r\n this.frames = [];\r\n this.duration = duration || 1;\r\n this.quality = 0.8;\r\n }\r\n\r\n /**\r\n * Pass Canvas or Context or image/webp(string) to {@link Whammy} encoder.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.add(canvas || context || 'image/webp');\r\n * @param {string} frame - Canvas || Context || image/webp\r\n * @param {number} duration - Stick a duration (in milliseconds)\r\n */\r\n WhammyVideo.prototype.add = function(frame, duration) {\r\n if ('canvas' in frame) { //CanvasRenderingContext2D\r\n frame = frame.canvas;\r\n }\r\n\r\n if ('toDataURL' in frame) {\r\n frame = frame.toDataURL('image/webp', this.quality);\r\n }\r\n\r\n if (!(/^data:image\\/webp;base64,/ig).test(frame)) {\r\n throw 'Input must be formatted properly as a base64 encoded DataURI of type image/webp';\r\n }\r\n this.frames.push({\r\n image: frame,\r\n duration: duration || this.duration\r\n });\r\n };\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n\r\n function whammyInWebWorker(frames) {\r\n function ArrayToWebM(frames) {\r\n var info = checkFrames(frames);\r\n if (!info) {\r\n return [];\r\n }\r\n\r\n var clusterMaxDuration = 30000;\r\n\r\n var EBML = [{\r\n 'id': 0x1a45dfa3, // EBML\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0x4286 // EBMLVersion\r\n }, {\r\n 'data': 1,\r\n 'id': 0x42f7 // EBMLReadVersion\r\n }, {\r\n 'data': 4,\r\n 'id': 0x42f2 // EBMLMaxIDLength\r\n }, {\r\n 'data': 8,\r\n 'id': 0x42f3 // EBMLMaxSizeLength\r\n }, {\r\n 'data': 'webm',\r\n 'id': 0x4282 // DocType\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4287 // DocTypeVersion\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4285 // DocTypeReadVersion\r\n }]\r\n }, {\r\n 'id': 0x18538067, // Segment\r\n 'data': [{\r\n 'id': 0x1549a966, // Info\r\n 'data': [{\r\n 'data': 1e6, //do things in millisecs (num of nanosecs for duration scale)\r\n 'id': 0x2ad7b1 // TimecodeScale\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x4d80 // MuxingApp\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x5741 // WritingApp\r\n }, {\r\n 'data': doubleToString(info.duration),\r\n 'id': 0x4489 // Duration\r\n }]\r\n }, {\r\n 'id': 0x1654ae6b, // Tracks\r\n 'data': [{\r\n 'id': 0xae, // TrackEntry\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0xd7 // TrackNumber\r\n }, {\r\n 'data': 1,\r\n 'id': 0x73c5 // TrackUID\r\n }, {\r\n 'data': 0,\r\n 'id': 0x9c // FlagLacing\r\n }, {\r\n 'data': 'und',\r\n 'id': 0x22b59c // Language\r\n }, {\r\n 'data': 'V_VP8',\r\n 'id': 0x86 // CodecID\r\n }, {\r\n 'data': 'VP8',\r\n 'id': 0x258688 // CodecName\r\n }, {\r\n 'data': 1,\r\n 'id': 0x83 // TrackType\r\n }, {\r\n 'id': 0xe0, // Video\r\n 'data': [{\r\n 'data': info.width,\r\n 'id': 0xb0 // PixelWidth\r\n }, {\r\n 'data': info.height,\r\n 'id': 0xba // PixelHeight\r\n }]\r\n }]\r\n }]\r\n }]\r\n }];\r\n\r\n //Generate clusters (max duration)\r\n var frameNumber = 0;\r\n var clusterTimecode = 0;\r\n while (frameNumber < frames.length) {\r\n\r\n var clusterFrames = [];\r\n var clusterDuration = 0;\r\n do {\r\n clusterFrames.push(frames[frameNumber]);\r\n clusterDuration += frames[frameNumber].duration;\r\n frameNumber++;\r\n } while (frameNumber < frames.length && clusterDuration < clusterMaxDuration);\r\n\r\n var clusterCounter = 0;\r\n var cluster = {\r\n 'id': 0x1f43b675, // Cluster\r\n 'data': getClusterData(clusterTimecode, clusterCounter, clusterFrames)\r\n }; //Add cluster to segment\r\n EBML[1].data.push(cluster);\r\n clusterTimecode += clusterDuration;\r\n }\r\n\r\n return generateEBML(EBML);\r\n }\r\n\r\n function getClusterData(clusterTimecode, clusterCounter, clusterFrames) {\r\n return [{\r\n 'data': clusterTimecode,\r\n 'id': 0xe7 // Timecode\r\n }].concat(clusterFrames.map(function(webp) {\r\n var block = makeSimpleBlock({\r\n discardable: 0,\r\n frame: webp.data.slice(4),\r\n invisible: 0,\r\n keyframe: 1,\r\n lacing: 0,\r\n trackNum: 1,\r\n timecode: Math.round(clusterCounter)\r\n });\r\n clusterCounter += webp.duration;\r\n return {\r\n data: block,\r\n id: 0xa3\r\n };\r\n }));\r\n }\r\n\r\n // sums the lengths of all the frames and gets the duration\r\n\r\n function checkFrames(frames) {\r\n if (!frames[0]) {\r\n postMessage({\r\n error: 'Something went wrong. Maybe WebP format is not supported in the current browser.'\r\n });\r\n return;\r\n }\r\n\r\n var width = frames[0].width,\r\n height = frames[0].height,\r\n duration = frames[0].duration;\r\n\r\n for (var i = 1; i < frames.length; i++) {\r\n duration += frames[i].duration;\r\n }\r\n return {\r\n duration: duration,\r\n width: width,\r\n height: height\r\n };\r\n }\r\n\r\n function numToBuffer(num) {\r\n var parts = [];\r\n while (num > 0) {\r\n parts.push(num & 0xff);\r\n num = num >> 8;\r\n }\r\n return new Uint8Array(parts.reverse());\r\n }\r\n\r\n function strToBuffer(str) {\r\n return new Uint8Array(str.split('').map(function(e) {\r\n return e.charCodeAt(0);\r\n }));\r\n }\r\n\r\n function bitsToBuffer(bits) {\r\n var data = [];\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data.push(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return new Uint8Array(data);\r\n }\r\n\r\n function generateEBML(json) {\r\n var ebml = [];\r\n for (var i = 0; i < json.length; i++) {\r\n var data = json[i].data;\r\n\r\n if (typeof data === 'object') {\r\n data = generateEBML(data);\r\n }\r\n\r\n if (typeof data === 'number') {\r\n data = bitsToBuffer(data.toString(2));\r\n }\r\n\r\n if (typeof data === 'string') {\r\n data = strToBuffer(data);\r\n }\r\n\r\n var len = data.size || data.byteLength || data.length;\r\n var zeroes = Math.ceil(Math.ceil(Math.log(len) / Math.log(2)) / 8);\r\n var sizeToString = len.toString(2);\r\n var padded = (new Array((zeroes * 7 + 7 + 1) - sizeToString.length)).join('0') + sizeToString;\r\n var size = (new Array(zeroes)).join('0') + '1' + padded;\r\n\r\n ebml.push(numToBuffer(json[i].id));\r\n ebml.push(bitsToBuffer(size));\r\n ebml.push(data);\r\n }\r\n\r\n return new Blob(ebml, {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n function toBinStrOld(bits) {\r\n var data = '';\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data += String.fromCharCode(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return data;\r\n }\r\n\r\n function makeSimpleBlock(data) {\r\n var flags = 0;\r\n\r\n if (data.keyframe) {\r\n flags |= 128;\r\n }\r\n\r\n if (data.invisible) {\r\n flags |= 8;\r\n }\r\n\r\n if (data.lacing) {\r\n flags |= (data.lacing << 1);\r\n }\r\n\r\n if (data.discardable) {\r\n flags |= 1;\r\n }\r\n\r\n if (data.trackNum > 127) {\r\n throw 'TrackNumber > 127 not supported';\r\n }\r\n\r\n var out = [data.trackNum | 0x80, data.timecode >> 8, data.timecode & 0xff, flags].map(function(e) {\r\n return String.fromCharCode(e);\r\n }).join('') + data.frame;\r\n\r\n return out;\r\n }\r\n\r\n function parseWebP(riff) {\r\n var VP8 = riff.RIFF[0].WEBP[0];\r\n\r\n var frameStart = VP8.indexOf('\\x9d\\x01\\x2a'); // A VP8 keyframe starts with the 0x9d012a header\r\n for (var i = 0, c = []; i < 4; i++) {\r\n c[i] = VP8.charCodeAt(frameStart + 3 + i);\r\n }\r\n\r\n var width, height, tmp;\r\n\r\n //the code below is literally copied verbatim from the bitstream spec\r\n tmp = (c[1] << 8) | c[0];\r\n width = tmp & 0x3FFF;\r\n tmp = (c[3] << 8) | c[2];\r\n height = tmp & 0x3FFF;\r\n return {\r\n width: width,\r\n height: height,\r\n data: VP8,\r\n riff: riff\r\n };\r\n }\r\n\r\n function getStrLength(string, offset) {\r\n return parseInt(string.substr(offset + 4, 4).split('').map(function(i) {\r\n var unpadded = i.charCodeAt(0).toString(2);\r\n return (new Array(8 - unpadded.length + 1)).join('0') + unpadded;\r\n }).join(''), 2);\r\n }\r\n\r\n function parseRIFF(string) {\r\n var offset = 0;\r\n var chunks = {};\r\n\r\n while (offset < string.length) {\r\n var id = string.substr(offset, 4);\r\n var len = getStrLength(string, offset);\r\n var data = string.substr(offset + 4 + 4, len);\r\n offset += 4 + 4 + len;\r\n chunks[id] = chunks[id] || [];\r\n\r\n if (id === 'RIFF' || id === 'LIST') {\r\n chunks[id].push(parseRIFF(data));\r\n } else {\r\n chunks[id].push(data);\r\n }\r\n }\r\n return chunks;\r\n }\r\n\r\n function doubleToString(num) {\r\n return [].slice.call(\r\n new Uint8Array((new Float64Array([num])).buffer), 0).map(function(e) {\r\n return String.fromCharCode(e);\r\n }).reverse().join('');\r\n }\r\n\r\n var webm = new ArrayToWebM(frames.map(function(frame) {\r\n var webp = parseWebP(parseRIFF(atob(frame.image.slice(23))));\r\n webp.duration = frame.duration;\r\n return webp;\r\n }));\r\n\r\n postMessage(webm);\r\n }\r\n\r\n /**\r\n * Encodes frames in WebM container. It uses WebWorkinvoke to invoke 'ArrayToWebM' method.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.compile(function(blob) {\r\n * // blob.size - blob.type\r\n * });\r\n */\r\n WhammyVideo.prototype.compile = function(callback) {\r\n var webWorker = processInWebWorker(whammyInWebWorker);\r\n\r\n webWorker.onmessage = function(event) {\r\n if (event.data.error) {\r\n console.error(event.data.error);\r\n return;\r\n }\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(this.frames);\r\n };\r\n\r\n return {\r\n /**\r\n * A more abstract-ish API.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * @param {?number} speed - 0.8\r\n * @param {?number} quality - 100\r\n */\r\n Video: WhammyVideo\r\n };\r\n})();\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Whammy = Whammy;\r\n}\n\r\n// ______________ (indexed-db)\r\n// DiskStorage.js\r\n\r\n/**\r\n * DiskStorage is a standalone object used by {@link RecordRTC} to store recorded blobs in IndexedDB storage.\r\n * @summary Writing blobs into IndexedDB.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n * // DiskStorage.dataStoreName = 'recordRTC';\r\n * // DiskStorage.onError = function(error) { };\r\n * @property {function} init - This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @property {function} Fetch - This method fetches stored blobs from IndexedDB.\r\n * @property {function} Store - This method stores blobs in IndexedDB.\r\n * @property {function} onError - This function is invoked for any known/unknown error.\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\n\r\nvar DiskStorage = {\r\n /**\r\n * This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.init();\r\n */\r\n init: function() {\r\n var self = this;\r\n\r\n if (typeof indexedDB === 'undefined' || typeof indexedDB.open === 'undefined') {\r\n console.error('IndexedDB API are not available in this browser.');\r\n return;\r\n }\r\n\r\n var dbVersion = 1;\r\n var dbName = this.dbName || location.href.replace(/\\/|:|#|%|\\.|\\[|\\]/g, ''),\r\n db;\r\n var request = indexedDB.open(dbName, dbVersion);\r\n\r\n function createObjectStore(dataBase) {\r\n dataBase.createObjectStore(self.dataStoreName);\r\n }\r\n\r\n function putInDB() {\r\n var transaction = db.transaction([self.dataStoreName], 'readwrite');\r\n\r\n if (self.videoBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.videoBlob, 'videoBlob');\r\n }\r\n\r\n if (self.gifBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.gifBlob, 'gifBlob');\r\n }\r\n\r\n if (self.audioBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.audioBlob, 'audioBlob');\r\n }\r\n\r\n function getFromStore(portionName) {\r\n transaction.objectStore(self.dataStoreName).get(portionName).onsuccess = function(event) {\r\n if (self.callback) {\r\n self.callback(event.target.result, portionName);\r\n }\r\n };\r\n }\r\n\r\n getFromStore('audioBlob');\r\n getFromStore('videoBlob');\r\n getFromStore('gifBlob');\r\n }\r\n\r\n request.onerror = self.onError;\r\n\r\n request.onsuccess = function() {\r\n db = request.result;\r\n db.onerror = self.onError;\r\n\r\n if (db.setVersion) {\r\n if (db.version !== dbVersion) {\r\n var setVersion = db.setVersion(dbVersion);\r\n setVersion.onsuccess = function() {\r\n createObjectStore(db);\r\n putInDB();\r\n };\r\n } else {\r\n putInDB();\r\n }\r\n } else {\r\n putInDB();\r\n }\r\n };\r\n request.onupgradeneeded = function(event) {\r\n createObjectStore(event.target.result);\r\n };\r\n },\r\n /**\r\n * This method fetches stored blobs from IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n */\r\n Fetch: function(callback) {\r\n this.callback = callback;\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This method stores blobs in IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n */\r\n Store: function(config) {\r\n this.audioBlob = config.audioBlob;\r\n this.videoBlob = config.videoBlob;\r\n this.gifBlob = config.gifBlob;\r\n\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This function is invoked for any known/unknown error.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.onError = function(error){\r\n * alerot( JSON.stringify(error) );\r\n * };\r\n */\r\n onError: function(error) {\r\n console.error(JSON.stringify(error, null, '\\t'));\r\n },\r\n\r\n /**\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.dataStoreName = 'recordRTC';\r\n */\r\n dataStoreName: 'recordRTC',\r\n dbName: null\r\n};\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.DiskStorage = DiskStorage;\r\n}\n\r\n// ______________\r\n// GifRecorder.js\r\n\r\n/**\r\n * GifRecorder is standalone calss used by {@link RecordRTC} to record video or canvas into animated gif.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GifRecorder\r\n * @class\r\n * @example\r\n * var recorder = new GifRecorder(mediaStream || canvas || context, { onGifPreview: function, onGifRecordingStarted: function, width: 1280, height: 720, frameRate: 200, quality: 10 });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object or HTMLCanvasElement or CanvasRenderingContext2D.\r\n * @param {object} config - {disableLogs:true, initCallback: function, width: 320, height: 240, frameRate: 200, quality: 10}\r\n */\r\n\r\nfunction GifRecorder(mediaStream, config) {\r\n if (typeof GIFEncoder === 'undefined') {\r\n var script = document.createElement('script');\r\n script.src = 'https://www.webrtc-experiment.com/gif-recorder.js';\r\n (document.body || document.documentElement).appendChild(script);\r\n }\r\n\r\n config = config || {};\r\n\r\n var isHTMLObject = mediaStream instanceof CanvasRenderingContext2D || mediaStream instanceof HTMLCanvasElement;\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (typeof GIFEncoder === 'undefined') {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isLoadedMetaData) {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isHTMLObject) {\r\n if (!config.width) {\r\n config.width = video.offsetWidth || 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = video.offsetHeight || 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n video.width = config.video.width || 320;\r\n video.height = config.video.height || 240;\r\n }\r\n\r\n // external library to record as GIF images\r\n gifEncoder = new GIFEncoder();\r\n\r\n // void setRepeat(int iter) \r\n // Sets the number of times the set of GIF frames should be played. \r\n // Default is 1; 0 means play indefinitely.\r\n gifEncoder.setRepeat(0);\r\n\r\n // void setFrameRate(Number fps) \r\n // Sets frame rate in frames per second. \r\n // Equivalent to setDelay(1000/fps).\r\n // Using \"setDelay\" instead of \"setFrameRate\"\r\n gifEncoder.setDelay(config.frameRate || 200);\r\n\r\n // void setQuality(int quality) \r\n // Sets quality of color quantization (conversion of images to the \r\n // maximum 256 colors allowed by the GIF specification). \r\n // Lower values (minimum = 1) produce better colors, \r\n // but slow processing significantly. 10 is the default, \r\n // and produces good color mapping at reasonable speeds. \r\n // Values greater than 20 do not yield significant improvements in speed.\r\n gifEncoder.setQuality(config.quality || 10);\r\n\r\n // Boolean start() \r\n // This writes the GIF Header and returns false if it fails.\r\n gifEncoder.start();\r\n\r\n if (typeof config.onGifRecordingStarted === 'function') {\r\n config.onGifRecordingStarted();\r\n }\r\n\r\n startTime = Date.now();\r\n\r\n function drawVideoFrame(time) {\r\n if (self.clearedRecordedData === true) {\r\n return;\r\n }\r\n\r\n if (isPausedRecording) {\r\n return setTimeout(function() {\r\n drawVideoFrame(time);\r\n }, 100);\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (typeof lastFrameTime === undefined) {\r\n lastFrameTime = time;\r\n }\r\n\r\n // ~10 fps\r\n if (time - lastFrameTime < 90) {\r\n return;\r\n }\r\n\r\n if (!isHTMLObject && video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n if (!isHTMLObject) {\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n if (config.onGifPreview) {\r\n config.onGifPreview(canvas.toDataURL('image/png'));\r\n }\r\n\r\n gifEncoder.addFrame(context);\r\n lastFrameTime = time;\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (lastAnimationFrame) {\r\n cancelAnimationFrame(lastAnimationFrame);\r\n }\r\n\r\n endTime = Date.now();\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = new Blob([new Uint8Array(gifEncoder.stream().bin)], {\r\n type: 'image/gif'\r\n });\r\n\r\n callback(this.blob);\r\n\r\n // bug: find a way to clear old recorded blobs\r\n gifEncoder.stream().bin = [];\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n self.clearedRecordedData = true;\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n if (gifEncoder) {\r\n gifEncoder.stream().bin = [];\r\n }\r\n }\r\n\r\n // for debugging\r\n this.name = 'GifRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n if (isHTMLObject) {\r\n if (mediaStream instanceof CanvasRenderingContext2D) {\r\n context = mediaStream;\r\n canvas = context.canvas;\r\n } else if (mediaStream instanceof HTMLCanvasElement) {\r\n context = mediaStream.getContext('2d');\r\n canvas = mediaStream;\r\n }\r\n }\r\n\r\n var isLoadedMetaData = true;\r\n\r\n if (!isHTMLObject) {\r\n var video = document.createElement('video');\r\n video.muted = true;\r\n video.autoplay = true;\r\n video.playsInline = true;\r\n\r\n isLoadedMetaData = false;\r\n video.onloadedmetadata = function() {\r\n isLoadedMetaData = true;\r\n };\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.play();\r\n }\r\n\r\n var lastAnimationFrame = null;\r\n var startTime, endTime, lastFrameTime;\r\n\r\n var gifEncoder;\r\n\r\n var self = this;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.GifRecorder = GifRecorder;\r\n}\n\r\n// Last time updated: 2019-06-21 4:09:42 AM UTC\r\n\r\n// ________________________\r\n// MultiStreamsMixer v1.2.2\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/MultiStreamsMixer\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\nfunction MultiStreamsMixer(arrayOfMediaStreams, elementClass) {\r\n\r\n var browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n (function(that) {\r\n if (typeof RecordRTC !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n })(typeof global !== 'undefined' ? global : null);\r\n\r\n // requires: chrome://flags/#enable-experimental-web-platform-features\r\n\r\n elementClass = elementClass || 'multi-streams-mixer';\r\n\r\n var videos = [];\r\n var isStopDrawingFrames = false;\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n canvas.style.opacity = 0;\r\n canvas.style.position = 'absolute';\r\n canvas.style.zIndex = -1;\r\n canvas.style.top = '-1000em';\r\n canvas.style.left = '-1000em';\r\n canvas.className = elementClass;\r\n (document.body || document.documentElement).appendChild(canvas);\r\n\r\n this.disableLogs = false;\r\n this.frameInterval = 10;\r\n\r\n this.width = 360;\r\n this.height = 240;\r\n\r\n // use gain node to prevent echo\r\n this.useGainNode = true;\r\n\r\n var self = this;\r\n\r\n // _____________________________\r\n // Cross-Browser-Declarations.js\r\n\r\n // WebAudio API representer\r\n var AudioContext = window.AudioContext;\r\n\r\n if (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n }\r\n\r\n /*jshint -W079 */\r\n var URL = window.URL;\r\n\r\n if (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n }\r\n\r\n if (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n }\r\n\r\n var MediaStream = window.MediaStream;\r\n\r\n if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n }\r\n\r\n /*global MediaStream:true */\r\n if (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n }\r\n\r\n var Storage = {};\r\n\r\n if (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n } else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n }\r\n\r\n function setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n }\r\n\r\n this.startDrawingFrames = function() {\r\n drawVideosToCanvas();\r\n };\r\n\r\n function drawVideosToCanvas() {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var videosLength = videos.length;\r\n\r\n var fullcanvas = false;\r\n var remaining = [];\r\n videos.forEach(function(video) {\r\n if (!video.stream) {\r\n video.stream = {};\r\n }\r\n\r\n if (video.stream.fullcanvas) {\r\n fullcanvas = video;\r\n } else {\r\n // todo: video.stream.active or video.stream.live to fix blank frames issues?\r\n remaining.push(video);\r\n }\r\n });\r\n\r\n if (fullcanvas) {\r\n canvas.width = fullcanvas.stream.width;\r\n canvas.height = fullcanvas.stream.height;\r\n } else if (remaining.length) {\r\n canvas.width = videosLength > 1 ? remaining[0].width * 2 : remaining[0].width;\r\n\r\n var height = 1;\r\n if (videosLength === 3 || videosLength === 4) {\r\n height = 2;\r\n }\r\n if (videosLength === 5 || videosLength === 6) {\r\n height = 3;\r\n }\r\n if (videosLength === 7 || videosLength === 8) {\r\n height = 4;\r\n }\r\n if (videosLength === 9 || videosLength === 10) {\r\n height = 5;\r\n }\r\n canvas.height = remaining[0].height * height;\r\n } else {\r\n canvas.width = self.width || 360;\r\n canvas.height = self.height || 240;\r\n }\r\n\r\n if (fullcanvas && fullcanvas instanceof HTMLVideoElement) {\r\n drawImage(fullcanvas);\r\n }\r\n\r\n remaining.forEach(function(video, idx) {\r\n drawImage(video, idx);\r\n });\r\n\r\n setTimeout(drawVideosToCanvas, self.frameInterval);\r\n }\r\n\r\n function drawImage(video, idx) {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var x = 0;\r\n var y = 0;\r\n var width = video.width;\r\n var height = video.height;\r\n\r\n if (idx === 1) {\r\n x = video.width;\r\n }\r\n\r\n if (idx === 2) {\r\n y = video.height;\r\n }\r\n\r\n if (idx === 3) {\r\n x = video.width;\r\n y = video.height;\r\n }\r\n\r\n if (idx === 4) {\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 5) {\r\n x = video.width;\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 6) {\r\n y = video.height * 3;\r\n }\r\n\r\n if (idx === 7) {\r\n x = video.width;\r\n y = video.height * 3;\r\n }\r\n\r\n if (typeof video.stream.left !== 'undefined') {\r\n x = video.stream.left;\r\n }\r\n\r\n if (typeof video.stream.top !== 'undefined') {\r\n y = video.stream.top;\r\n }\r\n\r\n if (typeof video.stream.width !== 'undefined') {\r\n width = video.stream.width;\r\n }\r\n\r\n if (typeof video.stream.height !== 'undefined') {\r\n height = video.stream.height;\r\n }\r\n\r\n context.drawImage(video, x, y, width, height);\r\n\r\n if (typeof video.stream.onRender === 'function') {\r\n video.stream.onRender(context, x, y, width, height, idx);\r\n }\r\n }\r\n\r\n function getMixedStream() {\r\n isStopDrawingFrames = false;\r\n var mixedVideoStream = getMixedVideoStream();\r\n\r\n var mixedAudioStream = getMixedAudioStream();\r\n if (mixedAudioStream) {\r\n mixedAudioStream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).forEach(function(track) {\r\n mixedVideoStream.addTrack(track);\r\n });\r\n }\r\n\r\n var fullcanvas;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (stream.fullcanvas) {\r\n fullcanvas = true;\r\n }\r\n });\r\n\r\n // mixedVideoStream.prototype.appendStreams = appendStreams;\r\n // mixedVideoStream.prototype.resetVideoStreams = resetVideoStreams;\r\n // mixedVideoStream.prototype.clearRecordedData = clearRecordedData;\r\n\r\n return mixedVideoStream;\r\n }\r\n\r\n function getMixedVideoStream() {\r\n resetVideoStreams();\r\n\r\n var capturedStream;\r\n\r\n if ('captureStream' in canvas) {\r\n capturedStream = canvas.captureStream();\r\n } else if ('mozCaptureStream' in canvas) {\r\n capturedStream = canvas.mozCaptureStream();\r\n } else if (!self.disableLogs) {\r\n console.error('Upgrade to latest Chrome or otherwise enable this flag: chrome://flags/#enable-experimental-web-platform-features');\r\n }\r\n\r\n var videoStream = new MediaStream();\r\n\r\n capturedStream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).forEach(function(track) {\r\n videoStream.addTrack(track);\r\n });\r\n\r\n canvas.stream = videoStream;\r\n\r\n return videoStream;\r\n }\r\n\r\n function getMixedAudioStream() {\r\n // via: @pehrsons\r\n if (!Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor = new Storage.AudioContext();\r\n }\r\n\r\n self.audioContext = Storage.AudioContextConstructor;\r\n\r\n self.audioSources = [];\r\n\r\n if (self.useGainNode === true) {\r\n self.gainNode = self.audioContext.createGain();\r\n self.gainNode.connect(self.audioContext.destination);\r\n self.gainNode.gain.value = 0; // don't hear self\r\n }\r\n\r\n var audioTracksLength = 0;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n return;\r\n }\r\n\r\n audioTracksLength++;\r\n\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n\r\n if (self.useGainNode === true) {\r\n audioSource.connect(self.gainNode);\r\n }\r\n\r\n self.audioSources.push(audioSource);\r\n });\r\n\r\n if (!audioTracksLength) {\r\n // because \"self.audioContext\" is not initialized\r\n // that's why we've to ignore rest of the code\r\n return;\r\n }\r\n\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n self.audioSources.forEach(function(audioSource) {\r\n audioSource.connect(self.audioDestination);\r\n });\r\n return self.audioDestination.stream;\r\n }\r\n\r\n function getVideo(stream) {\r\n var video = document.createElement('video');\r\n\r\n setSrcObject(stream, video);\r\n\r\n video.className = elementClass;\r\n\r\n video.muted = true;\r\n video.volume = 0;\r\n\r\n video.width = stream.width || self.width || 360;\r\n video.height = stream.height || self.height || 240;\r\n\r\n video.play();\r\n\r\n return video;\r\n }\r\n\r\n this.appendStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n streams.forEach(function(stream) {\r\n var newStream = new MediaStream();\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n\r\n newStream.addTrack(stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n })[0]);\r\n }\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n audioSource.connect(self.audioDestination);\r\n\r\n newStream.addTrack(self.audioDestination.stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n })[0]);\r\n }\r\n\r\n arrayOfMediaStreams.push(newStream);\r\n });\r\n };\r\n\r\n this.releaseStreams = function() {\r\n videos = [];\r\n isStopDrawingFrames = true;\r\n\r\n if (self.gainNode) {\r\n self.gainNode.disconnect();\r\n self.gainNode = null;\r\n }\r\n\r\n if (self.audioSources.length) {\r\n self.audioSources.forEach(function(source) {\r\n source.disconnect();\r\n });\r\n self.audioSources = [];\r\n }\r\n\r\n if (self.audioDestination) {\r\n self.audioDestination.disconnect();\r\n self.audioDestination = null;\r\n }\r\n\r\n if (self.audioContext) {\r\n self.audioContext.close();\r\n }\r\n\r\n self.audioContext = null;\r\n\r\n context.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (canvas.stream) {\r\n canvas.stream.stop();\r\n canvas.stream = null;\r\n }\r\n };\r\n\r\n this.resetVideoStreams = function(streams) {\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n resetVideoStreams(streams);\r\n };\r\n\r\n function resetVideoStreams(streams) {\r\n videos = [];\r\n streams = streams || arrayOfMediaStreams;\r\n\r\n // via: @adrian-ber\r\n streams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n return;\r\n }\r\n\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n });\r\n }\r\n\r\n // for debugging\r\n this.name = 'MultiStreamsMixer';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n this.getMixedStream = getMixedStream;\r\n\r\n}\r\n\r\nif (typeof RecordRTC === 'undefined') {\r\n if (typeof module !== 'undefined' /* && !!module.exports*/ ) {\r\n module.exports = MultiStreamsMixer;\r\n }\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n define('MultiStreamsMixer', [], function() {\r\n return MultiStreamsMixer;\r\n });\r\n }\r\n}\n\r\n// ______________________\r\n// MultiStreamRecorder.js\r\n\r\n/*\r\n * Video conference recording, using captureStream API along with WebAudio and Canvas2D API.\r\n */\r\n\r\n/**\r\n * MultiStreamRecorder can record multiple videos in single container.\r\n * @summary Multi-videos recorder.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MultiStreamRecorder\r\n * @class\r\n * @example\r\n * var options = {\r\n * mimeType: 'video/webm'\r\n * }\r\n * var recorder = new MultiStreamRecorder(ArrayOfMediaStreams, options);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams.\r\n * @param {object} config - {disableLogs:true, frameInterval: 1, mimeType: \"video/webm\"}\r\n */\r\n\r\nfunction MultiStreamRecorder(arrayOfMediaStreams, options) {\r\n arrayOfMediaStreams = arrayOfMediaStreams || [];\r\n var self = this;\r\n\r\n var mixer;\r\n var mediaRecorder;\r\n\r\n options = options || {\r\n elementClass: 'multi-streams-mixer',\r\n mimeType: 'video/webm',\r\n video: {\r\n width: 360,\r\n height: 240\r\n }\r\n };\r\n\r\n if (!options.frameInterval) {\r\n options.frameInterval = 10;\r\n }\r\n\r\n if (!options.video) {\r\n options.video = {};\r\n }\r\n\r\n if (!options.video.width) {\r\n options.video.width = 360;\r\n }\r\n\r\n if (!options.video.height) {\r\n options.video.height = 240;\r\n }\r\n\r\n /**\r\n * This method records all MediaStreams.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // github/muaz-khan/MultiStreamsMixer\r\n mixer = new MultiStreamsMixer(arrayOfMediaStreams, options.elementClass || 'multi-streams-mixer');\r\n\r\n if (getAllVideoTracks().length) {\r\n mixer.frameInterval = options.frameInterval || 10;\r\n mixer.width = options.video.width || 360;\r\n mixer.height = options.video.height || 240;\r\n mixer.startDrawingFrames();\r\n }\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n\r\n // record using MediaRecorder API\r\n mediaRecorder = new MediaStreamRecorder(mixer.getMixedStream(), options);\r\n mediaRecorder.record();\r\n };\r\n\r\n function getAllVideoTracks() {\r\n var tracks = [];\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n getTracks(stream, 'video').forEach(function(track) {\r\n tracks.push(track);\r\n });\r\n });\r\n return tracks;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n mediaRecorder.stop(function(blob) {\r\n self.blob = blob;\r\n\r\n callback(blob);\r\n\r\n self.clearRecordedData();\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder = null;\r\n }\r\n\r\n if (mixer) {\r\n mixer.releaseStreams();\r\n mixer = null;\r\n }\r\n };\r\n\r\n /**\r\n * Add extra media-streams to existing recordings.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.addStreams([newAudioStream, newVideoStream]);\r\n */\r\n this.addStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n arrayOfMediaStreams.concat(streams);\r\n\r\n if (!mediaRecorder || !mixer) {\r\n return;\r\n }\r\n\r\n mixer.appendStreams(streams);\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n };\r\n\r\n /**\r\n * Reset videos during live recording. Replace old videos e.g. replace cameras with full-screen.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.resetVideoStreams([newVideo1, newVideo2]);\r\n */\r\n this.resetVideoStreams = function(streams) {\r\n if (!mixer) {\r\n return;\r\n }\r\n\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n mixer.resetVideoStreams(streams);\r\n };\r\n\r\n /**\r\n * Returns MultiStreamsMixer\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * let mixer = recorder.getMixer();\r\n * mixer.appendStreams([newStream]);\r\n */\r\n this.getMixer = function() {\r\n return mixer;\r\n };\r\n\r\n // for debugging\r\n this.name = 'MultiStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MultiStreamRecorder = MultiStreamRecorder;\r\n}\n\r\n// _____________________\r\n// RecordRTC.promises.js\r\n\r\n/**\r\n * RecordRTCPromisesHandler adds promises support in {@link RecordRTC}. Try a {@link https://github.com/muaz-khan/RecordRTC/blob/master/simple-demos/RecordRTCPromisesHandler.html|demo here}\r\n * @summary Promises for {@link RecordRTC}\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCPromisesHandler\r\n * @class\r\n * @example\r\n * var recorder = new RecordRTCPromisesHandler(mediaStream, options);\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n * // Note: You can access all RecordRTC API using \"recorder.recordRTC\" e.g. \r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n * recorder.recordRTC.setRecordingDuration(5000);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n * @throws Will throw an error if \"new\" keyword is not used to initiate \"RecordRTCPromisesHandler\". Also throws error if first argument \"MediaStream\" is missing.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction RecordRTCPromisesHandler(mediaStream, options) {\r\n if (!this) {\r\n throw 'Use \"new RecordRTCPromisesHandler()\"';\r\n }\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n var self = this;\r\n\r\n /**\r\n * @property {Blob} blob - Access/reach the native {@link RecordRTC} object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internal = recorder.recordRTC.getInternalRecorder();\r\n * alert(internal instanceof MediaStreamRecorder);\r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n */\r\n self.recordRTC = new RecordRTC(mediaStream, options);\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.startRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.startRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method stops the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * var blob = recorder.getBlob();\r\n * }).catch(errorCB);\r\n */\r\n this.stopRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.stopRecording(function(url) {\r\n self.blob = self.recordRTC.getBlob();\r\n\r\n if (!self.blob || !self.blob.size) {\r\n reject('Empty blob.', self.blob);\r\n return;\r\n }\r\n\r\n resolve(url);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.pauseRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.pauseRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.pauseRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.resumeRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.resumeRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.resumeRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns data-url for the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getDataURL().then(function(dataURL) {\r\n * window.open(dataURL);\r\n * }).catch(errorCB);;\r\n * }).catch(errorCB);\r\n */\r\n this.getDataURL = function(callback) {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.getDataURL(function(dataURL) {\r\n resolve(dataURL);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getBlob().then(function(blob) {})\r\n * }).catch(errorCB);\r\n */\r\n this.getBlob = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getBlob());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the internal recording object.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internalRecorder = await recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} \r\n */\r\n this.getInternalRecorder = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getInternalRecorder());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.reset();\r\n * recorder.startRecording(); // record again\r\n */\r\n this.reset = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.reset());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.destroy().then(successCB).catch(errorCB);\r\n */\r\n this.destroy = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.destroy());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let state = await recorder.getState();\r\n * // or\r\n * recorder.getState().then(state => { console.log(state); })\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getState());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.stopRecording();\r\n * let blob = recorder.getBlob(); // or \"recorder.recordRTC.blob\"\r\n * invokeSaveAsDialog(blob);\r\n */\r\n this.blob = null;\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTCPromisesHandler\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n this.version = '5.6.2';\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.RecordRTCPromisesHandler = RecordRTCPromisesHandler;\r\n}\n\r\n// ______________________\r\n// WebAssemblyRecorder.js\r\n\r\n/**\r\n * WebAssemblyRecorder lets you create webm videos in JavaScript via WebAssembly. The library consumes raw RGBA32 buffers (4 bytes per pixel) and turns them into a webm video with the given framerate and quality. This makes it compatible out-of-the-box with ImageData from a CANVAS. With realtime mode you can also use webm-wasm for streaming webm videos.\r\n * @summary Video recording feature in Chrome, Firefox and maybe Edge.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WebAssemblyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WebAssemblyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {webAssemblyPath:'webm-wasm.wasm',workerPath: 'webm-worker.js', frameRate: 30, width: 1920, height: 1080, bitrate: 1024, realtime: true}\r\n */\r\nfunction WebAssemblyRecorder(stream, config) {\r\n // based on: github.com/GoogleChromeLabs/webm-wasm\r\n\r\n if (typeof ReadableStream === 'undefined' || typeof WritableStream === 'undefined') {\r\n // because it fixes readable/writable streams issues\r\n console.error('Following polyfill is strongly recommended: https://unpkg.com/@mattiasbuelens/web-streams-polyfill/dist/polyfill.min.js');\r\n }\r\n\r\n config = config || {};\r\n\r\n config.width = config.width || 640;\r\n config.height = config.height || 480;\r\n config.frameRate = config.frameRate || 30;\r\n config.bitrate = config.bitrate || 1200;\r\n config.realtime = config.realtime || true;\r\n\r\n function createBufferURL(buffer, type) {\r\n return URL.createObjectURL(new Blob([buffer], {\r\n type: type || ''\r\n }));\r\n }\r\n\r\n var finished;\r\n\r\n function cameraStream() {\r\n return new ReadableStream({\r\n start: function(controller) {\r\n var cvs = document.createElement('canvas');\r\n var video = document.createElement('video');\r\n var first = true;\r\n video.srcObject = stream;\r\n video.muted = true;\r\n video.height = config.height;\r\n video.width = config.width;\r\n video.volume = 0;\r\n video.onplaying = function() {\r\n cvs.width = config.width;\r\n cvs.height = config.height;\r\n var ctx = cvs.getContext('2d');\r\n var frameTimeout = 1000 / config.frameRate;\r\n var cameraTimer = setInterval(function f() {\r\n if (finished) {\r\n clearInterval(cameraTimer);\r\n controller.close();\r\n }\r\n\r\n if (first) {\r\n first = false;\r\n if (config.onVideoProcessStarted) {\r\n config.onVideoProcessStarted();\r\n }\r\n }\r\n\r\n ctx.drawImage(video, 0, 0);\r\n if (controller._controlledReadableStream.state !== 'closed') {\r\n try {\r\n controller.enqueue(\r\n ctx.getImageData(0, 0, config.width, config.height)\r\n );\r\n } catch (e) {}\r\n }\r\n }, frameTimeout);\r\n };\r\n video.play();\r\n }\r\n });\r\n }\r\n\r\n var worker;\r\n\r\n function startRecording(stream, buffer) {\r\n if (!config.workerPath && !buffer) {\r\n finished = false;\r\n\r\n // is it safe to use @latest ?\r\n\r\n fetch(\r\n 'https://unpkg.com/webm-wasm@latest/dist/webm-worker.js'\r\n ).then(function(r) {\r\n r.arrayBuffer().then(function(buffer) {\r\n startRecording(stream, buffer);\r\n });\r\n });\r\n return;\r\n }\r\n\r\n if (!config.workerPath && buffer instanceof ArrayBuffer) {\r\n var blob = new Blob([buffer], {\r\n type: 'text/javascript'\r\n });\r\n config.workerPath = URL.createObjectURL(blob);\r\n }\r\n\r\n if (!config.workerPath) {\r\n console.error('workerPath parameter is missing.');\r\n }\r\n\r\n worker = new Worker(config.workerPath);\r\n\r\n worker.postMessage(config.webAssemblyPath || 'https://unpkg.com/webm-wasm@latest/dist/webm-wasm.wasm');\r\n worker.addEventListener('message', function(event) {\r\n if (event.data === 'READY') {\r\n worker.postMessage({\r\n width: config.width,\r\n height: config.height,\r\n bitrate: config.bitrate || 1200,\r\n timebaseDen: config.frameRate || 30,\r\n realtime: config.realtime\r\n });\r\n\r\n cameraStream().pipeTo(new WritableStream({\r\n write: function(image) {\r\n if (finished) {\r\n console.error('Got image, but recorder is finished!');\r\n return;\r\n }\r\n\r\n worker.postMessage(image.data.buffer, [image.data.buffer]);\r\n }\r\n }));\r\n } else if (!!event.data) {\r\n if (!isPaused) {\r\n arrayOfBuffers.push(event.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n startRecording(stream);\r\n\r\n if (typeof config.initCallback === 'function') {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n var isPaused;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPaused = false;\r\n };\r\n\r\n function terminate(callback) {\r\n if (!worker) {\r\n if (callback) {\r\n callback();\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Wait for null event data to indicate that the encoding is complete\r\n worker.addEventListener('message', function(event) {\r\n if (event.data === null) {\r\n worker.terminate();\r\n worker = null;\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n }\r\n });\r\n\r\n worker.postMessage(null);\r\n }\r\n\r\n var arrayOfBuffers = [];\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n finished = true;\r\n\r\n var recorder = this;\r\n\r\n terminate(function() {\r\n recorder.blob = new Blob(arrayOfBuffers, {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(recorder.blob);\r\n });\r\n };\r\n\r\n // for debugging\r\n this.name = 'WebAssemblyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n\r\n // todo: if recording-ON then STOP it first\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WebAssemblyRecorder = WebAssemblyRecorder;\r\n}\n","import {downloadRecord} from \"../utils\";\nimport RecordRTC from 'recordrtc';\nimport {EVENTS, FILE_SUFFIX} from \"../constant\";\nimport Emitter from \"../utils/emitter\";\n\nexport default class RecordRTCLoader extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n this.fileName = '';\n this.fileType = FILE_SUFFIX.webm;\n this.isRecording = false;\n this.recordingTimestamp = 0;\n this.recordingInterval = null;\n player.debug.log('Recorder', 'init');\n }\n\n destroy() {\n this._reset();\n this.player.debug.log('Recorder', 'destroy');\n }\n\n setFileName(fileName, fileType) {\n this.fileName = fileName;\n\n if (FILE_SUFFIX.mp4 === fileType || FILE_SUFFIX.webm === fileType) {\n this.fileType = fileType;\n }\n }\n\n get recording() {\n return this.isRecording;\n }\n\n get recordTime() {\n return this.recordingTimestamp;\n }\n\n startRecord() {\n const debug = this.player.debug;\n const options = {\n type: 'video',\n mimeType: 'video/webm;codecs=h264',\n onTimeStamp: (timestamp) => {\n debug.log('Recorder', 'record timestamp :' + timestamp);\n },\n disableLogs: !this.player._opt.debug\n }\n\n try {\n const stream = this.player.video.$videoElement.captureStream(25);\n if (this.player.audio && this.player.audio.mediaStreamAudioDestinationNode &&\n this.player.audio.mediaStreamAudioDestinationNode.stream &&\n !this.player.audio.isStateSuspended() &&\n this.player.audio.hasAudio && this.player._opt.hasAudio) {\n const audioStream = this.player.audio.mediaStreamAudioDestinationNode.stream;\n if (audioStream.getAudioTracks().length > 0) {\n const audioTrack = audioStream.getAudioTracks()[0];\n if (audioTrack && audioTrack.enabled) {\n stream.addTrack(audioTrack);\n }\n }\n }\n this.recorder = RecordRTC(stream, options);\n } catch (e) {\n debug.error('Recorder', e);\n this.emit(EVENTS.recordCreateError);\n }\n if (this.recorder) {\n this.isRecording = true;\n this.emit(EVENTS.recording, true);\n this.recorder.startRecording();\n debug.log('Recorder', 'start recording');\n this.player.emit(EVENTS.recordStart);\n this.recordingInterval = window.setInterval(() => {\n this.recordingTimestamp += 1;\n this.player.emit(EVENTS.recordingTimestamp, this.recordingTimestamp);\n }, 1000);\n }\n }\n\n stopRecordAndSave() {\n if (!this.recorder || !this.isRecording) {\n return;\n }\n this.recorder.stopRecording(() => {\n this.player.debug.log('Recorder', 'stop recording');\n this.player.emit(EVENTS.recordEnd)\n downloadRecord(this.recorder.getBlob(), this.fileName, this.fileType);\n this._reset();\n this.emit(EVENTS.recording, false);\n })\n }\n\n _reset() {\n this.isRecording = false;\n this.recordingTimestamp = 0;\n\n if (this.recorder) {\n this.recorder.destroy();\n this.recorder = null;\n }\n this.fileName = null;\n if (this.recordingInterval) {\n clearInterval(this.recordingInterval);\n }\n this.recordingInterval = null;\n }\n\n\n}\n","import RecordRTCLoader from \"./recordRTCLoader\";\n\nexport default class Recorder {\n constructor(player) {\n const Loader = Recorder.getLoaderFactory();\n return new Loader(player);\n }\n\n static getLoaderFactory() {\n return RecordRTCLoader;\n }\n}\n","import {EVENTS, EVENTS_ERROR, MEDIA_TYPE, WASM_ERROR, WORKER_CMD_TYPE, WORKER_SEND_TYPE} from \"../constant\";\nimport {now} from \"../utils\";\n\nexport default class DecoderWorker {\n constructor(player) {\n this.player = player;\n this.decoderWorker = new Worker(player._opt.decoder)\n this._initDecoderWorker();\n player.debug.log('decoderWorker', 'init')\n }\n\n destroy() {\n this.decoderWorker.postMessage({cmd: WORKER_SEND_TYPE.close})\n this.decoderWorker.terminate();\n this.decoderWorker = null;\n this.player.debug.log(`decoderWorker`, 'destroy');\n }\n\n _initDecoderWorker() {\n const {\n debug,\n events: {proxy},\n } = this.player;\n\n this.decoderWorker.onmessage = (event) => {\n const msg = event.data;\n switch (msg.cmd) {\n case WORKER_CMD_TYPE.init:\n debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.init);\n if (!this.player.loaded) {\n this.player.emit(EVENTS.load);\n }\n this.player.emit(EVENTS.decoderWorkerInit);\n this._initWork();\n break;\n case WORKER_CMD_TYPE.videoCode:\n debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.videoCode, msg.code);\n if (!this.player._times.decodeStart) {\n this.player._times.decodeStart = now();\n }\n this.player.video.updateVideoInfo({\n encTypeCode: msg.code\n })\n break;\n case WORKER_CMD_TYPE.audioCode:\n debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.audioCode, msg.code);\n this.player.audio && this.player.audio.updateAudioInfo({\n encTypeCode: msg.code\n })\n break;\n case WORKER_CMD_TYPE.initVideo:\n debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.initVideo, `width:${msg.w},height:${msg.h}`);\n this.player.video.updateVideoInfo({\n width: msg.w,\n height: msg.h\n })\n this.player.video.initCanvasViewSize();\n break;\n case WORKER_CMD_TYPE.initAudio:\n debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.initAudio, `channels:${msg.channels},sampleRate:${msg.sampleRate}`);\n if (this.player.audio) {\n this.player.audio.updateAudioInfo(msg);\n this.player.audio.initScriptNode(msg);\n }\n break;\n case WORKER_CMD_TYPE.render:\n // debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.render, `msg ts:${msg.ts}`);\n this.player.handleRender();\n this.player.video.render(msg);\n this.player.emit(EVENTS.timeUpdate, msg.ts)\n this.player.updateStats({fps: true, ts: msg.ts, buf: msg.delay})\n if (!this.player._times.videoStart) {\n this.player._times.videoStart = now();\n this.player.handlePlayToRenderTimes();\n }\n break;\n case WORKER_CMD_TYPE.playAudio:\n // debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.playAudio, `msg ts:${msg.ts}`);\n // 只有在 playing 的时候。\n if (this.player.playing && this.player.audio) {\n this.player.audio.play(msg.buffer, msg.ts);\n }\n break;\n case WORKER_CMD_TYPE.wasmError:\n if (msg.message) {\n if (msg.message.indexOf(WASM_ERROR.invalidNalUnitSize) !== -1) {\n this.player.emit(EVENTS.error, EVENTS_ERROR.wasmDecodeError);\n this.player.emit(EVENTS_ERROR.wasmDecodeError);\n }\n }\n break;\n default:\n this.player[msg.cmd] && this.player[msg.cmd](msg);\n }\n }\n }\n\n _initWork() {\n const opt = {\n debug: this.player._opt.debug,\n forceNoOffscreen: this.player._opt.forceNoOffscreen,\n useWCS: this.player._opt.useWCS,\n videoBuffer: this.player._opt.videoBuffer,\n openWebglAlignment: this.player._opt.openWebglAlignment\n }\n this.decoderWorker.postMessage({\n cmd: WORKER_SEND_TYPE.init,\n opt: JSON.stringify(opt),\n sampleRate: (this.player.audio && this.player.audio.audioContext.sampleRate) || 0\n })\n }\n\n decodeVideo(arrayBuffer, ts, isIFrame) {\n\n const options = {\n type: MEDIA_TYPE.video,\n ts: Math.max(ts, 0),\n isIFrame\n }\n // this.player.debug.log('decoderWorker', 'decodeVideo', options);\n this.decoderWorker.postMessage({\n cmd: WORKER_SEND_TYPE.decode,\n buffer: arrayBuffer,\n options\n }, [arrayBuffer.buffer])\n }\n\n decodeAudio(arrayBuffer, ts) {\n if (this.player._opt.useWCS && !this.player._opt.useOffscreen) {\n this._decodeAudioNoDelay(arrayBuffer, ts);\n } else if (this.player._opt.useMSE) {\n this._decodeAudioNoDelay(arrayBuffer, ts);\n } else {\n this._decodeAudio(arrayBuffer, ts);\n }\n }\n\n //\n _decodeAudio(arrayBuffer, ts) {\n const options = {\n type: MEDIA_TYPE.audio,\n ts: Math.max(ts, 0)\n }\n // this.player.debug.log('decoderWorker', 'decodeAudio',options);\n this.decoderWorker.postMessage({\n cmd: WORKER_SEND_TYPE.decode,\n buffer: arrayBuffer,\n options\n }, [arrayBuffer.buffer])\n }\n\n\n _decodeAudioNoDelay(arrayBuffer, ts) {\n // console.log('_decodeAudioNoDelay', arrayBuffer);\n this.decoderWorker.postMessage({\n cmd: WORKER_SEND_TYPE.audioDecode,\n buffer: arrayBuffer,\n ts: Math.max(ts, 0)\n }, [arrayBuffer.buffer])\n }\n\n\n updateWorkConfig(config) {\n this.decoderWorker.postMessage({\n cmd: WORKER_SEND_TYPE.updateConfig,\n key: config.key,\n value: config.value\n })\n }\n\n}\n","import Emitter from \"../utils/emitter\";\nimport {MEDIA_TYPE} from \"../constant\";\n\nexport default class CommonLoader extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n\n this.stopId = null;\n this.firstTimestamp = null;\n this.startTimestamp = null;\n this.delay = -1;\n this.bufferList = [];\n this.dropping = false;\n this.initInterval();\n }\n\n destroy() {\n if (this.stopId) {\n clearInterval(this.stopId);\n this.stopId = null;\n }\n this.firstTimestamp = null;\n this.startTimestamp = null;\n this.delay = -1;\n this.bufferList = [];\n this.dropping = false;\n this.off();\n }\n\n getDelay(timestamp) {\n if (!timestamp) {\n return -1\n }\n if (!this.firstTimestamp) {\n this.firstTimestamp = timestamp\n this.startTimestamp = Date.now()\n this.delay = -1;\n } else {\n if (timestamp) {\n this.delay = (Date.now() - this.startTimestamp) - (timestamp - this.firstTimestamp)\n }\n }\n return this.delay\n }\n\n resetDelay() {\n this.firstTimestamp = null;\n this.startTimestamp = null;\n this.delay = -1;\n this.dropping = false;\n }\n\n //\n initInterval() {\n this.player.debug.log('common dumex', `init Interval`);\n let _loop = () => {\n let data;\n const videoBuffer = this.player._opt.videoBuffer;\n if (this.bufferList.length) {\n if (this.dropping) {\n // this.player.debug.log('common dumex', `is dropping`);\n data = this.bufferList.shift();\n if (data.type === MEDIA_TYPE.audio && data.payload[1] === 0) {\n this._doDecoderDecode(data);\n }\n while (!data.isIFrame && this.bufferList.length) {\n data = this.bufferList.shift();\n if (data.type === MEDIA_TYPE.audio && data.payload[1] === 0) {\n this._doDecoderDecode(data);\n }\n }\n // i frame\n if (data.isIFrame) {\n this.dropping = false;\n this._doDecoderDecode(data);\n }\n } else {\n data = this.bufferList[0];\n if (this.getDelay(data.ts) === -1) {\n // this.player.debug.log('common dumex', `delay is -1`);\n this.bufferList.shift()\n this._doDecoderDecode(data);\n } else if (this.delay > videoBuffer + 1000) {\n // this.player.debug.log('common dumex', `delay is ${this.delay}, set dropping is true`);\n this.resetDelay();\n this.dropping = true\n } else {\n while (this.bufferList.length) {\n data = this.bufferList[0]\n\n if (this.getDelay(data.ts) > videoBuffer) {\n // drop frame\n this.bufferList.shift()\n this._doDecoderDecode(data);\n } else {\n // this.player.debug.log('common dumex', `delay is ${this.delay}`);\n break;\n }\n }\n }\n }\n }\n }\n _loop();\n this.stopId = setInterval(_loop, 10)\n }\n\n _doDecode(payload, type, ts, isIFrame) {\n const player = this.player;\n let options = {\n ts: ts,\n type: type,\n isIFrame: false\n }\n // use offscreen\n if (player._opt.useWCS && !player._opt.useOffscreen) {\n if (type === MEDIA_TYPE.video) {\n options.isIFrame = isIFrame;\n }\n this.pushBuffer(payload, options)\n } else if (player._opt.useMSE) {\n // use mse\n if (type === MEDIA_TYPE.video) {\n options.isIFrame = isIFrame;\n }\n this.pushBuffer(payload, options)\n } else {\n //\n if (type === MEDIA_TYPE.video) {\n player.decoderWorker && player.decoderWorker.decodeVideo(payload, ts, isIFrame);\n } else if (type === MEDIA_TYPE.audio) {\n if (player._opt.hasAudio) {\n player.decoderWorker && player.decoderWorker.decodeAudio(payload, ts);\n }\n }\n }\n }\n\n _doDecoderDecode(data) {\n const player = this.player;\n const {webcodecsDecoder, mseDecoder} = player;\n\n if (data.type === MEDIA_TYPE.audio) {\n if (player._opt.hasAudio) {\n player.decoderWorker && player.decoderWorker.decodeAudio(data.payload, data.ts)\n }\n } else if (data.type === MEDIA_TYPE.video) {\n if (player._opt.useWCS && !player._opt.useOffscreen) {\n webcodecsDecoder.decodeVideo(data.payload, data.ts, data.isIFrame);\n } else if (player._opt.useMSE) {\n mseDecoder.decodeVideo(data.payload, data.ts, data.isIFrame);\n }\n }\n }\n\n pushBuffer(payload, options) {\n // 音频\n if (options.type === MEDIA_TYPE.audio) {\n this.bufferList.push({\n ts: options.ts,\n payload: payload,\n type: MEDIA_TYPE.audio,\n })\n } else if (options.type === MEDIA_TYPE.video) {\n this.bufferList.push({\n ts: options.ts,\n payload: payload,\n type: MEDIA_TYPE.video,\n isIFrame: options.isIFrame\n })\n }\n }\n\n close() {\n\n }\n\n\n}\n","import {FLV_MEDIA_TYPE, MEDIA_TYPE} from \"../constant\";\nimport CommonLoader from \"./commonLoader\";\nimport {now} from \"../utils\";\n\nexport default class FlvLoader extends CommonLoader {\n constructor(player) {\n super(player);\n this.input = this._inputFlv();\n this.flvDemux = this.dispatchFlvData(this.input);\n player.debug.log('FlvDemux', 'init')\n }\n\n destroy() {\n super.destroy();\n this.input = null;\n this.flvDemux = null;\n this.player.debug.log('FlvDemux', 'destroy')\n }\n\n dispatch(data) {\n this.flvDemux(data);\n }\n\n * _inputFlv() {\n yield 9;\n const tmp = new ArrayBuffer(4)\n const tmp8 = new Uint8Array(tmp)\n const tmp32 = new Uint32Array(tmp)\n const player = this.player;\n\n while (true) {\n tmp8[3] = 0\n const t = yield 15\n const type = t[4]\n tmp8[0] = t[7]\n tmp8[1] = t[6]\n tmp8[2] = t[5]\n const length = tmp32[0]\n tmp8[0] = t[10]\n tmp8[1] = t[9]\n tmp8[2] = t[8]\n let ts = tmp32[0]\n if (ts === 0xFFFFFF) {\n tmp8[3] = t[11]\n ts = tmp32[0]\n }\n const payload = yield length\n switch (type) {\n case FLV_MEDIA_TYPE.audio:\n if (player._opt.hasAudio) {\n player.updateStats({\n abps: payload.byteLength\n })\n if (payload.byteLength > 0) {\n this._doDecode(payload, MEDIA_TYPE.audio, ts)\n }\n }\n break\n case FLV_MEDIA_TYPE.video:\n if (!player._times.demuxStart) {\n player._times.demuxStart = now();\n }\n if (player._opt.hasVideo) {\n player.updateStats({\n vbps: payload.byteLength\n })\n const isIFrame = payload[0] >> 4 === 1;\n if (payload.byteLength > 0) {\n this._doDecode(payload, MEDIA_TYPE.video, ts, isIFrame);\n }\n }\n break\n }\n }\n }\n\n dispatchFlvData(input) {\n let need = input.next()\n let buffer = null\n return (value) => {\n let data = new Uint8Array(value)\n if (buffer) {\n let combine = new Uint8Array(buffer.length + data.length)\n combine.set(buffer)\n combine.set(data, buffer.length)\n data = combine\n buffer = null\n }\n while (data.length >= need.value) {\n let remain = data.slice(need.value)\n need = input.next(data.slice(0, need.value))\n data = remain\n }\n if (data.length > 0) {\n buffer = data\n }\n }\n }\n\n close() {\n this.input && this.input.return(null)\n }\n\n\n}\n","import {FLV_MEDIA_TYPE, MEDIA_TYPE} from \"../constant\";\nimport CommonLoader from \"./commonLoader\";\nimport {now} from \"../utils\";\n\nexport default class M7sLoader extends CommonLoader {\n constructor(player) {\n super(player);\n player.debug.log('M7sDemux', 'init')\n }\n\n destroy() {\n super.destroy();\n this.player.debug.log('M7sDemux', 'destroy')\n }\n\n dispatch(data) {\n const player = this.player;\n const dv = new DataView(data)\n const type = dv.getUint8(0);\n const ts = dv.getUint32(1, false);\n switch (type) {\n case MEDIA_TYPE.audio:\n if (player._opt.hasAudio) {\n const payload = new Uint8Array(data, 5)\n player.updateStats({\n abps: payload.byteLength\n })\n if (payload.byteLength > 0) {\n this._doDecode(payload, type, ts)\n }\n }\n break;\n case MEDIA_TYPE.video:\n if (player._opt.hasVideo) {\n if (!player._times.demuxStart) {\n player._times.demuxStart = now();\n }\n if (dv.byteLength > 5) {\n const payload = new Uint8Array(data, 5);\n const isIframe = dv.getUint8(5) >> 4 === 1;\n player.updateStats({\n vbps: payload.byteLength\n })\n if (payload.byteLength > 0) {\n this._doDecode(payload, type, ts, isIframe)\n }\n }\n }\n break;\n }\n }\n\n\n}\n","import FlvLoader from \"./flvLoader\";\nimport M7sLoader from \"./m7sLoader\";\nimport {DEMUX_TYPE} from \"../constant\";\n\nexport default class Demux {\n constructor(player) {\n const Loader = Demux.getLoaderFactory(player._opt.demuxType);\n return new Loader(player);\n }\n\n static getLoaderFactory(type) {\n if (type === DEMUX_TYPE.m7s) {\n return M7sLoader;\n } else if (type === DEMUX_TYPE.flv) {\n return FlvLoader;\n }\n }\n}\n","import {formatVideoDecoderConfigure, noop, now} from \"../utils\";\nimport Emitter from \"../utils/emitter\";\nimport {ENCODED_VIDEO_TYPE, EVENTS, EVENTS_ERROR, VIDEO_ENC_CODE} from \"../constant\";\n\n\nexport default class WebcodecsDecoder extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n this.hasInit = false;\n this.isInitInfo = false;\n this.decoder = null;\n this.initDecoder();\n player.debug.log('Webcodecs', 'init')\n }\n\n destroy() {\n if (this.decoder) {\n this.decoder.close();\n this.decoder = null;\n }\n\n this.hasInit = false;\n this.isInitInfo = false;\n this.off();\n this.player.debug.log('Webcodecs', 'destroy')\n }\n\n initDecoder() {\n const _this = this;\n this.decoder = new VideoDecoder({\n output(videoFrame) {\n _this.handleDecode(videoFrame)\n },\n error(error) {\n _this.handleError(error)\n }\n })\n }\n\n handleDecode(videoFrame) {\n if (!this.isInitInfo) {\n this.player.video.updateVideoInfo({\n width: videoFrame.codedWidth,\n height: videoFrame.codedHeight\n })\n this.player.video.initCanvasViewSize();\n this.isInitInfo = true;\n }\n\n if (!this.player._times.videoStart) {\n this.player._times.videoStart = now();\n this.player.handlePlayToRenderTimes();\n }\n\n this.player.handleRender();\n this.player.video.render({\n videoFrame\n })\n\n this.player.updateStats({fps: true, ts: 0, buf: this.player.demux.delay})\n\n // release resource\n setTimeout(function () {\n if (videoFrame.close) {\n videoFrame.close()\n } else {\n videoFrame.destroy()\n }\n }, 100)\n }\n\n handleError(error) {\n this.player.debug.log('Webcodecs', 'VideoDecoder handleError', error)\n }\n\n decodeVideo(payload, ts, isIframe) {\n // this.player.debug.log('Webcodecs decoder', 'decodeVideo', ts, isIframe);\n if (!this.hasInit) {\n if (isIframe && payload[1] === 0) {\n const videoCodec = (payload[0] & 0x0F);\n this.player.video.updateVideoInfo({\n encTypeCode: videoCodec\n })\n\n // 如果解码出来的是\n if (videoCodec === VIDEO_ENC_CODE.h265) {\n this.emit(EVENTS_ERROR.webcodecsH265NotSupport)\n return;\n }\n if (!this.player._times.decodeStart) {\n this.player._times.decodeStart = now();\n }\n\n const config = formatVideoDecoderConfigure(payload.slice(5));\n this.decoder.configure(config);\n this.hasInit = true;\n }\n } else {\n const chunk = new EncodedVideoChunk({\n data: payload.slice(5),\n timestamp: ts,\n type: isIframe ? ENCODED_VIDEO_TYPE.key : ENCODED_VIDEO_TYPE.delta\n })\n this.decoder.decode(chunk);\n }\n }\n\n\n}\n","const iconsMap = {\n play: '播放',\n pause: '暂停',\n audio: '',\n mute: '',\n screenshot: '截图',\n loading: '加载',\n fullscreen: '全屏',\n fullscreenExit: '退出全屏',\n record: '录制',\n recordStop: '停止录制',\n}\n\nexport default Object.keys(iconsMap).reduce((icons, key) => {\n icons[key] = `\n \n ${iconsMap[key] ? `${iconsMap[key]}` : ''}\n`;\n return icons;\n}, {});\n","import icons from './icons';\n\nexport default (player, control) => {\n\n if (player._opt.hasControl && player._opt.controlAutoHide) {\n player.$container.classList.add('jessibuca-controls-show-auto-hide');\n }\n else {\n player.$container.classList.add('jessibuca-controls-show');\n }\n const options = player._opt;\n const operateBtns = options.operateBtns;\n\n\n player.$container.insertAdjacentHTML(\n 'beforeend',\n `\n ${options.background ? `` : ''}\n \n ${icons.loading}\n ${options.loadingText ? `
${options.loadingText}
` : ''}\n
\n ${options.hasControl && operateBtns.play ? `` : ''}\n ${options.hasControl ? `\n \n
\n
\n ${options.showBandwidth ? `
` : ''}\n
\n
\n ${operateBtns.audio ? `\n
\n ${icons.audio}\n ${icons.mute}\n
\n
\n ` : ''}\n ${operateBtns.play ? `
${icons.play}
${icons.pause}
` : ''}\n ${operateBtns.screenshot ? `
${icons.screenshot}
` : ''}\n ${operateBtns.record ? `
${icons.record}
${icons.recordStop}
` : ''}\n ${operateBtns.fullscreen ? `
${icons.fullscreen}
${icons.fullscreenExit}
` : ''}\n
\n
\n
\n ` : ''}\n\n `\n )\n\n Object.defineProperty(control, '$poster', {\n value: player.$container.querySelector('.jessibuca-poster'),\n });\n\n Object.defineProperty(control, '$loading', {\n value: player.$container.querySelector('.jessibuca-loading'),\n });\n\n Object.defineProperty(control, '$play', {\n value: player.$container.querySelector('.jessibuca-play'),\n });\n\n Object.defineProperty(control, '$playBig', {\n value: player.$container.querySelector('.jessibuca-play-big'),\n });\n\n Object.defineProperty(control, '$pause', {\n value: player.$container.querySelector('.jessibuca-pause'),\n });\n\n Object.defineProperty(control, '$controls', {\n value: player.$container.querySelector('.jessibuca-controls'),\n });\n\n Object.defineProperty(control, '$fullscreen', {\n value: player.$container.querySelector('.jessibuca-fullscreen'),\n });\n\n Object.defineProperty(control, '$fullscreen', {\n value: player.$container.querySelector('.jessibuca-fullscreen'),\n });\n\n\n Object.defineProperty(control, '$volume', {\n value: player.$container.querySelector('.jessibuca-volume'),\n });\n\n Object.defineProperty(control, '$volumePanelWrap', {\n value: player.$container.querySelector('.jessibuca-volume-panel-wrap'),\n });\n\n Object.defineProperty(control, '$volumePanelText', {\n value: player.$container.querySelector('.jessibuca-volume-panel-text'),\n });\n\n Object.defineProperty(control, '$volumePanel', {\n value: player.$container.querySelector('.jessibuca-volume-panel'),\n });\n\n Object.defineProperty(control, '$volumeHandle', {\n value: player.$container.querySelector('.jessibuca-volume-panel-handle'),\n });\n\n Object.defineProperty(control, '$volumeOn', {\n value: player.$container.querySelector('.jessibuca-icon-audio'),\n });\n\n Object.defineProperty(control, '$volumeOff', {\n value: player.$container.querySelector('.jessibuca-icon-mute'),\n });\n\n\n Object.defineProperty(control, '$fullscreen', {\n value: player.$container.querySelector('.jessibuca-fullscreen'),\n });\n\n Object.defineProperty(control, '$fullscreenExit', {\n value: player.$container.querySelector('.jessibuca-fullscreen-exit'),\n });\n\n Object.defineProperty(control, '$record', {\n value: player.$container.querySelector('.jessibuca-record'),\n });\n Object.defineProperty(control, '$recordStop', {\n value: player.$container.querySelector('.jessibuca-record-stop'),\n });\n\n Object.defineProperty(control, '$screenshot', {\n value: player.$container.querySelector('.jessibuca-screenshot'),\n });\n\n Object.defineProperty(control, '$speed', {\n value: player.$container.querySelector('.jessibuca-speed'),\n });\n}\n","import {EVENTS} from \"../constant\";\nimport {bpsSize, getStyle, isBoolean, setStyle} from \"../utils\";\nimport screenfull from \"screenfull\";\n\nexport default (player, control) => {\n const {\n events: {proxy},\n } = player;\n\n const object = document.createElement('object');\n object.setAttribute('aria-hidden', 'true');\n object.setAttribute('tabindex', -1);\n object.type = 'text/html';\n object.data = 'about:blank';\n\n setStyle(object, {\n display: 'block',\n position: 'absolute',\n top: '0',\n left: '0',\n height: '100%',\n width: '100%',\n overflow: 'hidden',\n pointerEvents: 'none',\n zIndex: '-1',\n });\n\n let playerWidth = player.width;\n let playerHeight = player.height;\n\n proxy(object, 'load', () => {\n proxy(object.contentDocument.defaultView, 'resize', () => {\n if (player.width !== playerWidth || player.height !== playerHeight) {\n playerWidth = player.width;\n playerHeight = player.height;\n player.emit(EVENTS.resize);\n }\n });\n });\n player.$container.appendChild(object);\n\n player.on(EVENTS.destroy, () => {\n player.$container.removeChild(object);\n })\n\n function setVolumeHandle(percentage) {\n if (percentage === 0) {\n setStyle(control.$volumeOn, 'display', 'none');\n setStyle(control.$volumeOff, 'display', 'flex');\n setStyle(control.$volumeHandle, 'top', `${48}px`);\n } else {\n if (control.$volumeHandle && control.$volumePanel) {\n const panelHeight = getStyle(control.$volumePanel, 'height') || 60;\n const handleHeight = getStyle(control.$volumeHandle, 'height');\n const top = panelHeight - (panelHeight - handleHeight) * percentage - handleHeight;\n setStyle(control.$volumeHandle, 'top', `${top}px`);\n setStyle(control.$volumeOn, 'display', 'flex');\n setStyle(control.$volumeOff, 'display', 'none');\n }\n }\n control.$volumePanelText && (control.$volumePanelText.innerHTML = parseInt(percentage * 100))\n }\n\n player.on(EVENTS.volumechange, () => {\n setVolumeHandle(player.volume);\n });\n\n player.on(EVENTS.loading, (flag) => {\n setStyle(control.$loading, 'display', flag ? 'flex' : 'none');\n setStyle(control.$poster, 'display', 'none')\n\n if (flag) {\n setStyle(control.$playBig, 'display', 'none');\n }\n })\n\n const screenfullChange = (fullscreen) => {\n let isFullScreen = isBoolean(fullscreen) ? fullscreen : player.fullscreen\n setStyle(control.$fullscreenExit, 'display', isFullScreen ? 'flex' : 'none');\n setStyle(control.$fullscreen, 'display', isFullScreen ? 'none' : 'flex');\n // control.autoSize();\n };\n try {\n\n screenfull.on('change', screenfullChange);\n player.events.destroys.push(() => {\n screenfull.off('change', screenfullChange);\n });\n } catch (error) {\n //\n }\n\n //\n player.on(EVENTS.webFullscreen, (value) => {\n screenfullChange(value);\n })\n\n\n player.on(EVENTS.recording, () => {\n setStyle(control.$record, 'display', player.recording ? 'none' : 'flex');\n setStyle(control.$recordStop, 'display', player.recording ? 'flex' : 'none');\n })\n\n //\n player.on(EVENTS.recordingTimestamp, (timestamp) => {\n // console.log(timestamp);\n })\n\n player.on(EVENTS.playing, (flag) => {\n setStyle(control.$play, 'display', flag ? 'none' : 'flex');\n setStyle(control.$playBig, 'display', flag ? 'none' : 'block');\n setStyle(control.$pause, 'display', flag ? 'flex' : 'none');\n setStyle(control.$screenshot, 'display', flag ? 'flex' : 'none');\n setStyle(control.$record, 'display', flag ? 'flex' : 'none');\n setStyle(control.$fullscreen, 'display', flag ? 'flex' : 'none');\n\n // 不在播放\n if (!flag) {\n control.$speed && (control.$speed.innerHTML = bpsSize(''));\n }\n })\n\n\n player.on(EVENTS.kBps, (rate) => {\n const bps = bpsSize(rate);\n control.$speed && (control.$speed.innerHTML = bps);\n })\n}\n","export default (player, control) => {\n\n Object.defineProperty(control, 'controlsRect', {\n get: () => {\n return control.$controls.getBoundingClientRect();\n },\n });\n\n}\n","import {clamp, isMobile, setStyle} from \"../utils\";\n\nexport default (player, control) => {\n const {\n events: {proxy},\n debug\n } = player;\n\n function volumeChangeFromEvent(event) {\n const {bottom: panelBottom, height: panelHeight} = control.$volumePanel.getBoundingClientRect();\n const {height: handleHeight} = control.$volumeHandle.getBoundingClientRect();\n\n let moveLen = event.y;\n\n // if (isMobile() && player.fullscreen) {\n // moveLen = event.x;\n // }\n\n const percentage =\n clamp(panelBottom - moveLen - handleHeight / 2, 0, panelHeight - handleHeight / 2) / (panelHeight - handleHeight);\n return percentage;\n }\n\n //\n proxy(window, ['click', 'contextmenu'], event => {\n if (event.composedPath().indexOf(player.$container) > -1) {\n control.isFocus = true;\n } else {\n control.isFocus = false;\n }\n });\n\n //\n proxy(window, 'orientationchange', () => {\n setTimeout(() => {\n player.resize();\n }, 300);\n });\n\n\n proxy(control.$controls, 'click', (e) => {\n e.stopPropagation();\n })\n\n proxy(control.$pause, 'click', (e) => {\n player.pause();\n })\n // 监听 play 方法\n proxy(control.$play, 'click', (e) => {\n player.play();\n })\n\n // 监听 play 方法\n proxy(control.$playBig, 'click', (e) => {\n player.play();\n })\n\n proxy(control.$volume, 'mouseover', () => {\n control.$volumePanelWrap.classList.add('jessibuca-volume-panel-wrap-show');\n })\n\n proxy(control.$volume, 'mouseout', () => {\n control.$volumePanelWrap.classList.remove('jessibuca-volume-panel-wrap-show');\n })\n\n proxy(control.$volumeOn, 'click', (e) => {\n e.stopPropagation();\n setStyle(control.$volumeOn, 'display', 'none');\n setStyle(control.$volumeOff, 'display', 'block');\n player.lastVolume = player.volume;\n player.volume = 0;\n })\n\n proxy(control.$volumeOff, 'click', (e) => {\n e.stopPropagation();\n setStyle(control.$volumeOn, 'display', 'block');\n setStyle(control.$volumeOff, 'display', 'none');\n player.volume = player.lastVolume || 0.5;\n })\n\n proxy(control.$screenshot, 'click', (e) => {\n e.stopPropagation();\n player.video.screenshot();\n })\n\n proxy(control.$volumePanel, 'click', event => {\n event.stopPropagation();\n player.volume = volumeChangeFromEvent(event);\n });\n\n proxy(control.$volumeHandle, 'mousedown', () => {\n control.isVolumeDroging = true;\n });\n\n proxy(control.$volumeHandle, 'mousemove', event => {\n if (control.isVolumeDroging) {\n player.volume = volumeChangeFromEvent(event);\n }\n });\n\n proxy(document, 'mouseup', () => {\n if (control.isVolumeDroging) {\n control.isVolumeDroging = false;\n }\n });\n\n proxy(control.$record, 'click', (e) => {\n e.stopPropagation();\n player.recording = true;\n })\n\n proxy(control.$recordStop, 'click', (e) => {\n e.stopPropagation();\n player.recording = false;\n })\n\n proxy(control.$fullscreen, 'click', (e) => {\n e.stopPropagation();\n player.fullscreen = true;\n })\n\n proxy(control.$fullscreenExit, 'click', (e) => {\n e.stopPropagation();\n player.fullscreen = false;\n })\n\n if (player._opt.hasControl && player._opt.controlAutoHide) {\n //\n proxy(player.$container, 'mouseover', () => {\n if (!player.fullscreen) {\n setStyle(control.$controls, 'display', 'block');\n }\n })\n\n proxy(player.$container, 'mouseout', () => {\n setStyle(control.$controls, 'display', 'none');\n })\n }\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","// todo: 待定\nimport {HOT_KEY} from \"../constant\";\n\nexport default (player, control) => {\n const {\n events: {proxy}\n } = player;\n\n const keys = {};\n\n function addHotkey(key, event) {\n if (keys[key]) {\n keys[key].push(event);\n } else {\n keys[key] = [event];\n }\n }\n\n //\n addHotkey(HOT_KEY.esc, () => {\n if (player.fullscreen) {\n player.fullscreen = false;\n }\n })\n\n //\n addHotkey(HOT_KEY.arrowUp, () => {\n player.volume += 0.05;\n })\n\n //\n addHotkey(HOT_KEY.arrowDown, () => {\n player.volume -= 0.05;\n })\n\n proxy(window, 'keydown', event => {\n if (control.isFocus) {\n const tag = document.activeElement.tagName.toUpperCase();\n const editable = document.activeElement.getAttribute('contenteditable');\n if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {\n const events = keys[event.keyCode];\n if (events) {\n event.preventDefault();\n events.forEach(fn => fn());\n }\n }\n }\n });\n}\n","import template from \"./template\";\nimport observer from './observer';\nimport property from './property';\nimport events from './events';\nimport './style.scss'\nimport hotkey from \"./hotkey\";\n\nexport default class Control {\n constructor(player) {\n this.player = player;\n template(player, this);\n observer(player, this);\n property(player, this);\n events(player, this);\n if (player._opt.hotKey) {\n hotkey(player, this);\n }\n this.player.debug.log('Control', 'init');\n }\n\n destroy() {\n if (this.$poster) {\n this.player.$container.removeChild(this.$poster);\n }\n if (this.$loading) {\n this.player.$container.removeChild(this.$loading);\n }\n if (this.$controls) {\n this.player.$container.removeChild(this.$controls);\n }\n\n if(this.$playBig){\n this.player.$container.removeChild(this.$playBig);\n }\n\n this.player.debug.log('control', 'destroy');\n }\n\n autoSize() {\n const player = this.player;\n player.$container.style.padding = '0 0';\n const playerWidth = player.width;\n const playerHeight = player.height;\n const playerRatio = playerWidth / playerHeight;\n const canvasWidth = player.video.$videoElement.width;\n const canvasHeight = player.video.$videoElement.height;\n const canvasRatio = canvasWidth / canvasHeight;\n if (playerRatio > canvasRatio) {\n const padding = (playerWidth - playerHeight * canvasRatio) / 2;\n player.$container.style.padding = `0 ${padding}px`;\n } else {\n const padding = (playerHeight - playerWidth / canvasRatio) / 2;\n player.$container.style.padding = `${padding}px 0`;\n }\n }\n\n\n}\n","export default (player) => {\n\n const {\n _opt,\n debug,\n events: {proxy},\n } = player;\n\n\n if (_opt.supportDblclickFullscreen) {\n proxy(player.$container, 'dblclick', () => {\n player.fullscreen = !player.fullscreen;\n })\n }\n\n\n //\n proxy(document, 'visibilitychange', () => {\n if (_opt.hiddenAutoPause) {\n debug.log('visibilitychange', document.visibilityState, player._isPlayingBeforePageHidden)\n\n if (\"visible\" === document.visibilityState) {\n if (player._isPlayingBeforePageHidden) {\n player.play();\n }\n } else {\n player._isPlayingBeforePageHidden = player.playing;\n // hidden\n if (player.playing) {\n player.pause();\n }\n }\n }\n })\n\n proxy(window, 'fullscreenchange', () => {\n //\n if (player.keepScreenOn !== null && \"visible\" === document.visibilityState) {\n player.enableWakeLock();\n }\n })\n}\n","class MP4 {\n\n static init() {\n MP4.types = {\n avc1: [],\n avcC: [],\n hvc1: [],\n hvcC: [],\n btrt: [],\n dinf: [],\n dref: [],\n esds: [],\n ftyp: [],\n hdlr: [],\n mdat: [],\n mdhd: [],\n mdia: [],\n mfhd: [],\n minf: [],\n moof: [],\n moov: [],\n mp4a: [],\n mvex: [],\n mvhd: [],\n sdtp: [],\n stbl: [],\n stco: [],\n stsc: [],\n stsd: [],\n stsz: [],\n stts: [],\n tfdt: [],\n tfhd: [],\n traf: [],\n trak: [],\n trun: [],\n trex: [],\n tkhd: [],\n vmhd: [],\n smhd: []\n };\n\n for (let name in MP4.types) {\n if (MP4.types.hasOwnProperty(name)) {\n MP4.types[name] = [\n name.charCodeAt(0),\n name.charCodeAt(1),\n name.charCodeAt(2),\n name.charCodeAt(3)\n ];\n }\n }\n\n let constants = MP4.constants = {};\n\n constants.FTYP = new Uint8Array([\n 0x69, 0x73, 0x6F, 0x6D, // major_brand: isom\n 0x0, 0x0, 0x0, 0x1, // minor_version: 0x01\n 0x69, 0x73, 0x6F, 0x6D, // isom\n 0x61, 0x76, 0x63, 0x31 // avc1\n ]);\n\n constants.STSD_PREFIX = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]);\n\n constants.STTS = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n\n constants.STSC = constants.STCO = constants.STTS;\n\n constants.STSZ = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]);\n\n constants.HDLR_VIDEO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x56, 0x69, 0x64, 0x65,\n 0x6F, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler\n ]);\n\n constants.HDLR_AUDIO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6F, 0x75, 0x6E, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x53, 0x6F, 0x75, 0x6E,\n 0x64, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler\n ]);\n\n constants.DREF = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0C, // entry_size\n 0x75, 0x72, 0x6C, 0x20, // type 'url '\n 0x00, 0x00, 0x00, 0x01 // version(0) + flags\n ]);\n\n // Sound media header\n constants.SMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)\n ]);\n\n // video media header\n constants.VMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x01, // version(0) + flags\n 0x00, 0x00, // graphicsmode: 2 bytes\n 0x00, 0x00, 0x00, 0x00, // opcolor: 3 * 2 bytes\n 0x00, 0x00\n ]);\n }\n\n // Generate a box\n static box(type) {\n let size = 8;\n let result = null;\n let datas = Array.prototype.slice.call(arguments, 1);\n let arrayCount = datas.length;\n\n for (let i = 0; i < arrayCount; i++) {\n size += datas[i].byteLength;\n }\n\n result = new Uint8Array(size);\n result[0] = (size >>> 24) & 0xFF; // size\n result[1] = (size >>> 16) & 0xFF;\n result[2] = (size >>> 8) & 0xFF;\n result[3] = (size) & 0xFF;\n\n result.set(type, 4); // type\n\n let offset = 8;\n for (let i = 0; i < arrayCount; i++) { // data body\n result.set(datas[i], offset);\n offset += datas[i].byteLength;\n }\n\n return result;\n }\n\n // emit ftyp & moov\n static generateInitSegment(meta) {\n let ftyp = MP4.box(MP4.types.ftyp, MP4.constants.FTYP);\n let moov = MP4.moov(meta);\n\n let result = new Uint8Array(ftyp.byteLength + moov.byteLength);\n result.set(ftyp, 0);\n result.set(moov, ftyp.byteLength);\n return result;\n }\n\n // Movie metadata box\n static moov(meta) {\n let mvhd = MP4.mvhd(meta.timescale, meta.duration);\n let trak = MP4.trak(meta);\n let mvex = MP4.mvex(meta);\n return MP4.box(MP4.types.moov, mvhd, trak, mvex);\n }\n\n // Movie header box\n static mvhd(timescale, duration) {\n return MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0\n 0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n 0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----\n 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID\n ]));\n }\n\n // Track box\n static trak(meta) {\n return MP4.box(MP4.types.trak, MP4.tkhd(meta), MP4.mdia(meta));\n }\n\n // Track header box\n static tkhd(meta) {\n let trackId = meta.id, duration = meta.duration;\n let width = meta.presentWidth, height = meta.presentHeight;\n\n return MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x07, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (trackId >>> 24) & 0xFF, // track_ID: 4 bytes\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes)\n 0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes)\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n (width >>> 8) & 0xFF, // width and height\n (width) & 0xFF,\n 0x00, 0x00,\n (height >>> 8) & 0xFF,\n (height) & 0xFF,\n 0x00, 0x00\n ]));\n }\n\n static mdia(meta) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(meta), MP4.hdlr(meta), MP4.minf(meta))\n }\n\n // Media header box\n static mdhd(meta) {\n let timescale = meta.timescale;\n let duration = meta.duration;\n return MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x55, 0xC4, // language: und (undetermined)\n 0x00, 0x00 // pre_defined = 0\n ]));\n }\n\n // Media handler reference box\n static hdlr(meta) {\n let data = null;\n if (meta.type === 'audio') {\n data = MP4.constants.HDLR_AUDIO;\n } else {\n data = MP4.constants.HDLR_VIDEO;\n }\n return MP4.box(MP4.types.hdlr, data);\n }\n\n // Media infomation box\n static minf(meta) {\n let xmhd = null;\n if (meta.type === 'audio') {\n xmhd = MP4.box(MP4.types.smhd, MP4.constants.SMHD);\n } else {\n xmhd = MP4.box(MP4.types.vmhd, MP4.constants.VMHD);\n }\n return MP4.box(MP4.types.minf, xmhd, MP4.dinf(), MP4.stbl(meta));\n }\n\n // Data infomation box\n static dinf() {\n let result = MP4.box(MP4.types.dinf,\n MP4.box(MP4.types.dref, MP4.constants.DREF)\n );\n return result;\n }\n\n // Sample table box\n static stbl(meta) {\n let result = MP4.box(MP4.types.stbl, // type: stbl\n MP4.stsd(meta), // Sample Description Table\n MP4.box(MP4.types.stts, MP4.constants.STTS), // Time-To-Sample\n MP4.box(MP4.types.stsc, MP4.constants.STSC), // Sample-To-Chunk\n MP4.box(MP4.types.stsz, MP4.constants.STSZ), // Sample size\n MP4.box(MP4.types.stco, MP4.constants.STCO) // Chunk offset\n );\n return result;\n }\n\n // Sample description box\n static stsd(meta) {\n if (meta.type === 'audio') {\n // else: aac -> mp4a\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp4a(meta));\n } else {\n if (meta.videoType === 'avc') {\n //\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.avc1(meta));\n } else {\n //\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.hvc1(meta))\n }\n }\n }\n\n static mp4a(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types.mp4a, data, MP4.esds(meta));\n }\n\n static esds(meta) {\n let config = meta.config || [];\n let configSize = config.length;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version 0 + flags\n\n 0x03, // descriptor_type\n 0x17 + configSize, // length3\n 0x00, 0x01, // es_id\n 0x00, // stream_priority\n\n 0x04, // descriptor_type\n 0x0F + configSize, // length\n 0x40, // codec: mpeg4_audio\n 0x15, // stream_type: Audio\n 0x00, 0x00, 0x00, // buffer_size\n 0x00, 0x00, 0x00, 0x00, // maxBitrate\n 0x00, 0x00, 0x00, 0x00, // avgBitrate\n\n 0x05 // descriptor_type\n ].concat([\n configSize\n ]).concat(\n config\n ).concat([\n 0x06, 0x01, 0x02 // GASpecificConfig\n ]));\n return MP4.box(MP4.types.esds, data);\n }\n\n // avc\n static avc1(meta) {\n let avcc = meta.avcc;\n const width = meta.codecWidth;\n const height = meta.codecHeight;\n let data = new Uint8Array([\n 0, 0, 0, 0,\n 0, 0, 0, 1,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n width >>> 8 & 255,\n width & 255,\n height >>> 8 & 255,\n height & 255,\n 0, 72, 0, 0,\n 0, 72, 0, 0,\n 0, 0, 0, 0,\n 0, 1,\n 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0,\n 0, 24,\n 255, 255]\n );\n return MP4.box(MP4.types.avc1, data, MP4.box(MP4.types.avcC, avcc))\n }\n\n // hvc\n static hvc1(meta) {\n let avcc = meta.avcc;\n const width = meta.codecWidth;\n const height = meta.codecHeight;\n let data = new Uint8Array([\n 0, 0, 0, 0,\n 0, 0, 0, 1,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n width >>> 8 & 255,\n width & 255,\n height >>> 8 & 255,\n height & 255,\n 0, 72, 0, 0,\n 0, 72, 0, 0,\n 0, 0, 0, 0,\n 0, 1,\n 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0,\n 0, 24,\n 255, 255\n ]);\n return MP4.box(MP4.types.hvc1, data, MP4.box(MP4.types.hvcC, avcc))\n }\n\n // Movie Extends box\n static mvex(meta) {\n return MP4.box(MP4.types.mvex, MP4.trex(meta))\n }\n\n // Track Extends box\n static trex(meta) {\n let trackId = meta.id;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]);\n return MP4.box(MP4.types.trex, data);\n }\n\n // Movie fragment box\n static moof(track, baseMediaDecodeTime) {\n return MP4.box(MP4.types.moof, MP4.mfhd(track.sequenceNumber), MP4.traf(track, baseMediaDecodeTime))\n }\n //\n static mfhd(sequenceNumber) {\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n (sequenceNumber >>> 24) & 0xFF, // sequence_number: int32\n (sequenceNumber >>> 16) & 0xFF,\n (sequenceNumber >>> 8) & 0xFF,\n (sequenceNumber) & 0xFF\n ]);\n return MP4.box(MP4.types.mfhd, data);\n }\n\n // Track fragment box\n static traf(track, baseMediaDecodeTime) {\n let trackId = track.id;\n\n // Track fragment header box\n let tfhd = MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF\n ]));\n // Track Fragment Decode Time\n let tfdt = MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (baseMediaDecodeTime >>> 24) & 0xFF, // baseMediaDecodeTime: int32\n (baseMediaDecodeTime >>> 16) & 0xFF,\n (baseMediaDecodeTime >>> 8) & 0xFF,\n (baseMediaDecodeTime) & 0xFF\n ]));\n let sdtp = MP4.sdtp(track);\n let trun = MP4.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);\n\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun, sdtp);\n }\n\n // Sample Dependency Type box\n static sdtp(track) {\n let data = new Uint8Array(4 + 1);\n let flags = track.flags;\n data[4] = flags.isLeading << 6\n | flags.dependsOn << 4\n | flags.isDependedOn << 2\n | flags.hasRedundancy;\n return MP4.box(MP4.types.sdtp, data);\n }\n // trun\n static trun(track, offset) {\n let dataSize = 12 + 16;\n let data = new Uint8Array(dataSize);\n offset += 8 + dataSize;\n\n data.set([\n 0x00, 0x00, 0x0F, 0x01, // version(0) & flags\n 0x00, 0x00, 0x00, 0x01, // sample_count\n (offset >>> 24) & 0xFF, // data_offset\n (offset >>> 16) & 0xFF,\n (offset >>> 8) & 0xFF,\n (offset) & 0xFF\n ], 0);\n\n let duration = track.duration;\n let size = track.size;\n let flags = track.flags;\n let cts = track.cts;\n\n data.set([\n (duration >>> 24) & 0xFF, // sample_duration\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n (size >>> 24) & 0xFF, // sample_size\n (size >>> 16) & 0xFF,\n (size >>> 8) & 0xFF,\n (size) & 0xFF,\n (flags.isLeading << 2) | flags.dependsOn, // sample_flags\n (flags.isDependedOn << 6) | (flags.hasRedundancy << 4) | flags.isNonSync,\n 0x00, 0x00, // sample_degradation_priority\n (cts >>> 24) & 0xFF, // sample_composition_time_offset\n (cts >>> 16) & 0xFF,\n (cts >>> 8) & 0xFF,\n (cts) & 0xFF\n ], 12);\n\n return MP4.box(MP4.types.trun, data);\n }\n // mdat\n static mdat(data) {\n return MP4.box(MP4.types.mdat, data)\n }\n}\n\nMP4.init();\n\nexport default MP4;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n// Exponential-Golomb buffer decoder\nclass ExpGolomb {\n\n constructor(uint8array) {\n this.TAG = 'ExpGolomb';\n\n this._buffer = uint8array;\n this._buffer_index = 0;\n this._total_bytes = uint8array.byteLength;\n this._total_bits = uint8array.byteLength * 8;\n this._current_word = 0;\n this._current_word_bits_left = 0;\n }\n\n destroy() {\n this._buffer = null;\n }\n\n _fillCurrentWord() {\n let buffer_bytes_left = this._total_bytes - this._buffer_index;\n if (buffer_bytes_left <= 0) {\n // throw new IllegalStateException('ExpGolomb: _fillCurrentWord() but no bytes available');\n }\n\n let bytes_read = Math.min(4, buffer_bytes_left);\n let word = new Uint8Array(4);\n word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));\n this._current_word = new DataView(word.buffer).getUint32(0, false);\n\n this._buffer_index += bytes_read;\n this._current_word_bits_left = bytes_read * 8;\n }\n\n readBits(bits) {\n if (bits > 32) {\n // throw new InvalidArgumentException('ExpGolomb: readBits() bits exceeded max 32bits!');\n }\n\n if (bits <= this._current_word_bits_left) {\n let result = this._current_word >>> (32 - bits);\n this._current_word <<= bits;\n this._current_word_bits_left -= bits;\n return result;\n }\n\n let result = this._current_word_bits_left ? this._current_word : 0;\n result = result >>> (32 - this._current_word_bits_left);\n let bits_need_left = bits - this._current_word_bits_left;\n\n this._fillCurrentWord();\n let bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);\n\n let result2 = this._current_word >>> (32 - bits_read_next);\n this._current_word <<= bits_read_next;\n this._current_word_bits_left -= bits_read_next;\n\n result = (result << bits_read_next) | result2;\n return result;\n }\n\n readBool() {\n return this.readBits(1) === 1;\n }\n\n readByte() {\n return this.readBits(8);\n }\n\n _skipLeadingZero() {\n let zero_count;\n for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {\n if (0 !== (this._current_word & (0x80000000 >>> zero_count))) {\n this._current_word <<= zero_count;\n this._current_word_bits_left -= zero_count;\n return zero_count;\n }\n }\n this._fillCurrentWord();\n return zero_count + this._skipLeadingZero();\n }\n\n readUEG() { // unsigned exponential golomb\n let leading_zeros = this._skipLeadingZero();\n return this.readBits(leading_zeros + 1) - 1;\n }\n\n readSEG() { // signed exponential golomb\n let value = this.readUEG();\n if (value & 0x01) {\n return (value + 1) >>> 1;\n } else {\n return -1 * (value >>> 1);\n }\n }\n\n}\n\nexport default ExpGolomb;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExpGolomb from './exp-golomb.js';\n\nclass SPSParser {\n\n static _ebsp2rbsp(uint8array) {\n let src = uint8array;\n let src_length = src.byteLength;\n let dst = new Uint8Array(src_length);\n let dst_idx = 0;\n\n for (let i = 0; i < src_length; i++) {\n if (i >= 2) {\n // Unescape: Skip 0x03 after 00 00\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dst_idx] = src[i];\n dst_idx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dst_idx);\n }\n\n // 解析 SPS\n // https://zhuanlan.zhihu.com/p/27896239\n static parseSPS(uint8array) {\n let rbsp = SPSParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n gb.readByte();\n // 标识当前H.264码流的profile。\n // 我们知道,H.264中定义了三种常用的档次profile: 基准档次:baseline profile;主要档次:main profile; 扩展档次:extended profile;\n\n let profile_idc = gb.readByte(); // profile_idc\n gb.readByte(); // constraint_set_flags[5] + reserved_zero[3]\n // 标识当前码流的Level。编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。\n let level_idc = gb.readByte(); // level_idc\n // 表示当前的序列参数集的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。\n gb.readUEG(); // seq_parameter_set_id\n\n let profile_string = SPSParser.getProfileString(profile_idc);\n\n let level_string = SPSParser.getLevelString(level_idc);\n\n let chroma_format_idc = 1;\n let chroma_format = 420;\n let chroma_format_table = [0, 420, 422, 444];\n let bit_depth = 8;\n\n //\n if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 ||\n profile_idc === 244 || profile_idc === 44 || profile_idc === 83 ||\n profile_idc === 86 || profile_idc === 118 || profile_idc === 128 ||\n profile_idc === 138 || profile_idc === 144) {\n //\n chroma_format_idc = gb.readUEG();\n\n if (chroma_format_idc === 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n if (chroma_format_idc <= 3) {\n chroma_format = chroma_format_table[chroma_format_idc];\n }\n\n bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8\n gb.readUEG(); // bit_depth_chroma_minus8\n gb.readBits(1); // qpprime_y_zero_transform_bypass_flag\n if (gb.readBool()) { // seq_scaling_matrix_present_flag\n let scaling_list_count = (chroma_format_idc !== 3) ? 8 : 12;\n for (let i = 0; i < scaling_list_count; i++) {\n if (gb.readBool()) { // seq_scaling_list_present_flag\n if (i < 6) {\n SPSParser._skipScalingList(gb, 16);\n } else {\n SPSParser._skipScalingList(gb, 64);\n }\n }\n }\n }\n }\n // 用于计算MaxFrameNum的值。计算公式为MaxFrameNum = 2^(log2_max_frame_num_minus4 +\n gb.readUEG(); // log2_max_frame_num_minus4\n // 表示解码picture order count(POC)的方法。POC是另一种计量图像序号的方式,与frame_num有着不同的计算方法。该语法元素的取值为0、1或2。\n let pic_order_cnt_type = gb.readUEG();\n if (pic_order_cnt_type === 0) {\n gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4\n } else if (pic_order_cnt_type === 1) {\n gb.readBits(1); // delta_pic_order_always_zero_flag\n gb.readSEG(); // offset_for_non_ref_pic\n gb.readSEG(); // offset_for_top_to_bottom_field\n let num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();\n for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {\n gb.readSEG(); // offset_for_ref_frame\n }\n }\n // 用于表示参考帧的最大数目。\n let ref_frames = gb.readUEG(); // max_num_ref_frames\n // 标识位,说明frame_num中是否允许不连续的值。\n gb.readBits(1); // gaps_in_frame_num_value_allowed_flag\n // 用于计算图像的宽度。单位为宏块个数,因此图像的实际宽度为:\n let pic_width_in_mbs_minus1 = gb.readUEG();\n // 使用PicHeightInMapUnits来度量视频中一帧图像的高度。\n // PicHeightInMapUnits并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。PicHeightInMapUnits的计算方式为:\n let pic_height_in_map_units_minus1 = gb.readUEG();\n // 标识位,说明宏块的编码方式。当该标识位为0时,宏块可能为帧编码或场编码;\n // 该标识位为1时,所有宏块都采用帧编码。根据该标识位取值不同,PicHeightInMapUnits的含义也不同,\n // 为0时表示一场数据按宏块计算的高度,为1时表示一帧数据按宏块计算的高度。\n let frame_mbs_only_flag = gb.readBits(1);\n if (frame_mbs_only_flag === 0) {\n // 标识位,说明是否采用了宏块级的帧场自适应编码。当该标识位为0时,不存在帧编码和场编码之间的切换;当标识位为1时,宏块可能在帧编码和场编码模式之间进行选择。\n gb.readBits(1); // mb_adaptive_frame_field_flag\n }\n // 标识位,用于B_Skip、B_Direct模式运动矢量的推导计算。\n gb.readBits(1); // direct_8x8_inference_flag\n\n let frame_crop_left_offset = 0;\n let frame_crop_right_offset = 0;\n let frame_crop_top_offset = 0;\n let frame_crop_bottom_offset = 0;\n\n let frame_cropping_flag = gb.readBool();\n if (frame_cropping_flag) {\n frame_crop_left_offset = gb.readUEG();\n frame_crop_right_offset = gb.readUEG();\n frame_crop_top_offset = gb.readUEG();\n frame_crop_bottom_offset = gb.readUEG();\n }\n\n let sar_width = 1, sar_height = 1;\n let fps = 0, fps_fixed = true, fps_num = 0, fps_den = 0;\n // 标识位,说明SPS中是否存在VUI信息。\n let vui_parameters_present_flag = gb.readBool();\n if (vui_parameters_present_flag) {\n if (gb.readBool()) { // aspect_ratio_info_present_flag\n let aspect_ratio_idc = gb.readByte();\n let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n\n if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n sar_width = sar_w_table[aspect_ratio_idc - 1];\n sar_height = sar_h_table[aspect_ratio_idc - 1];\n } else if (aspect_ratio_idc === 255) {\n sar_width = gb.readByte() << 8 | gb.readByte();\n sar_height = gb.readByte() << 8 | gb.readByte();\n }\n }\n\n if (gb.readBool()) { // overscan_info_present_flag\n gb.readBool(); // overscan_appropriate_flag\n }\n if (gb.readBool()) { // video_signal_type_present_flag\n gb.readBits(4); // video_format & video_full_range_flag\n if (gb.readBool()) { // colour_description_present_flag\n gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients\n }\n }\n if (gb.readBool()) { // chroma_loc_info_present_flag\n gb.readUEG(); // chroma_sample_loc_type_top_field\n gb.readUEG(); // chroma_sample_loc_type_bottom_field\n }\n if (gb.readBool()) { // timing_info_present_flag\n let num_units_in_tick = gb.readBits(32);\n let time_scale = gb.readBits(32);\n fps_fixed = gb.readBool(); // fixed_frame_rate_flag\n\n fps_num = time_scale;\n fps_den = num_units_in_tick * 2;\n fps = fps_num / fps_den;\n }\n }\n\n let sarScale = 1;\n if (sar_width !== 1 || sar_height !== 1) {\n sarScale = sar_width / sar_height;\n }\n\n let crop_unit_x = 0, crop_unit_y = 0;\n if (chroma_format_idc === 0) {\n crop_unit_x = 1;\n crop_unit_y = 2 - frame_mbs_only_flag;\n } else {\n let sub_wc = (chroma_format_idc === 3) ? 1 : 2;\n let sub_hc = (chroma_format_idc === 1) ? 2 : 1;\n crop_unit_x = sub_wc;\n crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);\n }\n\n let codec_width = (pic_width_in_mbs_minus1 + 1) * 16;\n let codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);\n\n codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;\n codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;\n\n let present_width = Math.ceil(codec_width * sarScale);\n\n gb.destroy();\n gb = null;\n\n\n // 解析出来的SPS 内容。\n return {\n profile_string: profile_string, // baseline, high, high10, ...\n level_string: level_string, // 3, 3.1, 4, 4.1, 5, 5.1, ...\n bit_depth: bit_depth, // 8bit, 10bit, ...\n ref_frames: ref_frames,\n chroma_format: chroma_format, // 4:2:0, 4:2:2, ...\n chroma_format_string: SPSParser.getChromaFormatString(chroma_format),\n\n frame_rate: {\n fixed: fps_fixed,\n fps: fps,\n fps_den: fps_den,\n fps_num: fps_num\n },\n\n sar_ratio: {\n width: sar_width,\n height: sar_height\n },\n\n codec_size: {\n width: codec_width,\n height: codec_height\n },\n\n present_size: {\n width: present_width,\n height: codec_height\n }\n };\n }\n\n static _skipScalingList(gb, count) {\n let last_scale = 8, next_scale = 8;\n let delta_scale = 0;\n for (let i = 0; i < count; i++) {\n if (next_scale !== 0) {\n delta_scale = gb.readSEG();\n next_scale = (last_scale + delta_scale + 256) % 256;\n }\n last_scale = (next_scale === 0) ? last_scale : next_scale;\n }\n }\n\n // profile_idc = 66 → baseline profile;\n // profile_idc = 77 → main profile;\n // profile_idc = 88 → extended profile;\n // 在新版的标准中,还包括了High、High 10、High 4:2:2、High 4:4:4、High 10 Intra、High\n // 4:2:2 Intra、High 4:4:4 Intra、CAVLC 4:4:4 Intra\n static getProfileString(profile_idc) {\n switch (profile_idc) {\n case 66:\n return 'Baseline';\n case 77:\n return 'Main';\n case 88:\n return 'Extended';\n case 100:\n return 'High';\n case 110:\n return 'High10';\n case 122:\n return 'High422';\n case 244:\n return 'High444';\n default:\n return 'Unknown';\n }\n }\n\n static getLevelString(level_idc) {\n return (level_idc / 10).toFixed(1);\n }\n\n static getChromaFormatString(chroma) {\n switch (chroma) {\n case 420:\n return '4:2:0';\n case 422:\n return '4:2:2';\n case 444:\n return '4:4:4';\n default:\n return 'Unknown';\n }\n }\n\n}\n\nexport default SPSParser;","import SPSParser from './h264-sps-parser.js';\n\n//\nexport function parseAVCDecoderConfigurationRecord(arrayBuffer) {\n const meta = {}\n const v = new DataView(arrayBuffer.buffer);\n let version = v.getUint8(0); // configurationVersion\n let avcProfile = v.getUint8(1); // avcProfileIndication\n let profileCompatibility = v.getUint8(2); // profile_compatibil\n let avcLevel = v.getUint8(3); // AVCLevelIndication\n\n if (version !== 1 || avcProfile === 0) {\n // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');\n\n return;\n }\n\n const _naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne\n\n if (_naluLengthSize !== 3 && _naluLengthSize !== 4) { // holy shit!!!\n // this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${_naluLengthSize - 1}`);\n return;\n }\n let spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets\n\n if (spsCount === 0) {\n // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');\n return;\n } else if (spsCount > 1) {\n // Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: SPS Count = ${spsCount}`);\n }\n\n let offset = 6;\n for (let i = 0; i < spsCount; i++) {\n let len = v.getUint16(offset, false); // sequenceParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // Notice: Nalu without startcode header (00 00 00 01)\n let sps = new Uint8Array(arrayBuffer.buffer, offset, len);\n offset += len;\n // flv.js作者选择了自己来解析这个数据结构,也是迫不得已,因为JS环境下没有ffmpeg,解析这个结构主要是为了提取 sps和pps。虽然理论上sps允许有多个,但其实一般就一个。\n // packetTtype 为 1 表示 NALU,NALU= network abstract layer unit,这是H.264的概念,网络抽象层数据单元,其实简单理解就是一帧视频数据。\n // pps的信息没什么用,所以作者只实现了sps的分析器,说明作者下了很大功夫去学习264的标准,其中的Golomb解码还是挺复杂的,能解对不容易,我在PC和手机平台都是用ffmpeg去解析的。\n // SPS里面包括了视频分辨率,帧率,profile level等视频重要信息。\n let config = SPSParser.parseSPS(sps);\n if (i !== 0) {\n // ignore other sps's config\n continue;\n }\n\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n meta.frameRate = config.frame_rate;\n\n if (config.frame_rate.fixed === false ||\n config.frame_rate.fps_num === 0 ||\n config.frame_rate.fps_den === 0) {\n meta.frameRate = {};\n }\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n\n meta.refSampleDuration = meta.timescale * (fps_den / fps_num);\n\n let codecArray = sps.subarray(1, 4);\n\n let codecString = 'avc1.';\n for (let j = 0; j < 3; j++) {\n let h = codecArray[j].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n codecString += h;\n }\n // codec\n meta.codec = codecString;\n }\n\n let ppsCount = v.getUint8(offset); // numOfPictureParameterSets\n if (ppsCount === 0) {\n // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');\n return;\n } else if (ppsCount > 1) {\n // Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: PPS Count = ${ppsCount}`);\n }\n\n offset++;\n for (let i = 0; i < ppsCount; i++) {\n let len = v.getUint16(offset, false); // pictureParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n let pps = new Uint8Array(arrayBuffer.buffer, offset, len);\n\n // pps is useless for extracting video information\n offset += len;\n }\n\n meta.videoType = 'avc';\n\n // meta.avcc = arrayBuffer;\n return meta;\n}\n","class SPSParser {\n static parseSPS(uint8array) {\n\n }\n}\n\nexport default SPSParser\n","import {H265_NAL_TYPE} from \"../constant\";\nimport SPSParser from \"./h265-sps-parser\";\n\nexport function parseHEVCDecoderConfigurationRecord(arrayBuffer) {\n const meta = {}\n meta.videoType = 'hevc'\n let offset = 28 - 5;\n //\n const vpsTag = arrayBuffer[offset];\n\n if (vpsTag !== H265_NAL_TYPE.vps) {\n return meta;\n }\n\n offset += 2;\n offset += 1;\n const vpsLength = arrayBuffer[offset + 1] | (arrayBuffer[offset] << 8);\n offset += 2;\n const vpsData = arrayBuffer.slice(offset, (offset + vpsLength));\n console.log(Uint8Array.from(vpsData));\n offset += vpsLength;\n\n const spsTag = arrayBuffer[offset]\n if (spsTag !== H265_NAL_TYPE.sps) {\n return meta;\n }\n offset += 2;\n offset += 1;\n const spsLength = arrayBuffer[offset + 1] | (arrayBuffer[offset] << 8);\n\n offset += 2;\n const spsData = arrayBuffer.slice(offset, (offset + spsLength))\n console.log(Uint8Array.from(spsData));\n\n offset += spsLength;\n\n const ppsTag = arrayBuffer[offset];\n\n if (ppsTag !== H265_NAL_TYPE.pps) {\n return meta;\n }\n offset += 2;\n offset += 1;\n const ppsLength = arrayBuffer[offset + 1] | (arrayBuffer[offset] << 8);\n offset += 2;\n const ppsData = arrayBuffer.slice(offset, (offset + ppsLength))\n console.log(Uint8Array.from(ppsData));\n\n let sps = Uint8Array.from(spsData);\n let config = SPSParser.parseSPS(sps);\n\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n\n return meta;\n}\n","import Emitter from \"../utils/emitter\";\nimport {EVENTS, EVENTS_ERROR, FRAG_DURATION, MEDIA_SOURCE_STATE, MP4_CODECS, VIDEO_ENC_CODE} from \"../constant\";\nimport MP4 from \"../remux/fmp4-generator\";\nimport {parseAVCDecoderConfigurationRecord} from \"../utils/h264\";\nimport {parseHEVCDecoderConfigurationRecord} from \"../utils/h265\";\nimport {now} from \"../utils\";\n\nexport default class MseDecoder extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n this.isAvc = true;\n this.mediaSource = new window.MediaSource();\n this.sourceBuffer = null;\n this.hasInit = false;\n this.isInitInfo = false;\n this.cacheTrack = {};\n this.timeInit = false;\n this.sequenceNumber = 0;\n this.mediaSourceOpen = false;\n this.bufferList = [];\n this.dropping = false;\n this.player.video.$videoElement.src = window.URL.createObjectURL(this.mediaSource);\n const {\n debug,\n events: {proxy},\n } = player;\n\n\n proxy(this.mediaSource, 'sourceopen', () => {\n this.mediaSourceOpen = true;\n this.player.emit(EVENTS.mseSourceOpen)\n })\n\n proxy(this.mediaSource, 'sourceclose', () => {\n this.player.emit(EVENTS.mseSourceClose);\n })\n\n player.debug.log('MediaSource', 'init')\n }\n\n destroy() {\n this.stop();\n this.bufferList = [];\n this.mediaSource = null;\n this.mediaSourceOpen = false;\n this.sourceBuffer = null;\n this.hasInit = false;\n this.isInitInfo = false;\n this.sequenceNumber = 0;\n this.cacheTrack = null;\n this.timeInit = false;\n this.off();\n this.player.debug.log('MediaSource', 'destroy')\n }\n\n get state() {\n return this.mediaSource.readyState\n }\n\n get isStateOpen() {\n return this.state === MEDIA_SOURCE_STATE.open;\n }\n\n get isStateClosed() {\n return this.state === MEDIA_SOURCE_STATE.closed;\n }\n\n get isStateEnded() {\n return this.state === MEDIA_SOURCE_STATE.ended;\n }\n\n get duration() {\n return this.mediaSource.duration\n }\n\n set duration(duration) {\n this.mediaSource.duration = duration\n }\n\n decodeVideo(payload, ts, isIframe) {\n const player = this.player;\n\n if (!this.hasInit) {\n if (isIframe && payload[1] === 0) {\n const videoCodec = (payload[0] & 0x0F);\n player.video.updateVideoInfo({\n encTypeCode: videoCodec\n })\n\n // 如果解码出来的是\n if (videoCodec === VIDEO_ENC_CODE.h265) {\n this.emit(EVENTS_ERROR.mediaSourceH265NotSupport)\n return;\n }\n if (!player._times.decodeStart) {\n player._times.decodeStart = now();\n }\n\n this._decodeConfigurationRecord(payload, ts, isIframe, videoCodec)\n this.hasInit = true;\n }\n } else {\n this._decodeVideo(payload, ts, isIframe);\n }\n }\n\n _doDecode() {\n const bufferItem = this.bufferList.shift();\n if (bufferItem) {\n this._decodeVideo(bufferItem.payload, bufferItem.ts, bufferItem.isIframe);\n }\n }\n\n\n _decodeConfigurationRecord(payload, ts, isIframe, videoCodec) {\n let data = payload.slice(5);\n let config = {};\n\n if (videoCodec === VIDEO_ENC_CODE.h264) {\n config = parseAVCDecoderConfigurationRecord(data)\n } else if (videoCodec === VIDEO_ENC_CODE.h265) {\n config = parseHEVCDecoderConfigurationRecord(data);\n }\n const metaData = {\n id: 1, // video tag data\n type: 'video',\n timescale: 1000,\n duration: 0,\n avcc: data,\n codecWidth: config.codecWidth,\n codecHeight: config.codecHeight,\n videoType: config.videoType\n }\n // ftyp\n const metaBox = MP4.generateInitSegment(metaData);\n this.isAvc = true;\n this.appendBuffer(metaBox.buffer);\n this.sequenceNumber = 0;\n this.cacheTrack = null;\n this.timeInit = false;\n }\n\n //\n _decodeVideo(payload, ts, isIframe) {\n const player = this.player;\n let arrayBuffer = payload.slice(5);\n let bytes = arrayBuffer.byteLength;\n let cts = 0;\n let dts = ts;\n // player.debug.log('MediaSource', '_decodeVideo', ts);\n const $video = player.video.$videoElement;\n\n if ($video.buffered.length > 1) {\n this.removeBuffer($video.buffered.start(0), $video.buffered.end(0));\n this.timeInit = false;\n }\n if (this.dropping && dts - this.cacheTrack.dts > 1000) {\n this.dropping = false;\n this.cacheTrack = {};\n } else if (this.cacheTrack && dts > this.cacheTrack.dts) {\n // 需要额外加8个size\n let mdatBytes = 8 + this.cacheTrack.size;\n let mdatbox = new Uint8Array(mdatBytes);\n mdatbox[0] = mdatBytes >>> 24 & 255;\n mdatbox[1] = mdatBytes >>> 16 & 255;\n mdatbox[2] = mdatBytes >>> 8 & 255;\n mdatbox[3] = mdatBytes & 255;\n mdatbox.set(MP4.types.mdat, 4);\n mdatbox.set(this.cacheTrack.data, 8);\n\n this.cacheTrack.duration = dts - this.cacheTrack.dts;\n // moof\n let moofbox = MP4.moof(this.cacheTrack, this.cacheTrack.dts);\n let result = new Uint8Array(moofbox.byteLength + mdatbox.byteLength);\n result.set(moofbox, 0);\n result.set(mdatbox, moofbox.byteLength);\n // appendBuffer\n this.appendBuffer(result.buffer)\n player.handleRender();\n player.updateStats({fps: true, ts: ts, buf: player.demux.delay})\n if (!player._times.videoStart) {\n player._times.videoStart = now();\n player.handlePlayToRenderTimes()\n }\n } else {\n player.debug.log('MediaSource', 'timeInit set false , cacheTrack = {}');\n this.timeInit = false;\n this.cacheTrack = {};\n }\n\n this.cacheTrack.id = 1;\n this.cacheTrack.sequenceNumber = ++this.sequenceNumber;\n this.cacheTrack.size = bytes;\n this.cacheTrack.dts = dts;\n this.cacheTrack.cts = cts;\n this.cacheTrack.isKeyframe = isIframe;\n this.cacheTrack.data = arrayBuffer;\n //\n this.cacheTrack.flags = {\n isLeading: 0,\n dependsOn: isIframe ? 2 : 1,\n isDependedOn: isIframe ? 1 : 0,\n hasRedundancy: 0,\n isNonSync: isIframe ? 0 : 1\n }\n\n //\n if (!this.timeInit && $video.buffered.length === 1) {\n player.debug.log('MediaSource', 'timeInit set true');\n this.timeInit = true;\n $video.currentTime = $video.buffered.end(0);\n }\n\n if (!this.isInitInfo && $video.videoWidth > 0 && $video.videoHeight > 0) {\n player.debug.log('MediaSource', `updateVideoInfo: ${$video.videoWidth},${$video.videoHeight}`);\n player.video.updateVideoInfo({\n width: $video.videoWidth,\n height: $video.videoHeight\n })\n player.video.initCanvasViewSize();\n this.isInitInfo = true;\n }\n }\n\n appendBuffer(buffer) {\n const {\n debug,\n events: {proxy},\n } = this.player;\n\n if (this.sourceBuffer === null) {\n this.sourceBuffer = this.mediaSource.addSourceBuffer(MP4_CODECS.avc);\n proxy(this.sourceBuffer, 'error', (error) => {\n this.player.emit(EVENTS.mseSourceBufferError, error);\n // this.dropSourceBuffer(false)\n })\n }\n\n if (this.sourceBuffer.updating === false && this.isStateOpen) {\n this.sourceBuffer.appendBuffer(buffer);\n return;\n }\n\n if (this.isStateClosed) {\n this.player.emit(EVENTS.mseSourceBufferError, 'mediaSource is not attached to video or mediaSource is closed')\n } else if (this.isStateEnded) {\n this.player.emit(EVENTS.mseSourceBufferError, 'mediaSource is closed')\n } else {\n if (this.sourceBuffer.updating === true) {\n this.player.emit(EVENTS.mseSourceBufferBusy);\n // this.dropSourceBuffer(false);\n }\n }\n }\n\n stop() {\n if (this.isStateOpen) {\n if (this.sourceBuffer) {\n this.sourceBuffer.abort();\n }\n }\n this.endOfStream();\n }\n\n dropSourceBuffer(flag) {\n const video = this.player.video;\n const $video = video.$videoElement;\n this.dropping = flag;\n if ($video.buffered.length > 0) {\n if ($video.buffered.end(0) - $video.currentTime > 1) {\n $video.currentTime = $video.buffered.end(0);\n }\n }\n }\n\n\n removeBuffer(start, end) {\n\n if (this.isStateOpen && this.sourceBuffer.updating === false) {\n try {\n this.sourceBuffer.remove(start, end)\n } catch (e) {\n console.error(e)\n }\n }\n }\n\n endOfStream() {\n if (this.isStateOpen) {\n this.mediaSource.endOfStream();\n }\n }\n}\n","// tks: https://github.com/richtr/NoSleep.js\n\nconst WEBM = \"data:video/webm;base64,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\";\nconst MP4 = \"data:video/mp4;base64,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\";\n\n\n// Detect iOS browsers < version 10\nconst\n oldIOS = () =>\n typeof navigator !== \"undefined\" &&\n parseFloat(\n (\n \"\" +\n (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(\n navigator.userAgent\n ) || [0, \"\"])[1]\n )\n .replace(\"undefined\", \"3_2\")\n .replace(\"_\", \".\")\n .replace(\"_\", \"\")\n ) < 10 &&\n !window.MSStream;\n\n// Detect native Wake Lock API support\nconst nativeWakeLock = () => \"wakeLock\" in navigator;\n\nexport default class NoSleep {\n constructor(player) {\n this.player = player;\n this.enabled = false;\n if (nativeWakeLock()) {\n this._wakeLock = null;\n const handleVisibilityChange = () => {\n if (this._wakeLock !== null && document.visibilityState === \"visible\") {\n this.enable();\n }\n };\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n document.addEventListener(\"fullscreenchange\", handleVisibilityChange);\n } else if (oldIOS()) {\n this.noSleepTimer = null;\n } else {\n // Set up no sleep video element\n this.noSleepVideo = document.createElement(\"video\");\n\n this.noSleepVideo.setAttribute(\"title\", \"No Sleep\");\n this.noSleepVideo.setAttribute(\"playsinline\", \"\");\n\n this._addSourceToVideo(this.noSleepVideo, \"webm\", WEBM);\n this._addSourceToVideo(this.noSleepVideo, \"mp4\", MP4);\n\n this.noSleepVideo.addEventListener(\"loadedmetadata\", () => {\n if (this.noSleepVideo.duration <= 1) {\n // webm source\n this.noSleepVideo.setAttribute(\"loop\", \"\");\n } else {\n // mp4 source\n this.noSleepVideo.addEventListener(\"timeupdate\", () => {\n if (this.noSleepVideo.currentTime > 0.5) {\n this.noSleepVideo.currentTime = Math.random();\n }\n });\n }\n });\n }\n }\n\n _addSourceToVideo(element, type, dataURI) {\n var source = document.createElement(\"source\");\n source.src = dataURI;\n source.type = `video/${type}`;\n element.appendChild(source);\n }\n\n get isEnabled() {\n return this.enabled;\n }\n\n enable() {\n const debug = this.player.debug;\n if (nativeWakeLock()) {\n return navigator.wakeLock\n .request(\"screen\")\n .then((wakeLock) => {\n this._wakeLock = wakeLock;\n this.enabled = true;\n debug.log('wakeLock', 'Wake Lock active.')\n this._wakeLock.addEventListener(\"release\", () => {\n // ToDo: Potentially emit an event for the page to observe since\n // Wake Lock releases happen when page visibility changes.\n // (https://web.dev/wakelock/#wake-lock-lifecycle)\n debug.log('wakeLock', 'Wake Lock released.')\n });\n })\n .catch((err) => {\n this.enabled = false;\n debug.error('wakeLock', `${err.name}, ${err.message}`)\n throw err;\n });\n } else if (oldIOS()) {\n this.disable();\n this.noSleepTimer = window.setInterval(() => {\n if (!document.hidden) {\n window.location.href = window.location.href.split(\"#\")[0];\n window.setTimeout(window.stop, 0);\n }\n }, 15000);\n this.enabled = true;\n return Promise.resolve();\n } else {\n let playPromise = this.noSleepVideo.play();\n return playPromise\n .then((res) => {\n this.enabled = true;\n return res;\n })\n .catch((err) => {\n this.enabled = false;\n throw err;\n });\n }\n }\n\n disable() {\n const debug = this.player.debug;\n if (nativeWakeLock()) {\n if (this._wakeLock) {\n this._wakeLock.release();\n }\n this._wakeLock = null;\n } else if (oldIOS()) {\n if (this.noSleepTimer) {\n debug.warn('wakeLock', 'NoSleep now disabled for older iOS devices.')\n\n window.clearInterval(this.noSleepTimer);\n this.noSleepTimer = null;\n }\n } else {\n this.noSleepVideo.pause();\n }\n this.enabled = false;\n }\n}\n","import {DEFAULT_PLAYER_OPTIONS, EVENTS, EVENTS_ERROR, JESSIBUCA_EVENTS} from \"../constant\";\nimport Debug from \"../utils/debug\";\nimport Events from \"../utils/events\";\nimport property from './property';\nimport events from './events';\nimport {\n fpsStatus,\n initPlayTimes,\n isEmpty,\n isFullScreen, isMobile,\n isNotEmpty,\n now,\n supportMSE,\n supportOffscreenV2,\n supportWCS\n} from \"../utils\";\nimport Video from \"../video\";\nimport Audio from \"../audio\";\nimport Stream from \"../stream\";\nimport Recorder from \"../recorder\";\nimport DecoderWorker from \"../worker/index\";\nimport Emitter from \"../utils/emitter\";\nimport Demux from \"../demux\";\nimport WebcodecsDecoder from \"../decoder/webcodecs\";\nimport Control from \"../control\";\nimport './style.scss'\nimport observer from \"./observer\";\nimport MseDecoder from \"../decoder/mediaSource\";\nimport NoSleep from \"../utils/noSleep\";\n\nexport default class Player extends Emitter {\n constructor(container, options) {\n super()\n this.$container = container;\n this._opt = Object.assign({}, DEFAULT_PLAYER_OPTIONS, options)\n this.debug = new Debug(this);\n\n\n if (this._opt.useWCS) {\n this._opt.useWCS = supportWCS();\n }\n\n if (this._opt.useMSE) {\n this._opt.useMSE = supportMSE();\n }\n\n // 如果使用mse则强制不允许 webcodecs\n if (this._opt.useMSE) {\n if (this._opt.useWCS) {\n this.debug.log('Player', 'useWCS set true->false')\n }\n\n if (!this._opt.forceNoOffscreen) {\n this.debug.log('Player', 'forceNoOffscreen set false->true')\n }\n\n this._opt.useWCS = false;\n this._opt.forceNoOffscreen = true;\n } else if (this._opt.useWCS) {\n\n }\n\n\n if (!this._opt.forceNoOffscreen) {\n if (!supportOffscreenV2()) {\n this._opt.forceNoOffscreen = true;\n this._opt.useOffscreen = false;\n } else {\n this._opt.useOffscreen = true;\n }\n }\n\n if (!this._opt.hasAudio) {\n this._opt.operateBtns.audio = false\n }\n\n this._opt.hasControl = this._hasControl();\n //\n this._loading = false;\n this._playing = false;\n this._hasLoaded = false;\n\n //\n this._checkHeartTimeout = null;\n this._checkLoadingTimeout = null;\n\n //\n this._startBpsTime = null;\n this._isPlayingBeforePageHidden = false;\n this._stats = {\n buf: 0, // 当前缓冲区时长,单位毫秒,\n fps: 0, // 当前视频帧率\n abps: 0, // 当前音频码率,单位bit\n vbps: 0, // 当前视频码率,单位bit\n ts: 0 // 当前视频帧pts,单位毫秒\n }\n\n // 各个步骤的时间统计\n this._times = initPlayTimes();\n\n //\n this._videoTimestamp = 0;\n this._audioTimestamp = 0;\n\n property(this);\n\n this.events = new Events(this);\n this.video = new Video(this);\n\n if (this._opt.hasAudio) {\n this.audio = new Audio(this);\n }\n this.recorder = new Recorder(this);\n\n if (!this._onlyMseOrWcsVideo()) {\n this.decoderWorker = new DecoderWorker(this);\n } else {\n this.loaded = true;\n }\n\n this.stream = null;\n this.demux = null;\n\n if (this._opt.useWCS) {\n this.webcodecsDecoder = new WebcodecsDecoder(this)\n }\n\n if (this._opt.useMSE) {\n this.mseDecoder = new MseDecoder(this);\n }\n\n //\n this.control = new Control(this);\n\n this.keepScreenOn = new NoSleep(this);\n\n\n events(this);\n observer(this);\n\n\n if (this._opt.useWCS) {\n this.debug.log('Player', 'use WCS')\n }\n\n if (this._opt.useMSE) {\n this.debug.log('Player', 'use MSE')\n }\n\n if (this._opt.useOffscreen) {\n this.debug.log('Player', 'use offscreen')\n }\n\n this.debug.log('Player options', this._opt);\n }\n\n\n destroy() {\n this._loading = false;\n this._playing = false;\n this._hasLoaded = false;\n\n this._times = initPlayTimes();\n\n if (this.decoderWorker) {\n this.decoderWorker.destroy();\n this.decoderWorker = null;\n }\n if (this.video) {\n this.video.destroy();\n this.video = null;\n }\n\n if (this.audio) {\n this.audio.destroy();\n this.audio = null;\n }\n\n if (this.stream) {\n this.stream.destroy();\n this.stream = null;\n }\n\n if (this.recorder) {\n this.recorder.destroy();\n this.recorder = null;\n }\n\n if (this.control) {\n this.control.destroy();\n this.control = null;\n }\n\n if (this.webcodecsDecoder) {\n this.webcodecsDecoder.destroy();\n this.webcodecsDecoder = null;\n }\n\n if (this.mseDecoder) {\n this.mseDecoder.destroy();\n this.mseDecoder = null;\n }\n\n if (this.demux) {\n this.demux.destroy();\n this.demux = null;\n }\n\n\n if (this.events) {\n this.events.destroy();\n this.events = null;\n }\n\n this.clearCheckHeartTimeout();\n this.clearCheckLoadingTimeout();\n //\n this.releaseWakeLock();\n this.keepScreenOn = null;\n // reset stats\n this.resetStats();\n this._audioTimestamp = 0;\n this._videoTimestamp = 0;\n\n // 其他没法解耦的,通过 destroy 方式\n this.emit('destroy');\n // 接触所有绑定事件\n this.off();\n\n this.debug.log('play', 'destroy end');\n }\n\n set fullscreen(value) {\n if (isMobile()) {\n this.emit(EVENTS.webFullscreen, value);\n setTimeout(() => {\n this.updateOption({\n rotate: value ? 270 : 0,\n })\n this.resize();\n }, 10)\n } else {\n this.emit(EVENTS.fullscreen, value);\n }\n }\n\n get fullscreen() {\n return isFullScreen() || this.webFullscreen;\n }\n\n set webFullscreen(value) {\n this.emit(EVENTS.webFullscreen, value);\n }\n\n get webFullscreen() {\n return this.$container.classList.contains('jessibuca-fullscreen-web')\n }\n\n set loaded(value) {\n this._hasLoaded = value;\n }\n\n get loaded() {\n return this._hasLoaded;\n }\n\n //\n set playing(value) {\n\n if (value) {\n // 将loading 设置为 false\n this.loading = false;\n }\n\n if (this.playing !== value) {\n this._playing = value;\n this.emit(EVENTS.playing, value);\n this.emit(EVENTS.volumechange, this.volume);\n\n if (value) {\n this.emit(EVENTS.play);\n } else {\n this.emit(EVENTS.pause);\n }\n }\n\n }\n\n get playing() {\n return this._playing;\n }\n\n get volume() {\n return (this.audio && this.audio.volume) || 0;\n }\n\n set volume(value) {\n this.audio && this.audio.setVolume(value);\n }\n\n set loading(value) {\n if (this.loading !== value) {\n this._loading = value;\n this.emit(EVENTS.loading, this._loading);\n }\n }\n\n get loading() {\n return this._loading;\n }\n\n set recording(value) {\n if (this.playing) {\n if (value) {\n this.recorder.startRecord();\n } else {\n this.recorder.stopRecordAndSave();\n }\n }\n }\n\n get recording() {\n return this.recorder && this.recorder.recording;\n }\n\n set audioTimestamp(value) {\n if (value === null) {\n return;\n }\n this._audioTimestamp = value;\n }\n\n //\n get audioTimestamp() {\n return this._audioTimestamp;\n }\n\n //\n set videoTimestamp(value) {\n if (value === null) {\n return;\n }\n this._videoTimestamp = value;\n // just for wasm\n if (!this._opt.useWCS && !this._opt.useMSE) {\n if (this.audioTimestamp && this.videoTimestamp) {\n this.audio && this.audio.emit(EVENTS.videoSyncAudio, {\n audioTimestamp: this.audioTimestamp,\n videoTimestamp: this.videoTimestamp,\n diff: this.audioTimestamp - this.videoTimestamp\n })\n }\n }\n }\n\n //\n get videoTimestamp() {\n return this._videoTimestamp;\n }\n\n\n /**\n *\n * @param options\n */\n updateOption(options) {\n this._opt = Object.assign({}, this._opt, options)\n }\n\n /**\n *\n * @returns {Promise}\n */\n init() {\n return new Promise((resolve, reject) => {\n if (!this.stream) {\n this.stream = new Stream(this);\n }\n\n if (!this.demux) {\n this.demux = new Demux(this);\n }\n\n if (this._opt.useWCS) {\n if (!this.webcodecsDecoder) {\n this.webcodecsDecoder = new WebcodecsDecoder(this)\n }\n }\n\n if (this._opt.useMSE) {\n if (!this.mseDecoder) {\n this.mseDecoder = new MseDecoder(this);\n }\n }\n\n if (!this.decoderWorker && !this._onlyMseOrWcsVideo()) {\n this.decoderWorker = new DecoderWorker(this);\n\n this.once(EVENTS.decoderWorkerInit, () => {\n resolve()\n })\n } else {\n resolve()\n }\n\n })\n }\n\n\n /**\n *\n * @param url\n * @returns {Promise}\n */\n play(url) {\n return new Promise((resolve, reject) => {\n if (!url && !this._opt.url) {\n return reject();\n }\n\n this.loading = true;\n this.playing = false;\n this._times.playInitStart = now();\n if (!url) {\n url = this._opt.url;\n }\n this._opt.url = url;\n\n this.clearCheckHeartTimeout();\n\n this.init().then(() => {\n this._times.playStart = now();\n //\n if (this._opt.isNotMute) {\n this.mute(false);\n }\n\n\n if (this.webcodecsDecoder) {\n this.webcodecsDecoder.once(EVENTS_ERROR.webcodecsH265NotSupport, () => {\n this.emit(EVENTS_ERROR.webcodecsH265NotSupport)\n if (!this._opt.autoWasm) {\n this.emit(EVENTS.error, EVENTS_ERROR.webcodecsH265NotSupport);\n }\n })\n }\n\n if (this.mseDecoder) {\n this.mseDecoder.once(EVENTS_ERROR.mediaSourceH265NotSupport, () => {\n this.emit(EVENTS_ERROR.mediaSourceH265NotSupport)\n if (!this._opt.autoWasm) {\n this.emit(EVENTS.error, EVENTS_ERROR.mediaSourceH265NotSupport);\n }\n })\n }\n\n this.enableWakeLock();\n\n this.stream.fetchStream(url);\n\n //\n this.checkLoadingTimeout();\n // fetch error\n this.stream.once(EVENTS_ERROR.fetchError, (error) => {\n reject(error)\n })\n\n // ws\n this.stream.once(EVENTS_ERROR.websocketError, (error) => {\n reject(error)\n })\n\n // success\n this.stream.once(EVENTS.streamSuccess, () => {\n resolve();\n this._times.streamResponse = now();\n //\n this.video.play();\n })\n\n }).catch((e) => {\n reject(e)\n })\n })\n }\n\n /**\n *\n */\n close() {\n return new Promise((resolve, reject) => {\n this._close().then(() => {\n this.video.clearView();\n resolve()\n })\n })\n }\n\n _close() {\n return new Promise((resolve, reject) => {\n //\n if (this.stream) {\n this.stream.destroy();\n this.stream = null;\n }\n\n if (this.demux) {\n this.demux.destroy();\n this.demux = null;\n }\n\n //\n if (this.decoderWorker) {\n this.decoderWorker.destroy();\n this.decoderWorker = null;\n }\n\n if (this.webcodecsDecoder) {\n this.webcodecsDecoder.destroy();\n this.webcodecsDecoder = null;\n }\n\n if (this.mseDecoder) {\n this.mseDecoder.destroy();\n this.mseDecoder = null;\n }\n\n\n this.clearCheckHeartTimeout();\n this.clearCheckLoadingTimeout();\n this.playing = false;\n this.loading = false;\n this.recording = false;\n // release audio buffer\n this.audio && this.audio.pause();\n // release lock\n this.releaseWakeLock();\n // reset stats\n this.resetStats();\n //\n this._audioTimestamp = 0;\n this._videoTimestamp = 0;\n //\n this._times = initPlayTimes();\n //\n setTimeout(() => {\n resolve()\n }, 0)\n })\n }\n\n /**\n *\n * @param flag {boolean} 是否清除画面\n * @returns {Promise}\n */\n pause(flag) {\n if (flag) {\n return this.close();\n } else {\n return this._close();\n }\n }\n\n /**\n *\n * @param flag\n */\n mute(flag) {\n this.audio && this.audio.mute(flag)\n }\n\n /**\n *\n */\n resize() {\n this.video.resize();\n }\n\n /**\n *\n * @param fileName\n * @param fileType\n */\n startRecord(fileName, fileType) {\n if (this.recording) {\n return;\n }\n\n this.recorder.setFileName(fileName, fileType);\n this.recording = true;\n }\n\n /**\n *\n */\n stopRecordAndSave() {\n if (this.recording) {\n this.recording = false;\n }\n }\n\n _hasControl() {\n let result = false;\n\n let hasBtnShow = false;\n Object.keys(this._opt.operateBtns).forEach((key) => {\n if (this._opt.operateBtns[key]) {\n hasBtnShow = true;\n }\n });\n\n if (this._opt.showBandwidth || this._opt.text || hasBtnShow) {\n result = true;\n }\n\n return result;\n }\n\n _onlyMseOrWcsVideo() {\n return this._opt.hasAudio === false && (this._opt.useMSE || (this._opt.useWCS && !this._opt.useOffscreen))\n }\n\n checkHeart() {\n this.clearCheckHeartTimeout();\n this.checkHeartTimeout();\n }\n\n // 心跳检查,如果渲染间隔暂停了多少时间之后,就会抛出异常\n checkHeartTimeout() {\n this._checkHeartTimeout = setTimeout(() => {\n this.pause(false).then(() => {\n this.emit(EVENTS.timeout, EVENTS.delayTimeout);\n this.emit(EVENTS.delayTimeout);\n });\n }, this._opt.heartTimeout * 1000)\n }\n\n //\n clearCheckHeartTimeout() {\n if (this._checkHeartTimeout) {\n clearTimeout(this._checkHeartTimeout);\n this._checkHeartTimeout = null;\n }\n }\n\n // loading 等待时间\n checkLoadingTimeout() {\n this._checkLoadingTimeout = setTimeout(() => {\n this.pause(false).then(() => {\n this.emit(EVENTS.timeout, EVENTS.loadingTimeout);\n this.emit(EVENTS.loadingTimeout);\n });\n }, this._opt.loadingTimeout * 1000)\n }\n\n clearCheckLoadingTimeout() {\n if (this._checkLoadingTimeout) {\n clearTimeout(this._checkLoadingTimeout);\n this._checkLoadingTimeout = null;\n }\n }\n\n handleRender() {\n if (this.loading) {\n this.emit(EVENTS.start);\n this.loading = false;\n this.clearCheckLoadingTimeout();\n }\n if (!this.playing) {\n this.playing = true;\n }\n this.checkHeart();\n }\n\n\n //\n updateStats(options) {\n options = options || {};\n\n if (!this._startBpsTime) {\n this._startBpsTime = now();\n }\n\n if (isNotEmpty(options.ts)) {\n this._stats.ts = options.ts;\n }\n\n if (isNotEmpty(options.buf)) {\n this._stats.buf = options.buf;\n }\n\n if (options.fps) {\n this._stats.fps += 1;\n }\n if (options.abps) {\n this._stats.abps += options.abps;\n }\n if (options.vbps) {\n this._stats.vbps += options.vbps;\n }\n\n const _nowTime = now();\n const timestamp = _nowTime - this._startBpsTime;\n\n if (timestamp < 1 * 1000) {\n return;\n }\n\n this.emit(EVENTS.stats, this._stats);\n this.emit(EVENTS.performance, fpsStatus(this._stats.fps));\n this._stats.fps = 0;\n this._stats.abps = 0;\n this._stats.vbps = 0;\n this._startBpsTime = _nowTime;\n }\n\n resetStats() {\n this._startBpsTime = null;\n this._stats = {\n buf: 0, //ms\n fps: 0,\n abps: 0,\n vbps: 0,\n ts: 0\n }\n }\n\n enableWakeLock() {\n if (this._opt.keepScreenOn) {\n this.keepScreenOn.enable();\n }\n }\n\n releaseWakeLock() {\n if (this._opt.keepScreenOn) {\n this.keepScreenOn.disable();\n }\n }\n\n handlePlayToRenderTimes() {\n const _times = this._times;\n _times.playTimestamp = _times.playStart - _times.playInitStart;\n _times.streamTimestamp = _times.streamStart - _times.playStart;\n _times.streamResponseTimestamp = _times.streamResponse - _times.streamStart;\n _times.demuxTimestamp = _times.demuxStart - _times.streamResponse;\n _times.decodeTimestamp = _times.decodeStart - _times.demuxStart;\n _times.videoTimestamp = _times.videoStart - _times.decodeStart;\n _times.allTimestamp = _times.videoStart - _times.playInitStart;\n this.emit(EVENTS.playToRenderTimes, _times);\n }\n}\n","import Player from './player';\nimport Events from \"./utils/events\";\nimport {DEMUX_TYPE, EVENTS, EVENTS_ERROR, JESSIBUCA_EVENTS, PLAYER_PLAY_PROTOCOL, SCALE_MODE_TYPE} from \"./constant\";\nimport {isEmpty, isNotEmpty, supportWCS, uuid16} from \"./utils\";\nimport Emitter from \"./utils/emitter\";\n\n\nclass Jessibuca extends Emitter {\n static ERROR = EVENTS_ERROR\n\n static TIMEOUT = {\n loadingTimeout: EVENTS.loadingTimeout,\n delayTimeout: EVENTS.delayTimeout,\n }\n\n constructor(options) {\n super()\n let _opt = options;\n let $container = options.container;\n if (typeof options.container === 'string') {\n $container = document.querySelector(options.container);\n }\n if (!$container) {\n throw new Error('Jessibuca need container option');\n return;\n }\n\n $container.classList.add('jessibuca-container');\n\n delete _opt.container;\n\n // s -> ms\n if (isNotEmpty(_opt.videoBuffer)) {\n _opt.videoBuffer = Number(_opt.videoBuffer) * 1000\n }\n\n // setting\n if (isNotEmpty(_opt.timeout)) {\n if (isEmpty(_opt.loadingTimeout)) {\n _opt.loadingTimeout = _opt.timeout;\n }\n\n if (isEmpty(_opt.heartTimeout)) {\n _opt.heartTimeout = _opt.timeout\n }\n }\n\n this._opt = _opt;\n this.$container = $container;\n this._loadingTimeoutReplayTimes = 0;\n this._heartTimeoutReplayTimes = 0;\n this.events = new Events(this);\n this._initPlayer($container, _opt);\n }\n\n /**\n *\n */\n destroy() {\n if (this.events) {\n this.events.destroy();\n this.events = null;\n }\n\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n this.$container = null;\n this._opt = null;\n this._loadingTimeoutReplayTimes = 0;\n this._heartTimeoutReplayTimes = 0;\n this.off();\n }\n\n _initPlayer($container, options) {\n this.player = new Player($container, options);\n this._bindEvents();\n }\n\n _resetPlayer(options = {}) {\n this.player.destroy();\n this.player = null;\n const _options = Object.assign(this._opt, options);\n this._initPlayer(this.$container, _options);\n }\n\n _bindEvents() {\n // 对外的事件\n Object.keys(JESSIBUCA_EVENTS).forEach((key) => {\n this.player.on(JESSIBUCA_EVENTS[key], (value) => {\n this.emit(key, value)\n })\n })\n }\n\n /**\n * 是否开启控制台调试打印\n * @param value {Boolean}\n */\n setDebug(value) {\n this.player.updateOption({\n isDebug: !!value\n })\n }\n\n /**\n *\n */\n mute() {\n this.player.mute(true);\n }\n\n /**\n *\n */\n cancelMute() {\n this.player.mute(false);\n }\n\n /**\n *\n * @param value {number}\n */\n setVolume(value) {\n this.player.volume = value;\n }\n\n /**\n *\n */\n audioResume() {\n this.player.audio && this.player.audio.audioEnabled(true);\n }\n\n /**\n * 设置超时时长, 单位秒 在连接成功之前和播放中途,如果超过设定时长无数据返回,则回调timeout事件\n * @param value {number}\n */\n setTimeout(time) {\n time = Number(time);\n this.player.updateOption({\n timeout: time,\n loadingTimeout: time,\n heartTimeout: time\n })\n }\n\n /**\n *\n * @param type {number}: 0,1,2\n */\n setScaleMode(type) {\n type = Number(type);\n let options = {\n isFullResize: false,\n isResize: false\n }\n switch (type) {\n case SCALE_MODE_TYPE.full:\n options.isFullResize = false;\n options.isResize = false;\n break;\n case SCALE_MODE_TYPE.auto:\n options.isFullResize = false;\n options.isResize = true;\n break;\n case SCALE_MODE_TYPE.fullAuto:\n options.isFullResize = true;\n options.isResize = true;\n break;\n }\n\n this.player.updateOption(options);\n this.resize();\n }\n\n /**\n *\n * @returns {Promise}\n */\n pause() {\n return this.player.pause();\n }\n\n /**\n *\n */\n close() {\n // clear url\n this._opt.url = '';\n return this.player.close();\n }\n\n\n /**\n *\n */\n clearView() {\n this.player.video.clearView()\n }\n\n /**\n *\n * @param url {string}\n * @returns {Promise}\n */\n play(url) {\n return new Promise((resolve, reject) => {\n if (!url && !this._opt.url) {\n this.emit(EVENTS.error, EVENTS_ERROR.playError)\n reject();\n return;\n }\n\n if (url) {\n // url 相等的时候。\n if (this._opt.url) {\n // 存在相同的 url\n if (url === this._opt.url) {\n // 正在播放\n if (this.player.playing) {\n resolve();\n } else {\n // pause -> play\n this.clearView();\n this.player.play(this._opt.url).then(() => {\n resolve();\n }).catch(() => {\n this.player.pause().then(() => {\n reject();\n })\n })\n }\n } else {\n // url 发生改变了\n this.player.pause().then(() => {\n // 清除 画面\n this.clearView();\n return this._play(url);\n }).catch(() => {\n reject();\n })\n }\n } else {\n return this._play(url);\n }\n } else {\n // url 不存在的时候\n // 就是从 play -> pause -> play\n this.player.play(this._opt.url).then(() => {\n resolve();\n }).catch(() => {\n this.player.pause().then(() => {\n reject();\n })\n })\n }\n })\n }\n\n /**\n *\n * @param url {string}\n * @returns {Promise}\n * @private\n */\n _play(url) {\n return new Promise((resolve, reject) => {\n this._opt.url = url;\n // 新的url\n const isHttp = url.indexOf(\"http\") === 0;\n //\n const protocol = isHttp ? PLAYER_PLAY_PROTOCOL.fetch : PLAYER_PLAY_PROTOCOL.websocket\n //\n const demuxType = (isHttp || url.indexOf(\".flv\") !== -1 || this._opt.isFlv) ? DEMUX_TYPE.flv : DEMUX_TYPE.m7s;\n\n this.player.updateOption({\n protocol,\n demuxType\n })\n\n this.player.once(EVENTS_ERROR.mediaSourceH265NotSupport, () => {\n this.close().then(() => {\n if (this.player._opt.autoWasm) {\n this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play')\n this._resetPlayer({useMSE: false})\n this.play(url).then(() => {\n // resolve();\n this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play success')\n }).catch(() => {\n // reject();\n this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play error')\n });\n }\n });\n })\n\n this.player.once(EVENTS_ERROR.webcodecsH265NotSupport, () => {\n this.close().then(() => {\n if (this.player._opt.autoWasm) {\n this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play')\n this._resetPlayer({useWCS: false})\n this.play(url).then(() => {\n // resolve();\n this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play success')\n }).catch(() => {\n // reject();\n this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play error')\n });\n }\n });\n })\n\n // 解码报错。\n this.player.once(EVENTS_ERROR.wasmDecodeError, () => {\n if (this.player._opt.wasmDecodeErrorReplay) {\n this.close().then(() => {\n this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play')\n this._resetPlayer({useWCS: false})\n this.play(url).then(() => {\n // resolve();\n this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play success')\n }).catch(() => {\n // reject();\n this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play error')\n });\n })\n }\n })\n\n // 监听 delay timeout\n this.player.once(EVENTS.delayTimeout, () => {\n if (this.player._opt.heartTimeoutReplay && this._heartTimeoutReplayTimes < this.player._opt.heartTimeoutReplayTimes) {\n this._heartTimeoutReplayTimes += 1;\n this.play(url).then(() => {\n // resolve();\n this._heartTimeoutReplayTimes = 0;\n }).catch(() => {\n // reject();\n });\n }\n })\n\n // 监听 loading timeout\n this.player.once(EVENTS.loadingTimeout, () => {\n if (this.player._opt.loadingTimeoutReplay && this._loadingTimeoutReplayTimes < this.player._opt.loadingTimeoutReplayTimes) {\n this._loadingTimeoutReplayTimes += 1;\n this.play(url).then(() => {\n // resolve();\n this._loadingTimeoutReplayTimes = 0;\n }).catch(() => {\n // reject();\n });\n }\n })\n\n\n if (this.hasLoaded()) {\n this.player.play(url).then(() => {\n resolve();\n }).catch(() => {\n this.player.pause().then(() => {\n reject();\n })\n })\n } else {\n this.player.once(EVENTS.decoderWorkerInit, () => {\n this.player.play(url).then(() => {\n resolve();\n }).catch(() => {\n this.player.pause().then(() => {\n reject();\n })\n })\n })\n }\n })\n }\n\n /**\n *\n */\n resize() {\n this.player.resize();\n }\n\n /**\n *\n * @param time {number} s\n */\n setBufferTime(time) {\n time = Number(time)\n // s -> ms\n this.player.updateOption({\n videoBuffer: time * 1000\n })\n // update worker config\n this.player.decoderWorker && this.player.decoderWorker.updateWorkConfig({\n key: 'videoBuffer',\n value: time * 1000\n })\n }\n\n /**\n *\n * @param deg {number}\n */\n setRotate(deg) {\n deg = parseInt(deg, 10)\n const list = [0, 90, 270];\n if (this._opt.rotate === deg || list.indexOf(deg) === -1) {\n return;\n }\n this.player.updateOption({\n rotate: deg\n })\n this.resize();\n }\n\n /**\n *\n * @returns {boolean}\n */\n hasLoaded() {\n return this.player.loaded;\n }\n\n /**\n *\n */\n setKeepScreenOn() {\n this.player.updateOption({\n keepScreenOn: true\n })\n }\n\n /**\n *\n * @param flag {Boolean}\n */\n setFullscreen(flag) {\n const fullscreen = !!flag;\n if (this.player.fullscreen !== fullscreen) {\n this.player.fullscreen = fullscreen;\n }\n }\n\n /**\n *\n * @param filename {string}\n * @param format {string}\n * @param quality {number}\n * @param type {string} download,base64,blob\n */\n screenshot(filename, format, quality, type) {\n return this.player.video.screenshot(filename, format, quality, type)\n }\n\n /**\n *\n * @param fileName {string}\n * @param fileType {string}\n * @returns {Promise}\n */\n startRecord(fileName, fileType) {\n return new Promise((resolve, reject) => {\n if (this.player.playing) {\n this.player.startRecord(fileName, fileType)\n resolve();\n } else {\n reject();\n }\n })\n }\n\n stopRecordAndSave() {\n if (this.player.recording) {\n this.player.stopRecordAndSave();\n }\n }\n\n /**\n *\n * @returns {Boolean}\n */\n isPlaying() {\n return this.player.playing;\n }\n\n /**\n * 是否静音状态\n * @returns {Boolean}\n */\n isMute() {\n return this.player.audio ? this.player.audio.isMute : true;\n }\n\n /**\n * 是否在录制视频\n * @returns {*}\n */\n isRecording() {\n return this.player.recorder.recording;\n }\n\n\n}\n\n\nwindow.Jessibuca = Jessibuca;\n\nexport default Jessibuca;\n"],"names":["PLAYER_PLAY_PROTOCOL","websocket","fetch","DEMUX_TYPE","flv","m7s","DEFAULT_PLAYER_OPTIONS","videoBuffer","isResize","isFullResize","isFlv","debug","hotKey","loadingTimeout","heartTimeout","timeout","loadingTimeoutReplay","heartTimeoutReplay","loadingTimeoutReplayTimes","heartTimeoutReplayTimes","supportDblclickFullscreen","showBandwidth","keepScreenOn","isNotMute","hasAudio","hasVideo","operateBtns","fullscreen","screenshot","play","audio","record","controlAutoHide","hasControl","loadingText","background","decoder","url","rotate","forceNoOffscreen","hiddenAutoPause","protocol","demuxType","useWCS","wcsUseVideoRender","useMSE","useOffscreen","autoWasm","wasmDecodeErrorReplay","openWebglAlignment","WORKER_CMD_TYPE","init","initVideo","render","playAudio","initAudio","kBps","decode","audioCode","videoCode","wasmError","WASM_ERROR","invalidNalUnitSize","MEDIA_TYPE","video","FLV_MEDIA_TYPE","WORKER_SEND_TYPE","audioDecode","videoDecode","close","updateConfig","EVENTS","webFullscreen","decoderWorkerInit","playing","pause","mute","load","loading","videoInfo","timeUpdate","audioInfo","log","error","delayTimeout","stats","performance","recording","recordingTimestamp","recordStart","recordEnd","recordCreateError","buffer","videoFrame","start","metadata","resize","streamEnd","streamSuccess","streamMessage","streamError","volumechange","destroy","mseSourceOpen","mseSourceClose","mseSourceBufferError","mseSourceBufferBusy","videoWaiting","videoTimeUpdate","videoSyncAudio","playToRenderTimes","JESSIBUCA_EVENTS","EVENTS_ERROR","playError","fetchError","websocketError","webcodecsH265NotSupport","mediaSourceH265NotSupport","wasmDecodeError","WEBSOCKET_STATUS","notConnect","open","SCREENSHOT_TYPE","download","base64","blob","VIDEO_ENC_TYPE","VIDEO_ENC_CODE","h264","h265","AUDIO_ENC_TYPE","H265_NAL_TYPE","vps","sps","pps","CONTROL_HEIGHT","SCALE_MODE_TYPE","full","auto","fullAuto","FILE_SUFFIX","mp4","webm","CANVAS_RENDER_TYPE","webcodecs","webgl","offscreen","ENCODED_VIDEO_TYPE","key","delta","MP4_CODECS","avc","hev","MEDIA_SOURCE_STATE","ended","closed","AUDIO_SYNC_VIDEO_DIFF","HOT_KEY","esc","arrowUp","arrowDown","Debug","constructor","master","name","_opt","args","console","warn","Events","destroys","proxy","bind","target","callback","option","Array","isArray","map","item","addEventListener","removeEventListener","push","forEach","event","player","Object","defineProperty","get","clientRect","$container","getBoundingClientRect","width","Math","max","clientWidth","height","clientHeight","rect","noop","supportOffscreen","$canvas","transferControlToOffscreen","supportOffscreenV2","OffscreenCanvas","createContextGL","gl","validContextNames","nameIndex","length","contextName","contextOptions","preserveDrawingBuffer","getContext","e","getParameter","dataURLToFile","dataURL","arr","split","bstr","atob","type","replace","n","u8arr","Uint8Array","charCodeAt","File","downloadImg","content","fileName","aLink","document","createElement","href","URL","createObjectURL","click","setTimeout","revokeObjectURL","isIOS","now","Date","getTime","WebAssembly","instantiate","module","Module","of","Instance","clamp","num","a","b","min","setStyle","element","value","keys","style","getStyle","numberType","getComputedStyle","getPropertyValue","parseFloat","getNowTime","calculationRate","totalSize","lastTime","size","thisTime","diffTime","downloadRecord","suffix","window","isMobile","test","navigator","userAgent","toLowerCase","UA","supportWCS","formatVideoDecoderConfigure","avcC","codecArray","subarray","codecString","j","h","toString","codec","description","isFullScreen","mozIsFullScreen","webkitIsFullScreen","bpsSize","toFixed","fpsStatus","fps","result","createEmptyImageBitmap","$canvasElement","createImageBitmap","supportMSE","MediaSource","isTypeSupported","isEmpty","undefined","isBoolean","isNotEmpty","initPlayTimes","playInitStart","playStart","streamStart","streamResponse","demuxStart","decodeStart","videoStart","playTimestamp","streamTimestamp","streamResponseTimestamp","demuxTimestamp","decodeTimestamp","videoTimestamp","allTimestamp","screenfullChange","emit","screenfull","on","events","off","loaded","request","then","catch","exit","classList","add","remove","ignoreList","includes","Emitter","fn","ctx","once","self","listener","apply","_","evtArr","slice","data","i","evts","liveEvents","len","vertexShaderScript","join","fragmentShaderScript","pixelStorei","UNPACK_ALIGNMENT","vertexShader","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","FRAGMENT_SHADER","program","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","useProgram","vertexPosBuffer","createBuffer","bindBuffer","ARRAY_BUFFER","bufferData","Float32Array","STATIC_DRAW","vertexPosRef","getAttribLocation","enableVertexAttribArray","vertexAttribPointer","FLOAT","texturePosBuffer","texturePosRef","_initTexture","index","textureRef","createTexture","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","uniform1i","getUniformLocation","yTextureRef","uTextureRef","vTextureRef","w","y","u","v","viewport","activeTexture","TEXTURE0","texImage2D","LUMINANCE","UNSIGNED_BYTE","TEXTURE1","TEXTURE2","drawArrays","TRIANGLE_STRIP","deleteProgram","deleteBuffer","deleteTexture","CommonLoader","updateVideoInfo","encTypeCode","encType","CanvasVideoLoader","position","top","left","$videoElement","appendChild","context2D","contextGl","contextGlRender","contextGlDestroy","bitmaprenderer","renderType","_initCanvasRender","removeChild","_initContextGl","createWebGL","_initContext2D","_supportOffscreen","_bindOffscreen","initCanvasViewSize","msg","ts","transferFromImageBitmap","output","drawImage","filename","format","quality","formatType","png","jpeg","webp","encoderOptions","Number","toDataURL","file","clearView","imageBitMap","clear","COLOR_BUFFER_BIT","clearRect","resizeWidth","resizeHeight","wScale","hScale","scale","transform","VideoLoader","muted","trackGenerator","MediaStreamTrackGenerator","kind","srcObject","MediaStream","vwriter","writable","getWriter","src","$video","canvas","videoWidth","videoHeight","context","write","objectFill","objectFit","Video","Loader","getLoaderFactory","opt","AudioContextLoader","bufferList","scriptNode","hasInitScriptNode","audioContextChannel","audioContext","AudioContext","webkitAudioContext","gainNode","createGain","source","createBufferSource","connect","destination","noteOn","audioBufferSourceNode","mediaStreamAudioDestinationNode","createMediaStreamDestination","audioEnabled","gain","audioSyncVideoOption","diff","channels","sampleRate","options","closeAudio","onaudioprocess","updateAudioInfo","isPlaying","isMute","isStateSuspended","volume","bufferSize","initScriptNode","createScriptProcessor","audioProcessingEvent","outputBuffer","bufferItem","shift","audioTimestamp","channel","nowBuffering","getChannelData","flag","setVolume","isNaN","setValueAtTime","currentTime","disconnect","state","resume","suspend","isStateRunning","Audio","FetchLoader","abortController","AbortController","streamRate","rate","abort","fetchStream","demux","_times","signal","res","reader","body","getReader","fetchNext","read","done","byteLength","dispatch","WebsocketLoader","socket","socketStatus","wsUrl","_createWebSocket","WebSocket","binaryType","_handleMessage","message","Stream","global","RecordRTCLoader","fileType","isRecording","recordingInterval","_reset","setFileName","recordTime","startRecord","mimeType","onTimeStamp","timestamp","disableLogs","stream","captureStream","audioStream","getAudioTracks","audioTrack","enabled","addTrack","recorder","RecordRTC","startRecording","setInterval","stopRecordAndSave","stopRecording","getBlob","clearInterval","Recorder","DecoderWorker","decoderWorker","Worker","_initDecoderWorker","postMessage","cmd","terminate","onmessage","_initWork","code","handleRender","updateStats","buf","delay","handlePlayToRenderTimes","indexOf","JSON","stringify","decodeVideo","arrayBuffer","isIFrame","decodeAudio","_decodeAudioNoDelay","_decodeAudio","updateWorkConfig","config","stopId","firstTimestamp","startTimestamp","dropping","initInterval","getDelay","resetDelay","_loop","payload","_doDecoderDecode","_doDecode","pushBuffer","webcodecsDecoder","mseDecoder","FlvLoader","input","_inputFlv","flvDemux","dispatchFlvData","tmp","ArrayBuffer","tmp8","tmp32","Uint32Array","t","abps","vbps","need","next","combine","set","remain","return","M7sLoader","dv","DataView","getUint8","getUint32","isIframe","Demux","WebcodecsDecoder","hasInit","isInitInfo","initDecoder","_this","VideoDecoder","handleDecode","handleError","codedWidth","codedHeight","videoCodec","configure","chunk","EncodedVideoChunk","iconsMap","fullscreenExit","recordStop","reduce","icons","control","insertAdjacentHTML","querySelector","object","setAttribute","display","overflow","pointerEvents","zIndex","playerWidth","playerHeight","contentDocument","defaultView","setVolumeHandle","percentage","$volumeOn","$volumeOff","$volumeHandle","$volumePanel","panelHeight","handleHeight","$volumePanelText","innerHTML","parseInt","$loading","$poster","$playBig","$fullscreenExit","$fullscreen","$record","$recordStop","$play","$pause","$screenshot","$speed","bps","$controls","volumeChangeFromEvent","bottom","panelBottom","moveLen","composedPath","isFocus","stopPropagation","$volume","$volumePanelWrap","lastVolume","isVolumeDroging","addHotkey","tag","activeElement","tagName","toUpperCase","editable","getAttribute","keyCode","preventDefault","Control","template","observer","property","hotkey","autoSize","padding","playerRatio","canvasWidth","canvasHeight","canvasRatio","visibilityState","_isPlayingBeforePageHidden","enableWakeLock","MP4","types","avc1","hvc1","hvcC","btrt","dinf","dref","esds","ftyp","hdlr","mdat","mdhd","mdia","mfhd","minf","moof","moov","mp4a","mvex","mvhd","sdtp","stbl","stco","stsc","stsd","stsz","stts","tfdt","tfhd","traf","trak","trun","trex","tkhd","vmhd","smhd","hasOwnProperty","constants","FTYP","STSD_PREFIX","STTS","STSC","STCO","STSZ","HDLR_VIDEO","HDLR_AUDIO","DREF","SMHD","VMHD","box","datas","prototype","call","arguments","arrayCount","offset","generateInitSegment","meta","timescale","duration","trackId","id","presentWidth","presentHeight","xmhd","videoType","channelCount","audioSampleRate","configSize","concat","avcc","codecWidth","codecHeight","track","baseMediaDecodeTime","sequenceNumber","flags","isLeading","dependsOn","isDependedOn","hasRedundancy","dataSize","cts","isNonSync","ExpGolomb","uint8array","TAG","_buffer","_buffer_index","_total_bytes","_total_bits","_current_word","_current_word_bits_left","_fillCurrentWord","buffer_bytes_left","bytes_read","word","readBits","bits","bits_need_left","bits_read_next","result2","readBool","readByte","_skipLeadingZero","zero_count","readUEG","leading_zeros","readSEG","SPSParser","_ebsp2rbsp","src_length","dst","dst_idx","parseSPS","rbsp","gb","profile_idc","level_idc","profile_string","getProfileString","level_string","getLevelString","chroma_format_idc","chroma_format","chroma_format_table","bit_depth","scaling_list_count","_skipScalingList","pic_order_cnt_type","num_ref_frames_in_pic_order_cnt_cycle","ref_frames","pic_width_in_mbs_minus1","pic_height_in_map_units_minus1","frame_mbs_only_flag","frame_crop_left_offset","frame_crop_right_offset","frame_crop_top_offset","frame_crop_bottom_offset","frame_cropping_flag","sar_width","sar_height","fps_fixed","fps_num","fps_den","vui_parameters_present_flag","aspect_ratio_idc","sar_w_table","sar_h_table","num_units_in_tick","time_scale","sarScale","crop_unit_x","crop_unit_y","sub_wc","sub_hc","codec_width","codec_height","present_width","ceil","chroma_format_string","getChromaFormatString","frame_rate","fixed","sar_ratio","codec_size","present_size","count","last_scale","next_scale","delta_scale","chroma","parseAVCDecoderConfigurationRecord","version","avcProfile","_naluLengthSize","spsCount","getUint16","profile","level","bitDepth","chromaFormat","sarRatio","frameRate","refSampleDuration","ppsCount","parseHEVCDecoderConfigurationRecord","vpsTag","vpsLength","vpsData","from","spsTag","spsLength","spsData","ppsTag","ppsLength","ppsData","MseDecoder","isAvc","mediaSource","sourceBuffer","cacheTrack","timeInit","mediaSourceOpen","stop","readyState","isStateOpen","isStateClosed","isStateEnded","_decodeConfigurationRecord","_decodeVideo","metaData","metaBox","appendBuffer","bytes","dts","buffered","removeBuffer","end","mdatBytes","mdatbox","moofbox","isKeyframe","addSourceBuffer","updating","endOfStream","dropSourceBuffer","WEBM","oldIOS","exec","MSStream","nativeWakeLock","NoSleep","_wakeLock","handleVisibilityChange","enable","noSleepTimer","noSleepVideo","_addSourceToVideo","random","dataURI","isEnabled","wakeLock","err","disable","hidden","location","Promise","resolve","playPromise","release","Player","container","assign","_hasControl","_loading","_playing","_hasLoaded","_checkHeartTimeout","_checkLoadingTimeout","_startBpsTime","_stats","_videoTimestamp","_audioTimestamp","_onlyMseOrWcsVideo","clearCheckHeartTimeout","clearCheckLoadingTimeout","releaseWakeLock","resetStats","updateOption","contains","reject","checkLoadingTimeout","_close","hasBtnShow","text","checkHeart","checkHeartTimeout","clearTimeout","_nowTime","Jessibuca","ERROR","TIMEOUT","Error","_loadingTimeoutReplayTimes","_heartTimeoutReplayTimes","_initPlayer","_bindEvents","_resetPlayer","_options","setDebug","isDebug","cancelMute","audioResume","time","setScaleMode","_play","isHttp","hasLoaded","setBufferTime","setRotate","deg","list","setKeepScreenOn","setFullscreen"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"jessibuca.js","sources":["../../node_modules/@babel/runtime/helpers/defineProperty.js","../../src/constant/index.js","../../src/utils/debug.js","../../src/utils/events.js","../../src/player/property.js","../../node_modules/screenfull/dist/screenfull.js","../../src/utils/index.js","../../src/player/events.js","../../src/utils/emitter.js","../../src/utils/webgl.js","../../src/video/commonLoader.js","../../src/video/canvasLoader.js","../../src/video/videoLoader.js","../../src/video/index.js","../../src/audio/audioContextLoader.js","../../src/audio/index.js","../../src/stream/fetchLoader.js","../../src/stream/websocketLoader.js","../../src/stream/index.js","../../node_modules/recordrtc/RecordRTC.js","../../src/recorder/recordRTCLoader.js","../../src/recorder/index.js","../../src/worker/index.js","../../src/demux/commonLoader.js","../../src/demux/flvLoader.js","../../src/demux/m7sLoader.js","../../src/demux/index.js","../../src/decoder/webcodecs.js","../../src/control/icons.js","../../src/control/template.js","../../src/control/observer.js","../../src/control/property.js","../../src/control/events.js","../../node_modules/style-inject/dist/style-inject.es.js","../../src/control/hotkey.js","../../src/control/index.js","../../src/player/observer.js","../../src/remux/fmp4-generator.js","../../src/utils/exp-golomb.js","../../src/utils/h264-sps-parser.js","../../src/utils/h264.js","../../src/utils/h265-sps-parser.js","../../src/utils/h265.js","../../src/decoder/mediaSource.js","../../src/utils/noSleep.js","../../src/player/index.js","../../src/jessibuca.js"],"sourcesContent":["function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// 播放协议\nexport const PLAYER_PLAY_PROTOCOL = {\n websocket: 0,\n fetch: 1\n}\n\nexport const DEMUX_TYPE = {\n flv: 'flv',\n m7s: 'm7s'\n}\n\n\n// default player options\nexport const DEFAULT_PLAYER_OPTIONS = {\n videoBuffer: 1000, //1000ms == 1 second\n isResize: true,\n isFullResize: false, //\n isFlv: false,\n debug: false,\n hotKey: false, // 快捷键\n loadingTimeout: 10, // loading timeout\n heartTimeout: 5, // heart timeout\n timeout: 10, // second\n loadingTimeoutReplay: false, // loading timeout replay\n heartTimeoutReplay: false,// heart timeout replay。\n loadingTimeoutReplayTimes: 3, // loading timeout replay fail times\n heartTimeoutReplayTimes: 3, // heart timeout replay fail times\n supportDblclickFullscreen: false,\n showBandwidth: false, //\n keepScreenOn: false,\n isNotMute: false,\n hasAudio: true,\n hasVideo: true,\n operateBtns: {\n fullscreen: false,\n screenshot: false,\n play: false,\n audio: false,\n record: false,\n },\n controlAutoHide: false,\n hasControl: false,\n loadingText: '',\n background: '',\n decoder: 'decoder.js',\n url: '',//\n rotate: 0,\n // text: '',\n forceNoOffscreen: true, // 默认是不采用\n hiddenAutoPause: false,\n protocol: PLAYER_PLAY_PROTOCOL.fetch,\n demuxType: DEMUX_TYPE.flv, //\n useWCS: false, //\n wcsUseVideoRender: false,\n useMSE: false, //\n useOffscreen: false, //\n autoWasm: true, // 自动降级到 wasm 模式\n wasmDecodeErrorReplay: true, // 解码失败重新播放。\n openWebglAlignment: false,// https://github.com/langhuihui/jessibuca/issues/152\n}\n\n\nexport const WORKER_CMD_TYPE = {\n init: 'init',\n initVideo: 'initVideo',\n render: 'render',\n playAudio: 'playAudio',\n initAudio: 'initAudio',\n kBps: 'kBps',\n decode: 'decode',\n audioCode: 'audioCode',\n videoCode: 'videoCode',\n wasmError: 'wasmError'\n}\n\nexport const WASM_ERROR = {\n invalidNalUnitSize: 'Invalid NAL unit size',\n // errorSplittingTheInputIntoNALUnits: 'Error splitting the input into NAL units'\n}\n\nexport const MEDIA_TYPE = {\n audio: 1,\n video: 2\n}\n\nexport const FLV_MEDIA_TYPE = {\n audio: 8,\n video: 9\n}\n\nexport const WORKER_SEND_TYPE = {\n init: 'init',\n decode: 'decode',\n audioDecode: 'audioDecode',\n videoDecode: 'videoDecode',\n close: 'close',\n updateConfig: 'updateConfig'\n}\n\n\n//\nexport const EVENTS = {\n fullscreen: 'fullscreen$2',\n webFullscreen: 'webFullscreen',\n decoderWorkerInit: 'decoderWorkerInit',\n play: 'play',\n playing: 'playing',\n pause: 'pause',\n mute: 'mute',\n load: 'load',\n loading: 'loading',\n videoInfo: 'videoInfo',\n timeUpdate: 'timeUpdate',\n audioInfo: \"audioInfo\",\n log: 'log',\n error: \"error\",\n kBps: 'kBps',\n timeout: 'timeout',\n delayTimeout: 'delayTimeout',\n loadingTimeout: 'loadingTimeout',\n stats: 'stats',\n performance: \"performance\",\n record: 'record',\n recording: 'recording',\n recordingTimestamp: 'recordingTimestamp',\n recordStart: 'recordStart',\n recordEnd: 'recordEnd',\n recordCreateError: 'recordCreateError',\n buffer: 'buffer',\n videoFrame: 'videoFrame',\n start: 'start',\n metadata: 'metadata',\n resize: 'resize',\n streamEnd: 'streamEnd',\n streamSuccess: 'streamSuccess',\n streamMessage: 'streamMessage',\n streamError: 'streamError',\n volumechange: 'volumechange',\n destroy: 'destroy',\n mseSourceOpen: 'mseSourceOpen',\n mseSourceClose: 'mseSourceClose',\n mseSourceBufferError: 'mseSourceBufferError',\n mseSourceBufferBusy: 'mseSourceBufferBusy',\n videoWaiting: 'videoWaiting',\n videoTimeUpdate: 'videoTimeUpdate',\n videoSyncAudio: 'videoSyncAudio',\n playToRenderTimes: 'playToRenderTimes'\n}\n\n\nexport const JESSIBUCA_EVENTS = {\n load: EVENTS.load,\n timeUpdate: EVENTS.timeUpdate,\n videoInfo: EVENTS.videoInfo,\n audioInfo: EVENTS.audioInfo,\n error: EVENTS.error,\n kBps: EVENTS.kBps,\n log: EVENTS.log,\n start: EVENTS.start,\n timeout: EVENTS.timeout,\n loadingTimeout: EVENTS.loadingTimeout,\n delayTimeout: EVENTS.delayTimeout,\n fullscreen: 'fullscreen',\n play: EVENTS.play,\n pause: EVENTS.pause,\n mute: EVENTS.mute,\n stats: EVENTS.stats,\n performance: EVENTS.performance,\n recordingTimestamp: EVENTS.recordingTimestamp,\n recordStart: EVENTS.recordStart,\n recordEnd: EVENTS.recordEnd,\n playToRenderTimes: EVENTS.playToRenderTimes\n}\n\nexport const EVENTS_ERROR = {\n playError: 'playIsNotPauseOrUrlIsNull',\n fetchError: \"fetchError\",\n websocketError: 'websocketError',\n webcodecsH265NotSupport: 'webcodecsH265NotSupport',\n mediaSourceH265NotSupport: 'mediaSourceH265NotSupport',\n wasmDecodeError: 'wasmDecodeError'\n}\n\n\nexport const WEBSOCKET_STATUS = {\n notConnect: 'notConnect',\n open: 'open',\n close: 'close',\n error: 'error'\n}\n\nexport const BUFFER_STATUS = {\n empty: 'empty',\n buffering: 'buffering',\n full: 'full'\n}\n\n\nexport const SCREENSHOT_TYPE = {\n download: 'download',\n base64: 'base64',\n blob: 'blob'\n}\n\n\nexport const VIDEO_ENC_TYPE = {\n 7: 'H264(AVC)', //\n 12: 'H265(HEVC)' //\n}\n\nexport const VIDEO_ENC_CODE = {\n h264: 7,\n h265: 12\n}\n\n\nexport const AUDIO_ENC_TYPE = {\n 10: 'AAC',\n 7: 'ALAW',\n 8: 'MULAW'\n}\n\nexport const H265_NAL_TYPE = {\n vps: 32,\n sps: 33,\n pps: 34\n}\n\nexport const CONTROL_HEIGHT = 38\n\nexport const SCALE_MODE_TYPE = {\n full: 0, // 视频画面完全填充canvas区域,画面会被拉伸\n auto: 1, // 视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边\n fullAuto: 2 // 视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全\n}\n\n\nexport const FILE_SUFFIX = {\n mp4: 'mp4',\n webm: 'webm'\n};\n\n\nexport const CANVAS_RENDER_TYPE = {\n webcodecs: 'webcodecs',\n webgl: 'webgl',\n offscreen: 'offscreen'\n}\n\nexport const ENCODED_VIDEO_TYPE = {\n key: 'key',\n delta: 'delta'\n}\n\n\nexport const MP4_CODECS = {\n avc: 'video/mp4; codecs=\"avc1.64002A\"',\n hev: 'video/mp4; codecs=\"hev1.1.6.L123.b0\"',\n}\n\n\nexport const MEDIA_SOURCE_STATE = {\n ended: 'ended',\n open: 'open',\n closed: 'closed'\n}\n\n\n// frag duration\nexport const FRAG_DURATION = Math.ceil(1000 / 25)\n\n\nexport const AUDIO_SYNC_VIDEO_DIFF = 1000;\n\n\nexport const HOT_KEY = {\n esc: 27, //\n arrowUp: 38, //\n arrowDown: 40, //\n}\n","export default class Debug {\n constructor(master) {\n this.log = (name, ...args) => {\n if (master._opt.debug) {\n console.log(`Jessibuca: [${name}]`, ...args);\n }\n };\n\n this.warn = (name, ...args) => {\n if (master._opt.debug) {\n console.warn(`Jessibuca: [${name}]`, ...args);\n }\n };\n\n this.error = (name, ...args) => {\n if (master._opt.debug) {\n console.error(`Jessibuca: [${name}]`, ...args);\n }\n };\n }\n}\n","export default class Events {\n constructor(master) {\n this.destroys = [];\n this.proxy = this.proxy.bind(this);\n this.master = master;\n }\n\n proxy(target, name, callback, option = {}) {\n if (!target) {\n return;\n }\n if (Array.isArray(name)) {\n return name.map(item => this.proxy(target, item, callback, option));\n }\n target.addEventListener(name, callback, option);\n const destroy = () => target.removeEventListener(name, callback, option);\n this.destroys.push(destroy);\n return destroy;\n }\n\n destroy() {\n this.master.debug && this.master.debug.log(`Events`, 'destroy');\n this.destroys.forEach(event => event());\n }\n}\n","export default (player) => {\n Object.defineProperty(player, 'rect', {\n get: () => {\n const clientRect = player.$container.getBoundingClientRect()\n clientRect.width = Math.max(clientRect.width, player.$container.clientWidth);\n clientRect.height = Math.max(clientRect.height, player.$container.clientHeight);\n return clientRect;\n },\n });\n\n ['bottom', 'height', 'left', 'right', 'top', 'width'].forEach(key => {\n Object.defineProperty(player, key, {\n get: () => {\n return player.rect[key];\n },\n });\n });\n}\n","/*!\n* screenfull\n* v5.1.0 - 2020-12-24\n* (c) Sindre Sorhus; MIT License\n*/\n(function () {\n\t'use strict';\n\n\tvar document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};\n\tvar isCommonjs = typeof module !== 'undefined' && module.exports;\n\n\tvar fn = (function () {\n\t\tvar val;\n\n\t\tvar fnMap = [\n\t\t\t[\n\t\t\t\t'requestFullscreen',\n\t\t\t\t'exitFullscreen',\n\t\t\t\t'fullscreenElement',\n\t\t\t\t'fullscreenEnabled',\n\t\t\t\t'fullscreenchange',\n\t\t\t\t'fullscreenerror'\n\t\t\t],\n\t\t\t// New WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullscreen',\n\t\t\t\t'webkitExitFullscreen',\n\t\t\t\t'webkitFullscreenElement',\n\t\t\t\t'webkitFullscreenEnabled',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t// Old WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullScreen',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitCurrentFullScreenElement',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t[\n\t\t\t\t'mozRequestFullScreen',\n\t\t\t\t'mozCancelFullScreen',\n\t\t\t\t'mozFullScreenElement',\n\t\t\t\t'mozFullScreenEnabled',\n\t\t\t\t'mozfullscreenchange',\n\t\t\t\t'mozfullscreenerror'\n\t\t\t],\n\t\t\t[\n\t\t\t\t'msRequestFullscreen',\n\t\t\t\t'msExitFullscreen',\n\t\t\t\t'msFullscreenElement',\n\t\t\t\t'msFullscreenEnabled',\n\t\t\t\t'MSFullscreenChange',\n\t\t\t\t'MSFullscreenError'\n\t\t\t]\n\t\t];\n\n\t\tvar i = 0;\n\t\tvar l = fnMap.length;\n\t\tvar ret = {};\n\n\t\tfor (; i < l; i++) {\n\t\t\tval = fnMap[i];\n\t\t\tif (val && val[1] in document) {\n\t\t\t\tfor (i = 0; i < val.length; i++) {\n\t\t\t\t\tret[fnMap[0][i]] = val[i];\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t})();\n\n\tvar eventNameMap = {\n\t\tchange: fn.fullscreenchange,\n\t\terror: fn.fullscreenerror\n\t};\n\n\tvar screenfull = {\n\t\trequest: function (element, options) {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tvar onFullScreenEntered = function () {\n\t\t\t\t\tthis.off('change', onFullScreenEntered);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenEntered);\n\n\t\t\t\telement = element || document.documentElement;\n\n\t\t\t\tvar returnPromise = element[fn.requestFullscreen](options);\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenEntered).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\texit: function () {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tif (!this.isFullscreen) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar onFullScreenExit = function () {\n\t\t\t\t\tthis.off('change', onFullScreenExit);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenExit);\n\n\t\t\t\tvar returnPromise = document[fn.exitFullscreen]();\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenExit).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\ttoggle: function (element, options) {\n\t\t\treturn this.isFullscreen ? this.exit() : this.request(element, options);\n\t\t},\n\t\tonchange: function (callback) {\n\t\t\tthis.on('change', callback);\n\t\t},\n\t\tonerror: function (callback) {\n\t\t\tthis.on('error', callback);\n\t\t},\n\t\ton: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.addEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\toff: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.removeEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\traw: fn\n\t};\n\n\tif (!fn) {\n\t\tif (isCommonjs) {\n\t\t\tmodule.exports = {isEnabled: false};\n\t\t} else {\n\t\t\twindow.screenfull = {isEnabled: false};\n\t\t}\n\n\t\treturn;\n\t}\n\n\tObject.defineProperties(screenfull, {\n\t\tisFullscreen: {\n\t\t\tget: function () {\n\t\t\t\treturn Boolean(document[fn.fullscreenElement]);\n\t\t\t}\n\t\t},\n\t\telement: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\treturn document[fn.fullscreenElement];\n\t\t\t}\n\t\t},\n\t\tisEnabled: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\t// Coerce to boolean in case of old WebKit\n\t\t\t\treturn Boolean(document[fn.fullscreenEnabled]);\n\t\t\t}\n\t\t}\n\t});\n\n\tif (isCommonjs) {\n\t\tmodule.exports = screenfull;\n\t} else {\n\t\twindow.screenfull = screenfull;\n\t}\n})();\n","import {MP4_CODECS, FILE_SUFFIX} from \"../constant\";\n\nexport function noop() {\n}\n\n\nexport function supportOffscreen($canvas) {\n return typeof $canvas.transferControlToOffscreen === 'function';\n}\n\n\nexport function supportOffscreenV2() {\n return typeof OffscreenCanvas !== \"undefined\";\n}\n\n\nexport function createContextGL($canvas) {\n let gl = null;\n\n const validContextNames = [\"webgl\", \"experimental-webgl\", \"moz-webgl\", \"webkit-3d\"];\n let nameIndex = 0;\n\n while (!gl && nameIndex < validContextNames.length) {\n const contextName = validContextNames[nameIndex];\n\n try {\n let contextOptions = {preserveDrawingBuffer: true};\n gl = $canvas.getContext(contextName, contextOptions);\n } catch (e) {\n gl = null;\n }\n\n if (!gl || typeof gl.getParameter !== \"function\") {\n gl = null;\n }\n\n ++nameIndex;\n }\n\n\n return gl;\n}\n\n\nexport function audioContextUnlock(context) {\n context.resume();\n const source = context.createBufferSource();\n source.buffer = context.createBuffer(1, 1, 22050);\n source.connect(context.destination);\n if (source.noteOn) {\n source.noteOn(0);\n } else {\n source.start(0);\n }\n}\n\nexport function dataURLToFile(dataURL = '') {\n const arr = dataURL.split(\",\");\n const bstr = atob(arr[1]);\n const type = arr[0].replace(\"data:\", \"\").replace(\";base64\", \"\")\n let n = bstr.length, u8arr = new Uint8Array(n);\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n return new File([u8arr], 'file', {type});\n}\n\nexport function downloadFile(file, fileName) {\n if (file instanceof Blob || file instanceof File) {\n file = new Blob([file]);\n }\n const aLink = document.createElement(\"a\");\n aLink.download = fileName;\n aLink.href = file;\n aLink.click();\n}\n\n\nexport function downloadImg(content, fileName) {\n const aLink = document.createElement(\"a\");\n aLink.download = fileName;\n aLink.href = URL.createObjectURL(content);\n aLink.click();\n setTimeout(() => {\n URL.revokeObjectURL(content);\n }, isIOS() ? 1000 : 0)\n}\n\nexport function checkFull() {\n let isFull = document.fullscreenElement || window.webkitFullscreenElement || document.msFullscreenElement;\n if (isFull === undefined) isFull = false;\n return !!isFull;\n}\n\nexport function now() {\n return new Date().getTime();\n}\n\nexport const supportedWasm = (() => {\n try {\n if (typeof WebAssembly === \"object\"\n && typeof WebAssembly.instantiate === \"function\") {\n const module = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00));\n if (module instanceof WebAssembly.Module)\n return new WebAssembly.Instance(module) instanceof WebAssembly.Instance;\n }\n } catch (e) {\n }\n return false;\n})();\n\nexport function clamp(num, a, b) {\n return Math.max(Math.min(num, Math.max(a, b)), Math.min(a, b));\n}\n\nexport function setStyle(element, key, value) {\n if (!element) {\n return\n }\n if (typeof key === 'object') {\n Object.keys(key).forEach(item => {\n setStyle(element, item, key[item]);\n });\n }\n element.style[key] = value;\n return element;\n}\n\n\nexport function getStyle(element, key, numberType = true) {\n if (!element) {\n return 0\n }\n\n const value = getComputedStyle(element, null).getPropertyValue(key);\n return numberType ? parseFloat(value) : value;\n}\n\nexport function getNowTime() {\n if (performance && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n}\n\nexport function calculationRate(callback) {\n let totalSize = 0;\n let lastTime = getNowTime();\n return size => {\n totalSize += size;\n const thisTime = getNowTime();\n const diffTime = thisTime - lastTime;\n if (diffTime >= 1000) {\n callback((totalSize / diffTime) * 1000);\n lastTime = thisTime;\n totalSize = 0;\n }\n };\n}\n\nexport function downloadRecord(blob, name, suffix) {\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = (name || now()) + '.' + (suffix || FILE_SUFFIX.webm);\n a.click();\n setTimeout(() => {\n window.URL.revokeObjectURL(url);\n }, isIOS() ? 1000 : 0)\n}\n\nexport const env = '__ENV__';\n\nexport function isMobile() {\n return (/iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(window.navigator.userAgent.toLowerCase()));\n}\n\nexport function isAndroid() {\n const UA = window.navigator.userAgent.toLowerCase();\n return (/android/i.test(UA));\n}\n\nexport function isIOS() {\n const UA = window.navigator.userAgent.toLowerCase();\n return UA && /iphone|ipad|ipod|ios/.test(UA);\n}\n\n\nexport function parseTime(time, cFormat) {\n if (arguments.length === 0) {\n return null\n }\n var format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'\n var date;\n if (typeof time === 'object') {\n date = time\n } else {\n if (('' + time).length === 10) time = parseInt(time) * 1000;\n time = +time; // 转成int 型\n date = new Date(time)\n }\n var formatObj = {\n y: date.getFullYear(),\n m: date.getMonth() + 1,\n d: date.getDate(),\n h: date.getHours(),\n i: date.getMinutes(),\n s: date.getSeconds(),\n a: date.getDay()\n };\n var time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {\n var value = formatObj[key]\n if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]\n if (result.length > 0 && value < 10) {\n value = '0' + value\n }\n return value || 0\n });\n return time_str\n}\n\n// 是否支持 webcodecs\nexport function supportWCS() {\n return \"VideoEncoder\" in window;\n}\n\nexport function toNumber(value) {\n if (typeof value !== 'string') {\n return value;\n } else {\n // 转换成 number 类型\n var parsed = Number(value);\n return isNaN(parsed) ? value : parsed;\n }\n}\n\nexport function uuid16() {\n return 'xxxxxxxxxxxx4xxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8)\n return v.toString(16)\n })\n}\n\nexport function throttle(callback, delay) {\n let isThrottled = false;\n let args;\n let context;\n\n function fn(...args2) {\n if (isThrottled) {\n args = args2;\n context = this;\n return;\n }\n\n isThrottled = true;\n callback.apply(this, args2);\n setTimeout(() => {\n isThrottled = false;\n if (args) {\n fn.apply(context, args);\n args = null;\n context = null;\n }\n }, delay);\n }\n\n return fn;\n}\n\n\nexport function isDef(v) {\n return v !== undefined && v !== null;\n}\n\nexport function formatVideoDecoderConfigure(avcC) {\n let codecArray = avcC.subarray(1, 4);\n let codecString = \"avc1.\";\n for (let j = 0; j < 3; j++) {\n let h = codecArray[j].toString(16);\n if (h.length < 2) {\n h = \"0\" + h\n }\n codecString += h\n }\n\n return {\n codec: codecString,\n description: avcC\n }\n}\n\nexport function isFullScreen() {\n return document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen;\n}\n\nexport function bpsSize(value) {\n if (null == value || value === '') {\n return \"0 KB/S\";\n }\n let size = parseFloat(value);\n size = size.toFixed(2);\n return size + 'KB/S';\n}\n\n\nexport function fpsStatus(fps) {\n let result = 0;\n if (fps >= 24) {\n result = 2;\n } else if (fps >= 15) {\n result = 1;\n }\n\n return result;\n}\n\nexport function createEmptyImageBitmap(width, height) {\n const $canvasElement = document.createElement(\"canvas\");\n $canvasElement.width = width;\n $canvasElement.height = height;\n return createImageBitmap($canvasElement, 0, 0, width, height);\n}\n\n\nexport function supportMSE() {\n return window.MediaSource && window.MediaSource.isTypeSupported(MP4_CODECS.avc);\n}\n\n\nexport function formatMp4VideoCodec(codec) {\n return `video/mp4; codecs=\"${codec}\"`\n}\n\n\nexport function saveBlobToFile(fileName, blob) {\n let url = window.URL.createObjectURL(blob);\n let aLink = window.document.createElement('a');\n aLink.download = fileName;\n aLink.href = url;\n //创建内置事件并触发\n let evt = window.document.createEvent('MouseEvents');\n evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n aLink.dispatchEvent(evt);\n}\n\nexport function isEmpty(value) {\n return value === null || value === undefined\n}\n\nexport function isBoolean(value) {\n return value === true || value === false;\n}\n\nexport function isNotEmpty(value) {\n return !isEmpty(value)\n}\n\nexport function initPlayTimes() {\n return {\n playInitStart: '', //1\n playStart: '', // 2\n streamStart: '', //3\n streamResponse: '', // 4\n demuxStart: '', // 5\n decodeStart: '', // 6\n videoStart: '', // 7\n playTimestamp: '',// playStart- playInitStart\n streamTimestamp: '',// streamStart - playStart\n streamResponseTimestamp: '',// streamResponse - streamStart\n demuxTimestamp: '', // demuxStart - streamResponse\n decodeTimestamp: '', // decodeStart - demuxStart\n videoTimestamp: '',// videoStart - decodeStart\n allTimestamp: '' // videoStart - playInitStart\n }\n}\n\n// create watermark\nexport function createWatermark(options) {\n let defaultConfig = {\n container: '',\n left: '',\n right: '',\n top: '',\n bottom: '',\n image: {\n src: '',\n width: '100',\n height: '60',\n },\n text: {\n content: '',\n fontSize: '14',\n color: '#000'\n },\n }\n defaultConfig = Object.assign(defaultConfig, options)\n\n const $container = defaultConfig.container;\n\n if ($container) {\n return\n }\n\n let shadowRoot = null;\n const otDiv = document.createElement('div');\n otDiv.setAttribute('style', 'pointer-events: none !important; display: block !important');\n\n if (typeof otDiv.attachShadow === \"function\") {\n shadowRoot = otDiv.attachShadow({mode: 'open'});\n } else if (otDiv.shadowRoot) {\n shadowRoot = otDiv.shadowRoot;\n } else {\n shadowRoot = otDiv;\n }\n\n const nodeList = $container.children;\n const index = Math.floor(Math.random() * (nodeList.length - 1));\n\n if (nodeList[index]) {\n $container.insertBefore(otDiv, nodeList[index]);\n } else {\n $container.appendChild(otDiv);\n }\n\n\n const maskDiv = document.createElement('div');\n let innerDom = null;\n if (defaultConfig.text && defaultConfig.text.content) {\n innerDom = document.createTextNode(defaultConfig.text);\n } else if (defaultConfig.image && defaultConfig.image.src) {\n innerDom = document.createElement('img')\n innerDom.style.height = '100%'\n innerDom.style.width = '100%'\n innerDom.src = defaultConfig.image.src;\n }\n\n if (!innerDom) {\n return;\n }\n\n maskDiv.appendChild(innerDom);\n\n maskDiv.style.visibility = '';\n maskDiv.style.position = \"absolute\";\n maskDiv.style.display = 'block'\n maskDiv.style['-ms-user-select'] = \"none\";\n maskDiv.style.left = defaultConfig.left;\n maskDiv.style.right = defaultConfig.right;\n maskDiv.style.top = defaultConfig.top;\n maskDiv.style.bottom = defaultConfig.bottom;\n maskDiv.style.overflow = 'hidden';\n maskDiv.style.zIndex = \"9999999\";\n if (defaultConfig.text && defaultConfig.text.content) {\n maskDiv.style.fontSize = defaultConfig.text.fontSize;\n maskDiv.style.color = defaultConfig.text.color;\n } else if (defaultConfig.image && defaultConfig.image.src) {\n maskDiv.style.width = defaultConfig.image.width + 'px';\n maskDiv.style.height = defaultConfig.image.height + 'px';\n }\n\n shadowRoot.appendChild(maskDiv)\n\n // remove function\n return () => {\n $container.removeChild(otDiv);\n }\n}\n","import {EVENTS, EVENTS_ERROR, JESSIBUCA_EVENTS} from \"../constant\";\nimport screenfull from \"screenfull\";\nimport {setStyle} from \"../utils\";\n\nexport default (player) => {\n\n\n try {\n const screenfullChange = () => {\n player.emit(JESSIBUCA_EVENTS.fullscreen, player.fullscreen)\n\n // 如果不是fullscreen,则触发下 resize 方法\n if (!player.fullscreen) {\n player.resize();\n } else {\n if(player._opt.useMSE){\n player.resize();\n }\n }\n\n };\n screenfull.on('change', screenfullChange);\n player.events.destroys.push(() => {\n screenfull.off('change', screenfullChange);\n });\n } catch (error) {\n //\n }\n //\n player.on(EVENTS.decoderWorkerInit, () => {\n player.debug.log('player', 'has loaded');\n player.loaded = true;\n })\n\n //\n player.on(EVENTS.play, () => {\n player.loading = false;\n })\n\n //\n player.on(EVENTS.fullscreen, (value) => {\n if (value) {\n try {\n screenfull.request(player.$container).then(() => {\n\n }).catch((e) => {\n player.webFullscreen = true;\n });\n\n } catch (e) {\n player.webFullscreen = true;\n }\n } else {\n try {\n screenfull.exit().then(() => {\n }).catch(() => {\n player.webFullscreen = false;\n\n });\n } catch (e) {\n player.webFullscreen = false;\n }\n }\n })\n\n player.on(EVENTS.webFullscreen, (value) => {\n if (value) {\n player.$container.classList.add('jessibuca-fullscreen-web')\n } else {\n player.$container.classList.remove('jessibuca-fullscreen-web')\n }\n })\n\n //\n player.on(EVENTS.resize, () => {\n player.video.resize();\n })\n\n\n if (player._opt.debug) {\n const ignoreList = [EVENTS.timeUpdate];\n Object.keys(EVENTS).forEach((key) => {\n player.on(EVENTS[key], (value) => {\n if (ignoreList.includes(key)) {\n return;\n }\n\n player.debug.log('player events', EVENTS[key], value);\n })\n })\n\n Object.keys(EVENTS_ERROR).forEach((key) => {\n player.on(EVENTS_ERROR[key], (value) => {\n player.debug.log('player event error', EVENTS_ERROR[key], value);\n })\n })\n }\n}\n","export default class Emitter {\n on(name, fn, ctx) {\n const e = this.e || (this.e = {});\n (e[name] || (e[name] = [])).push({fn, ctx});\n return this;\n }\n\n once(name, fn, ctx) {\n const self = this;\n\n function listener(...args) {\n self.off(name, listener);\n fn.apply(ctx, args);\n }\n\n listener._ = fn;\n return this.on(name, listener, ctx);\n }\n\n emit(name, ...data) {\n const evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n for (let i = 0; i < evtArr.length; i += 1) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n return this;\n }\n\n off(name, callback) {\n const e = this.e || (this.e = {});\n\n if (!name) {\n Object.keys(e).forEach((key) => {\n delete e[key];\n })\n delete this.e\n return;\n }\n\n const evts = e[name];\n const liveEvents = [];\n if (evts && callback) {\n for (let i = 0, len = evts.length; i < len; i += 1) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback) liveEvents.push(evts[i]);\n }\n }\n if (liveEvents.length) {\n e[name] = liveEvents;\n } else {\n delete e[name];\n }\n return this;\n }\n}\n","export default (gl, openWebglAlignment) => {\n var vertexShaderScript = [\n 'attribute vec4 vertexPos;',\n 'attribute vec4 texturePos;',\n 'varying vec2 textureCoord;',\n\n 'void main()',\n '{',\n 'gl_Position = vertexPos;',\n 'textureCoord = texturePos.xy;',\n '}'\n ].join('\\n');\n\n var fragmentShaderScript = [\n 'precision highp float;',\n 'varying highp vec2 textureCoord;',\n 'uniform sampler2D ySampler;',\n 'uniform sampler2D uSampler;',\n 'uniform sampler2D vSampler;',\n 'const mat4 YUV2RGB = mat4',\n '(',\n '1.1643828125, 0, 1.59602734375, -.87078515625,',\n '1.1643828125, -.39176171875, -.81296875, .52959375,',\n '1.1643828125, 2.017234375, 0, -1.081390625,',\n '0, 0, 0, 1',\n ');',\n\n 'void main(void) {',\n 'highp float y = texture2D(ySampler, textureCoord).r;',\n 'highp float u = texture2D(uSampler, textureCoord).r;',\n 'highp float v = texture2D(vSampler, textureCoord).r;',\n 'gl_FragColor = vec4(y, u, v, 1) * YUV2RGB;',\n '}'\n ].join('\\n');\n\n if (openWebglAlignment) {\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n }\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexShaderScript);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n console.log('Vertex shader failed to compile: ' + gl.getShaderInfoLog(vertexShader));\n }\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentShaderScript);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n console.log('Fragment shader failed to compile: ' + gl.getShaderInfoLog(fragmentShader));\n }\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.log('Program failed to compile: ' + gl.getProgramInfoLog(program));\n }\n\n gl.useProgram(program);\n\n // initBuffers\n var vertexPosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexPosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW);\n\n var vertexPosRef = gl.getAttribLocation(program, 'vertexPos');\n gl.enableVertexAttribArray(vertexPosRef);\n gl.vertexAttribPointer(vertexPosRef, 2, gl.FLOAT, false, 0, 0);\n\n var texturePosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, texturePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 0, 0, 0, 1, 1, 0, 1]), gl.STATIC_DRAW);\n\n var texturePosRef = gl.getAttribLocation(program, 'texturePos');\n gl.enableVertexAttribArray(texturePosRef);\n gl.vertexAttribPointer(texturePosRef, 2, gl.FLOAT, false, 0, 0);\n\n function _initTexture(name, index) {\n var textureRef = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, textureRef);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.uniform1i(gl.getUniformLocation(program, name), index);\n return textureRef;\n }\n\n var yTextureRef = _initTexture('ySampler', 0);\n var uTextureRef = _initTexture('uSampler', 1);\n var vTextureRef = _initTexture('vSampler', 2);\n\n return {\n render: function (w, h, y, u, v) {\n gl.viewport(0, 0, w, h);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, yTextureRef);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, w, h, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, y);\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, uTextureRef);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, w / 2, h / 2, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, u);\n gl.activeTexture(gl.TEXTURE2);\n gl.bindTexture(gl.TEXTURE_2D, vTextureRef);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, w / 2, h / 2, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, v);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n },\n destroy: function () {\n try {\n gl.deleteProgram(program);\n\n gl.deleteBuffer(vertexPosBuffer)\n gl.deleteBuffer(texturePosBuffer);\n\n gl.deleteTexture(yTextureRef);\n gl.deleteTexture(uTextureRef);\n gl.deleteBuffer(vTextureRef);\n } catch (e) {\n // console.error(e);\n }\n\n }\n }\n};\n","import Emitter from \"../utils/emitter\";\nimport {CONTROL_HEIGHT, EVENTS, VIDEO_ENC_TYPE} from \"../constant\";\n\nexport default class CommonLoader extends Emitter {\n constructor() {\n super();\n this.init = false;\n }\n\n //\n updateVideoInfo(data) {\n if (data.encTypeCode) {\n this.videoInfo.encType = VIDEO_ENC_TYPE[data.encTypeCode];\n }\n\n if (data.width) {\n this.videoInfo.width = data.width;\n }\n\n if (data.height) {\n this.videoInfo.height = data.height;\n }\n\n // video 基本信息\n if (this.videoInfo.encType && this.videoInfo.height && this.videoInfo.width && !this.init) {\n this.player.emit(EVENTS.videoInfo, this.videoInfo);\n this.init = true;\n }\n }\n\n play(){\n\n }\n\n pause() {\n\n }\n}\n","import Emitter from \"../utils/emitter\";\nimport {\n createContextGL,\n createEmptyImageBitmap,\n dataURLToFile,\n downloadImg,\n isMobile,\n now,\n supportOffscreen\n} from \"../utils\";\nimport createWebGL from \"../utils/webgl\";\nimport {CANVAS_RENDER_TYPE, CONTROL_HEIGHT, EVENTS, SCREENSHOT_TYPE, VIDEO_ENC_TYPE} from \"../constant\";\nimport CommonLoader from \"./commonLoader\";\n\nexport default class CanvasVideoLoader extends CommonLoader {\n\n constructor(player) {\n super()\n this.player = player;\n const $canvasElement = document.createElement(\"canvas\");\n $canvasElement.style.position = \"absolute\";\n $canvasElement.style.top = 0;\n $canvasElement.style.left = 0;\n this.$videoElement = $canvasElement;\n player.$container.appendChild(this.$videoElement);\n\n this.context2D = null;\n this.contextGl = null;\n this.contextGlRender = null;\n this.contextGlDestroy = null;\n this.bitmaprenderer = null;\n this.renderType = null;\n this.videoInfo = {\n width: '',\n height: '',\n encType: '',\n }\n //\n this._initCanvasRender();\n this.player.debug.log('CanvasVideo', 'init');\n }\n\n destroy() {\n if (this.contextGl) {\n this.contextGl = null;\n }\n\n if (this.context2D) {\n this.context2D = null;\n }\n\n if (this.contextGlRender) {\n this.contextGlDestroy && this.contextGlDestroy();\n this.contextGlDestroy = null;\n this.contextGlRender = null;\n }\n if (this.bitmaprenderer) {\n this.bitmaprenderer = null;\n }\n\n this.renderType = null;\n\n this.videoInfo = {\n width: '',\n height: '',\n encType: '',\n encTypeCode: ''\n }\n\n this.player.$container.removeChild(this.$videoElement);\n this.init = false;\n this.off();\n this.player.debug.log(`CanvasVideoLoader`, 'destroy');\n }\n\n\n _initContextGl() {\n this.contextGl = createContextGL(this.$videoElement);\n const webgl = createWebGL(this.contextGl, this.player._opt.openWebglAlignment);\n this.contextGlRender = webgl.render;\n this.contextGlDestroy = webgl.destroy\n }\n\n _initContext2D() {\n this.context2D = this.$videoElement.getContext('2d');\n }\n\n\n // 渲染类型\n _initCanvasRender() {\n if (this.player._opt.useWCS && !this._supportOffscreen()) {\n this.renderType = CANVAS_RENDER_TYPE.webcodecs;\n this._initContext2D();\n } else if (this._supportOffscreen()) {\n this.renderType = CANVAS_RENDER_TYPE.offscreen;\n this._bindOffscreen();\n } else {\n this.renderType = CANVAS_RENDER_TYPE.webgl;\n this._initContextGl();\n }\n }\n\n _supportOffscreen() {\n return supportOffscreen(this.$videoElement) && this.player._opt.useOffscreen;\n }\n\n //\n _bindOffscreen() {\n this.bitmaprenderer = this.$videoElement.getContext('bitmaprenderer');\n }\n\n initCanvasViewSize() {\n this.$videoElement.width = this.videoInfo.width;\n this.$videoElement.height = this.videoInfo.height;\n this.resize();\n }\n\n //\n render(msg) {\n this.player.videoTimestamp = msg.ts;\n switch (this.renderType) {\n case CANVAS_RENDER_TYPE.offscreen:\n this.bitmaprenderer.transferFromImageBitmap(msg.buffer);\n break;\n case CANVAS_RENDER_TYPE.webgl:\n this.contextGlRender(this.$videoElement.width, this.$videoElement.height, msg.output[0], msg.output[1], msg.output[2]);\n break;\n case CANVAS_RENDER_TYPE.webcodecs:\n this.context2D.drawImage(msg.videoFrame, 0, 0, this.$videoElement.width, this.$videoElement.height);\n break;\n }\n }\n\n screenshot(filename, format, quality, type) {\n filename = filename || now();\n type = type || SCREENSHOT_TYPE.download;\n const formatType = {\n png: 'image/png',\n jpeg: 'image/jpeg',\n webp: 'image/webp'\n };\n let encoderOptions = 0.92;\n if (!formatType[format] && SCREENSHOT_TYPE[format]) {\n type = format;\n format = 'png';\n quality = undefined\n }\n\n if (typeof quality === \"string\") {\n type = quality;\n quality = undefined;\n }\n\n if (typeof quality !== 'undefined') {\n encoderOptions = Number(quality);\n }\n const dataURL = this.$videoElement.toDataURL(formatType[format] || formatType.png, encoderOptions);\n\n const file = dataURLToFile(dataURL)\n if (type === SCREENSHOT_TYPE.base64) {\n return dataURL;\n } else if (type === SCREENSHOT_TYPE.blob) {\n return file;\n } else if (type === SCREENSHOT_TYPE.download) {\n downloadImg(file, filename);\n }\n }\n\n //\n clearView() {\n switch (this.renderType) {\n case CANVAS_RENDER_TYPE.offscreen:\n createEmptyImageBitmap(this.$videoElement.width, this.$videoElement.height).then((imageBitMap) => {\n this.bitmaprenderer.transferFromImageBitmap(imageBitMap);\n })\n break;\n case CANVAS_RENDER_TYPE.webgl:\n this.contextGl.clear(this.contextGl.COLOR_BUFFER_BIT);\n break;\n case CANVAS_RENDER_TYPE.webcodecs:\n this.context2D.clearRect(0, 0, this.$videoElement.width, this.$videoElement.height)\n break;\n }\n }\n\n resize() {\n this.player.debug.log('canvasVideo', 'resize');\n const option = this.player._opt;\n let width = this.player.width;\n let height = this.player.height;\n if (option.hasControl && !option.controlAutoHide) {\n if (isMobile() && this.player.fullscreen) {\n width -= CONTROL_HEIGHT;\n } else {\n height -= CONTROL_HEIGHT;\n }\n }\n let resizeWidth = this.$videoElement.width;\n let resizeHeight = this.$videoElement.height;\n const rotate = option.rotate;\n let left = ((width - resizeWidth) / 2)\n let top = ((height - resizeHeight) / 2)\n if (rotate === 270 || rotate === 90) {\n resizeWidth = this.$videoElement.height;\n resizeHeight = this.$videoElement.width;\n }\n\n const wScale = width / resizeWidth;\n const hScale = height / resizeHeight;\n\n let scale = wScale > hScale ? hScale : wScale;\n //\n if (!option.isResize) {\n if (wScale !== hScale) {\n scale = wScale + ',' + hScale;\n }\n }\n //\n if (option.isFullResize) {\n scale = wScale > hScale ? wScale : hScale;\n }\n let transform = \"scale(\" + scale + \")\";\n\n if (rotate) {\n transform += ' rotate(' + rotate + 'deg)'\n }\n\n this.$videoElement.style.transform = transform;\n this.$videoElement.style.left = left + \"px\"\n this.$videoElement.style.top = top + \"px\"\n }\n\n\n}\n","import Emitter from \"../utils/emitter\";\nimport {CONTROL_HEIGHT, EVENTS, SCREENSHOT_TYPE, VIDEO_ENC_TYPE} from \"../constant\";\nimport {dataURLToFile, downloadImg, isMobile, now} from \"../utils\";\nimport CommonLoader from \"./commonLoader\";\n\nexport default class VideoLoader extends CommonLoader {\n constructor(player) {\n super();\n this.player = player;\n const $videoElement = document.createElement('video');\n $videoElement.muted = true;\n $videoElement.style.position = \"absolute\";\n $videoElement.style.top = 0;\n $videoElement.style.left = 0;\n player.$container.appendChild($videoElement);\n this.$videoElement = $videoElement;\n this.videoInfo = {\n width: '',\n height: '',\n encType: '',\n }\n const _opt = this.player._opt;\n if (_opt.useWCS && _opt.wcsUseVideoRender) {\n this.trackGenerator = new MediaStreamTrackGenerator({kind: 'video'});\n $videoElement.srcObject = new MediaStream([this.trackGenerator]);\n this.vwriter = this.trackGenerator.writable.getWriter();\n }\n\n this.resize();\n\n const {proxy} = this.player.events;\n\n proxy(this.$videoElement, 'canplay', () => {\n this.player.debug.log('Video', 'canplay');\n })\n\n proxy(this.$videoElement, 'waiting', () => {\n this.player.emit(EVENTS.videoWaiting);\n })\n\n proxy(this.$videoElement, 'timeupdate', (event) => {\n // this.player.emit(EVENTS.videoTimeUpdate, event.timeStamp);\n })\n\n this.player.debug.log('Video', 'init');\n }\n\n destroy() {\n this.player.$container.removeChild(this.$videoElement);\n if (this.$videoElement) {\n this.$videoElement.src = ''\n this.$videoElement = null;\n }\n if (this.trackGenerator) {\n this.trackGenerator = null;\n }\n if (this.vwriter) {\n this.trackGenerator = null;\n }\n\n\n this.init = false;\n this.off();\n this.player.debug.log('Video', 'destroy');\n }\n\n play() {\n // this.$videoElement.autoplay = true;\n this.$videoElement.play();\n }\n\n clearView() {\n\n }\n\n screenshot(filename, format, quality, type) {\n filename = filename || now();\n type = type || SCREENSHOT_TYPE.download;\n const formatType = {\n png: 'image/png',\n jpeg: 'image/jpeg',\n webp: 'image/webp'\n };\n let encoderOptions = 0.92;\n if (!formatType[format] && SCREENSHOT_TYPE[format]) {\n type = format;\n format = 'png';\n quality = undefined\n }\n if (typeof quality === \"string\") {\n type = quality;\n quality = undefined;\n }\n\n if (typeof quality !== 'undefined') {\n encoderOptions = Number(quality);\n }\n const $video = this.$videoElement;\n let canvas = document.createElement('canvas');\n canvas.width = $video.videoWidth;\n canvas.height = $video.videoHeight;\n const context = canvas.getContext('2d');\n context.drawImage($video, 0, 0, canvas.width, canvas.height);\n const dataURL = canvas.toDataURL(SCREENSHOT_TYPE[format] || SCREENSHOT_TYPE.png, encoderOptions);\n const file = dataURLToFile(dataURL)\n if (type === SCREENSHOT_TYPE.base64) {\n return dataURL;\n } else if (type === SCREENSHOT_TYPE.blob) {\n return file;\n } else if (type === SCREENSHOT_TYPE.download) {\n downloadImg(file, filename);\n }\n }\n\n initCanvasViewSize() {\n this.resize();\n }\n\n //\n render(msg) {\n if (this.vwriter) {\n this.vwriter.write(msg.videoFrame);\n }\n }\n\n resize() {\n let width = this.player.width;\n let height = this.player.height;\n const option = this.player._opt;\n const rotate = option.rotate;\n if (option.hasControl && !option.controlAutoHide) {\n if (isMobile() && this.player.fullscreen) {\n width -= CONTROL_HEIGHT;\n } else {\n height -= CONTROL_HEIGHT;\n }\n }\n\n this.$videoElement.width = width;\n this.$videoElement.height = height;\n\n if (rotate === 270 || rotate === 90) {\n this.$videoElement.width = height;\n this.$videoElement.height = width;\n }\n let resizeWidth = this.$videoElement.width;\n let resizeHeight = this.$videoElement.height;\n let left = ((width - resizeWidth) / 2)\n let top = ((height - resizeHeight) / 2)\n let objectFill = 'contain';\n\n // 默认是true\n // 视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边\n\n // 视频画面完全填充canvas区域,画面会被拉伸\n if (!option.isResize) {\n objectFill = 'fill';\n }\n\n // 视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全\n if (option.isFullResize) {\n objectFill = 'none';\n }\n this.$videoElement.style.objectFit = objectFill;\n this.$videoElement.style.transform = 'rotate(' + rotate + 'deg)';\n this.$videoElement.style.left = left + \"px\"\n this.$videoElement.style.top = top + \"px\"\n }\n}\n","import CanvasVideoLoader from './canvasLoader';\nimport VideoLoader from \"./videoLoader\";\n\nexport default class Video {\n constructor(player) {\n const Loader = Video.getLoaderFactory(player._opt);\n return new Loader(player);\n }\n\n static getLoaderFactory(opt) {\n if (opt.useMSE || (opt.useWCS && opt.wcsUseVideoRender)) {\n return VideoLoader;\n } else {\n return CanvasVideoLoader;\n }\n }\n}\n","import Emitter from \"../utils/emitter\";\nimport {AUDIO_ENC_TYPE, AUDIO_SYNC_VIDEO_DIFF, EVENTS, VIDEO_ENC_TYPE} from \"../constant\";\nimport {clamp, noop} from \"../utils\";\n\nexport default class AudioContextLoader extends Emitter {\n constructor(player) {\n super();\n this.bufferList = [];\n this.player = player;\n this.scriptNode = null;\n this.hasInitScriptNode = false;\n this.audioContextChannel = null;\n\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)();\n //\n this.gainNode = this.audioContext.createGain();\n // Get an AudioBufferSourceNode.\n // This is the AudioNode to use when we want to play an AudioBuffer\n const source = this.audioContext.createBufferSource();\n // set the buffer in the AudioBufferSourceNode\n source.buffer = this.audioContext.createBuffer(1, 1, 22050);\n // connect the AudioBufferSourceNode to the\n // destination so we can hear the sound\n source.connect(this.audioContext.destination);\n // noteOn as start\n // start the source playing\n if (source.noteOn) {\n source.noteOn(0);\n } else {\n source.start(0);\n }\n this.audioBufferSourceNode = source;\n //\n this.mediaStreamAudioDestinationNode = this.audioContext.createMediaStreamDestination();\n //\n this.audioEnabled(true);\n // default setting 0\n this.gainNode.gain.value = 0;\n\n this.playing = false;\n //\n this.audioSyncVideoOption = {\n diff: null\n };\n\n\n this.audioInfo = {\n encType: '',\n channels: '',\n sampleRate: ''\n }\n this.init = false;\n this.hasAudio = false;\n\n // update\n this.on(EVENTS.videoSyncAudio, (options) => {\n // this.player.debug.log('AudioContext', `videoSyncAudio , audioTimestamp: ${options.audioTimestamp},videoTimestamp: ${options.videoTimestamp},diff:${options.diff}`)\n this.audioSyncVideoOption = options;\n })\n\n this.player.debug.log('AudioContext', 'init');\n }\n\n\n destroy() {\n this.closeAudio();\n this.audioContext.close();\n this.audioContext = null;\n this.gainNode = null;\n this.init = false;\n this.hasAudio = false;\n this.playing = false;\n\n if (this.scriptNode) {\n this.scriptNode.onaudioprocess = noop;\n this.scriptNode = null;\n }\n this.audioBufferSourceNode = null;\n this.mediaStreamAudioDestinationNode = null;\n this.hasInitScriptNode = false;\n this.audioSyncVideoOption = {\n diff: null\n };\n this.audioInfo = {\n encType: '',\n channels: '',\n sampleRate: ''\n }\n this.off();\n this.player.debug.log('AudioContext', 'destroy');\n }\n\n updateAudioInfo(data) {\n if (data.encTypeCode) {\n this.audioInfo.encType = AUDIO_ENC_TYPE[data.encTypeCode];\n }\n\n if (data.channels) {\n this.audioInfo.channels = data.channels;\n }\n\n if (data.sampleRate) {\n this.audioInfo.sampleRate = data.sampleRate;\n }\n\n // audio 基本信息\n if (this.audioInfo.sampleRate && this.audioInfo.channels && this.audioInfo.encType && !this.init) {\n this.player.emit(EVENTS.audioInfo, this.audioInfo);\n this.init = true;\n }\n }\n\n //\n get isPlaying() {\n return this.playing;\n }\n\n get isMute() {\n return this.gainNode.gain.value === 0 || this.isStateSuspended();\n }\n\n get volume() {\n return this.gainNode.gain.value;\n }\n\n get bufferSize() {\n return this.bufferList.length;\n }\n\n\n initScriptNode() {\n this.playing = true;\n\n if (this.hasInitScriptNode) {\n return;\n }\n const channels = this.audioInfo.channels;\n\n const scriptNode = this.audioContext.createScriptProcessor(1024, 0, channels);\n // tips: if audio isStateSuspended onaudioprocess method not working\n scriptNode.onaudioprocess = (audioProcessingEvent) => {\n const outputBuffer = audioProcessingEvent.outputBuffer;\n\n if (this.bufferList.length && this.playing) {\n // just for wasm\n if (!this.player._opt.useWCS && !this.player._opt.useMSE) {\n // audio > video\n // wait\n if (this.audioSyncVideoOption.diff > AUDIO_SYNC_VIDEO_DIFF) {\n this.player.debug.warn('AudioContext', `audioSyncVideoOption more than diff :${this.audioSyncVideoOption.diff}, waiting`)\n // wait\n return;\n }\n // audio < video\n // throw away then chase video\n else if (this.audioSyncVideoOption.diff < -AUDIO_SYNC_VIDEO_DIFF) {\n this.player.debug.warn('AudioContext', `audioSyncVideoOption less than diff :${this.audioSyncVideoOption.diff}, dropping`)\n\n //\n let bufferItem = this.bufferList.shift();\n //\n while ((bufferItem.ts - this.player.videoTimestamp < -AUDIO_SYNC_VIDEO_DIFF) && this.bufferList.length > 0) {\n // this.player.debug.warn('AudioContext', `audioSyncVideoOption less than inner ts is:${bufferItem.ts}, videoTimestamp is ${this.player.videoTimestamp},diff:${bufferItem.ts - this.player.videoTimestamp}`)\n bufferItem = this.bufferList.shift();\n }\n\n if (this.bufferList.length === 0) {\n return;\n }\n }\n }\n\n if (this.bufferList.length === 0) {\n return;\n }\n\n const bufferItem = this.bufferList.shift();\n\n // update audio time stamp\n if (bufferItem && bufferItem.ts) {\n this.player.audioTimestamp = bufferItem.ts;\n }\n\n for (let channel = 0; channel < channels; channel++) {\n const b = bufferItem.buffer[channel]\n const nowBuffering = outputBuffer.getChannelData(channel);\n for (let i = 0; i < 1024; i++) {\n nowBuffering[i] = b[i] || 0\n }\n }\n }\n }\n\n scriptNode.connect(this.gainNode);\n this.scriptNode = scriptNode;\n this.gainNode.connect(this.audioContext.destination);\n this.gainNode.connect(this.mediaStreamAudioDestinationNode);\n this.hasInitScriptNode = true;\n }\n\n mute(flag) {\n if (flag) {\n if (!this.isMute) {\n this.player.emit(EVENTS.mute, flag);\n }\n this.setVolume(0);\n this.audioEnabled(false);\n this.clear();\n } else {\n if (this.isMute) {\n this.player.emit(EVENTS.mute, flag);\n }\n this.setVolume(0.5);\n this.audioEnabled(true);\n }\n }\n\n setVolume(volume) {\n volume = parseFloat(volume).toFixed(2);\n if (isNaN(volume)) {\n return;\n }\n this.audioEnabled(true);\n volume = clamp(volume, 0, 1);\n this.gainNode.gain.value = volume;\n this.gainNode.gain.setValueAtTime(volume, this.audioContext.currentTime);\n this.player.emit(EVENTS.volumechange, this.player.volume);\n }\n\n closeAudio() {\n if (this.hasInitScriptNode) {\n this.scriptNode && this.scriptNode.disconnect(this.gainNode);\n this.gainNode && this.gainNode.disconnect(this.audioContext.destination);\n this.gainNode && this.gainNode.disconnect(this.mediaStreamAudioDestinationNode);\n }\n this.clear();\n }\n\n // 是否播放。。。\n audioEnabled(flag) {\n if (flag) {\n if (this.audioContext.state === 'suspended') {\n // resume\n this.audioContext.resume();\n }\n } else {\n if (this.audioContext.state === 'running') {\n // suspend\n this.audioContext.suspend();\n }\n }\n }\n\n isStateRunning() {\n return this.audioContext.state === 'running';\n }\n\n isStateSuspended() {\n return this.audioContext.state === 'suspended';\n }\n\n clear() {\n this.bufferList = [];\n }\n\n play(buffer, ts) {\n // if is mute\n if (this.isMute) {\n return;\n }\n\n this.hasAudio = true;\n\n this.bufferList.push({\n buffer,\n ts\n });\n\n if (this.bufferList.length > 20) {\n this.player.debug.warn('AudioContext', `bufferList is large: ${this.bufferList.length}`)\n\n // out of memory\n if (this.bufferList.length > 50) {\n this.bufferList.shift();\n }\n }\n // this.player.debug.log('AudioContext', `bufferList is ${this.bufferList.length}`)\n }\n\n pause() {\n this.audioSyncVideoOption = {\n diff: null\n };\n this.playing = false;\n this.clear();\n }\n\n resume() {\n this.playing = true;\n }\n\n\n\n\n}\n","import AudioContextLoader from \"./audioContextLoader\";\nimport AudioLoader from \"./audioLoader\";\n\nexport default class Audio {\n constructor(player) {\n const Loader = Audio.getLoaderFactory();\n return new Loader(player);\n }\n\n static getLoaderFactory() {\n return AudioContextLoader;\n }\n}\n","import Emitter from \"../utils/emitter\";\nimport {EVENTS, EVENTS_ERROR, JESSIBUCA_EVENTS} from \"../constant\";\nimport {calculationRate, now} from \"../utils\";\n\nexport default class FetchLoader extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n this.playing = false;\n\n this.abortController = new AbortController();\n //\n this.streamRate = calculationRate(rate => {\n player.emit(EVENTS.kBps, (rate / 1024).toFixed(2));\n });\n player.debug.log('FetchStream', 'init');\n }\n\n destroy() {\n this.abort()\n this.off();\n this.streamRate = null;\n this.player.debug.log('FetchStream', 'destroy');\n }\n\n fetchStream(url) {\n const {demux} = this.player;\n this.player._times.streamStart = now();\n fetch(url, {signal: this.abortController.signal}).then((res) => {\n const reader = res.body.getReader();\n this.emit(EVENTS.streamSuccess);\n const fetchNext = () => {\n reader.read().then(({done, value}) => {\n if (done) {\n demux.close();\n } else {\n this.streamRate && this.streamRate(value.byteLength);\n demux.dispatch(value);\n fetchNext();\n }\n }\n ).catch((e) => {\n demux.close();\n // 这边会报用户 aborted a request 错误。\n this.emit(EVENTS_ERROR.fetchError, e);\n this.player.emit(EVENTS.error, EVENTS_ERROR.fetchError);\n this.abort();\n })\n }\n fetchNext();\n }).catch((e) => {\n this.abort();\n this.emit(EVENTS_ERROR.fetchError, e)\n this.player.emit(EVENTS.error, EVENTS_ERROR.fetchError);\n })\n }\n\n abort() {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null\n }\n }\n\n\n}\n","import Emitter from \"../utils/emitter\";\nimport {EVENTS, EVENTS_ERROR, WEBSOCKET_STATUS} from \"../constant\";\nimport {calculationRate, now} from \"../utils\";\n\nexport default class WebsocketLoader extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n this.socket = null;\n this.socketStatus = WEBSOCKET_STATUS.notConnect;\n this.wsUrl = null;\n //\n this.streamRate = calculationRate(rate => {\n player.emit(EVENTS.kBps, (rate / 1024).toFixed(2));\n });\n }\n\n destroy() {\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n this.socketStatus = WEBSOCKET_STATUS.notConnect;\n this.streamRate = null;\n this.wsUrl = null;\n this.off();\n this.player.debug.log('websocketLoader', 'destroy');\n }\n\n _createWebSocket() {\n const player = this.player;\n const {\n debug,\n events: {proxy},\n demux,\n } = player;\n\n this.socket = new WebSocket(this.wsUrl);\n this.socket.binaryType = 'arraybuffer';\n proxy(this.socket, 'open', () => {\n this.emit(EVENTS.streamSuccess);\n debug.log('websocketLoader', 'socket open');\n this.socketStatus = WEBSOCKET_STATUS.open;\n });\n\n proxy(this.socket, 'message', event => {\n this.streamRate && this.streamRate(event.data.byteLength);\n this._handleMessage(event.data);\n });\n\n\n proxy(this.socket, 'close', () => {\n debug.log('websocketLoader', 'socket close');\n this.emit(EVENTS.streamEnd);\n this.socketStatus = WEBSOCKET_STATUS.close;\n });\n\n proxy(this.socket, 'error', error => {\n debug.log('websocketLoader', 'socket error');\n this.emit(EVENTS_ERROR.websocketError, error);\n this.player.emit(EVENTS.error, EVENTS_ERROR.websocketError);\n this.socketStatus = WEBSOCKET_STATUS.error;\n demux.close();\n debug.log('websocketLoader', `socket error:`, error);\n });\n }\n\n //\n _handleMessage(message) {\n const {demux} = this.player;\n if (!demux) {\n this.player.debug.warn('websocketLoader', 'websocket handle message demux is null');\n return;\n }\n demux.dispatch(message);\n }\n\n\n fetchStream(url) {\n this.player._times.streamStart = now();\n this.wsUrl = url;\n this._createWebSocket();\n }\n\n\n}\n","import FetchLoader from \"./fetchLoader\";\nimport WebsocketLoader from \"./websocketLoader\";\nimport {PLAYER_PLAY_PROTOCOL} from \"../constant\";\n\nexport default class Stream {\n constructor(player) {\n const Loader = Stream.getLoaderFactory(player._opt.protocol);\n return new Loader(player);\n }\n\n static getLoaderFactory(protocol) {\n if (protocol === PLAYER_PLAY_PROTOCOL.fetch) {\n return FetchLoader;\n } else if (protocol === PLAYER_PLAY_PROTOCOL.websocket) {\n return WebsocketLoader;\n }\n }\n}\n","'use strict';\r\n\r\n// Last time updated: 2021-03-09 3:20:22 AM UTC\r\n\r\n// ________________\r\n// RecordRTC v5.6.2\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/RecordRTC\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\n// ____________\r\n// RecordRTC.js\r\n\r\n/**\r\n * {@link https://github.com/muaz-khan/RecordRTC|RecordRTC} is a WebRTC JavaScript library for audio/video as well as screen activity recording. It supports Chrome, Firefox, Opera, Android, and Microsoft Edge. Platforms: Linux, Mac and Windows. \r\n * @summary Record audio, video or screen inside the browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTC\r\n * @class\r\n * @example\r\n * var recorder = RecordRTC(mediaStream or [arrayOfMediaStream], {\r\n * type: 'video', // audio or video or gif or canvas\r\n * recorderType: MediaStreamRecorder || CanvasRecorder || StereoAudioRecorder || Etc\r\n * });\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, desiredSampRate: 16000, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction RecordRTC(mediaStream, config) {\r\n if (!mediaStream) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n config = config || {\r\n type: 'video'\r\n };\r\n\r\n config = new RecordRTCConfiguration(mediaStream, config);\r\n\r\n // a reference to user's recordRTC object\r\n var self = this;\r\n\r\n function startRecording(config2) {\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC version: ', self.version);\r\n }\r\n\r\n if (!!config2) {\r\n // allow users to set options using startRecording method\r\n // config2 is similar to main \"config\" object (second parameter over RecordRTC constructor)\r\n config = new RecordRTCConfiguration(mediaStream, config2);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('started recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n return self;\r\n }\r\n\r\n initRecorder(function() {\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n });\r\n\r\n return self;\r\n }\r\n\r\n function initRecorder(initCallback) {\r\n if (initCallback) {\r\n config.initCallback = function() {\r\n initCallback();\r\n initCallback = config.initCallback = null; // recorder.initRecorder should be call-backed once.\r\n };\r\n }\r\n\r\n var Recorder = new GetRecorderType(mediaStream, config);\r\n\r\n mediaRecorder = new Recorder(mediaStream, config);\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (!config.disableLogs) {\r\n console.log('Initialized recorderType:', mediaRecorder.constructor.name, 'for output-type:', config.type);\r\n }\r\n }\r\n\r\n function stopRecording(callback) {\r\n callback = callback || function() {};\r\n\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state === 'paused') {\r\n self.resumeRecording();\r\n\r\n setTimeout(function() {\r\n stopRecording(callback);\r\n }, 1);\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording' && !config.disableLogs) {\r\n console.warn('Recording state should be: \"recording\", however current state is: ', self.state);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Stopped recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (config.type !== 'gif') {\r\n mediaRecorder.stop(_callback);\r\n } else {\r\n mediaRecorder.stop();\r\n _callback();\r\n }\r\n\r\n setState('stopped');\r\n\r\n function _callback(__blob) {\r\n if (!mediaRecorder) {\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, '');\r\n } else {\r\n callback('');\r\n }\r\n return;\r\n }\r\n\r\n Object.keys(mediaRecorder).forEach(function(key) {\r\n if (typeof mediaRecorder[key] === 'function') {\r\n return;\r\n }\r\n\r\n self[key] = mediaRecorder[key];\r\n });\r\n\r\n var blob = mediaRecorder.blob;\r\n\r\n if (!blob) {\r\n if (__blob) {\r\n mediaRecorder.blob = blob = __blob;\r\n } else {\r\n throw 'Recording failed.';\r\n }\r\n }\r\n\r\n if (blob && !config.disableLogs) {\r\n console.log(blob.type, '->', bytesToSize(blob.size));\r\n }\r\n\r\n if (callback) {\r\n var url;\r\n\r\n try {\r\n url = URL.createObjectURL(blob);\r\n } catch (e) {}\r\n\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, url);\r\n } else {\r\n callback(url);\r\n }\r\n }\r\n\r\n if (!config.autoWriteToDisk) {\r\n return;\r\n }\r\n\r\n getDataURL(function(dataURL) {\r\n var parameter = {};\r\n parameter[config.type + 'Blob'] = dataURL;\r\n DiskStorage.Store(parameter);\r\n });\r\n }\r\n }\r\n\r\n function pauseRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to pause the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('paused');\r\n\r\n mediaRecorder.pause();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Paused recording.');\r\n }\r\n }\r\n\r\n function resumeRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'paused') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to resume the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('recording');\r\n\r\n // not all libs have this method yet\r\n mediaRecorder.resume();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Resumed recording.');\r\n }\r\n }\r\n\r\n function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n }\r\n\r\n function getDataURL(callback, _mediaRecorder) {\r\n if (!callback) {\r\n throw 'Pass a callback function over getDataURL.';\r\n }\r\n\r\n var blob = _mediaRecorder ? _mediaRecorder.blob : (mediaRecorder || {}).blob;\r\n\r\n if (!blob) {\r\n if (!config.disableLogs) {\r\n console.warn('Blob encoder did not finish its job yet.');\r\n }\r\n\r\n setTimeout(function() {\r\n getDataURL(callback, _mediaRecorder);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (typeof Worker !== 'undefined' && !navigator.mozGetUserMedia) {\r\n var webWorker = processInWebWorker(readFile);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback(event.target.result);\r\n };\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n try {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n } catch (e) {}\r\n }\r\n }\r\n\r\n function handleRecordingDuration(counter) {\r\n counter = counter || 0;\r\n\r\n if (self.state === 'paused') {\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (self.state === 'stopped') {\r\n return;\r\n }\r\n\r\n if (counter >= self.recordingDuration) {\r\n stopRecording(self.onRecordingStopped);\r\n return;\r\n }\r\n\r\n counter += 1000; // 1-second\r\n\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n }\r\n\r\n function setState(state) {\r\n if (!self) {\r\n return;\r\n }\r\n\r\n self.state = state;\r\n\r\n if (typeof self.onStateChanged.call === 'function') {\r\n self.onStateChanged.call(self, state);\r\n } else {\r\n self.onStateChanged(state);\r\n }\r\n }\r\n\r\n var WARNING = 'It seems that recorder is destroyed or \"startRecording\" is not invoked for ' + config.type + ' recorder.';\r\n\r\n function warningLog() {\r\n if (config.disableLogs === true) {\r\n return;\r\n }\r\n\r\n console.warn(WARNING);\r\n }\r\n\r\n var mediaRecorder;\r\n\r\n var returnObject = {\r\n /**\r\n * This method starts the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var recorder = RecordRTC(mediaStream, {\r\n * type: 'video'\r\n * });\r\n * recorder.startRecording();\r\n */\r\n startRecording: startRecording,\r\n\r\n /**\r\n * This method stops the recording. It is strongly recommended to get \"blob\" or \"URI\" inside the callback to make sure all recorders finished their job.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * // use either \"this\" or \"recorder\" object; both are identical\r\n * video.src = this.toURL();\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n stopRecording: stopRecording,\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Firefox is unable to pause the recording. Fix it.\r\n * @example\r\n * recorder.pauseRecording(); // pause the recording\r\n * recorder.resumeRecording(); // resume again\r\n */\r\n pauseRecording: pauseRecording,\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.pauseRecording(); // first of all, pause the recording\r\n * recorder.resumeRecording(); // now resume it\r\n */\r\n resumeRecording: resumeRecording,\r\n\r\n /**\r\n * This method initializes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * recorder.initRecorder();\r\n */\r\n initRecorder: initRecorder,\r\n\r\n /**\r\n * Ask RecordRTC to auto-stop the recording after 5 minutes.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var fiveMinutes = 5 * 1000 * 60;\r\n * recorder.setRecordingDuration(fiveMinutes, function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n * \r\n * // or otherwise\r\n * recorder.setRecordingDuration(fiveMinutes).onRecordingStopped(function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n */\r\n setRecordingDuration: function(recordingDuration, callback) {\r\n if (typeof recordingDuration === 'undefined') {\r\n throw 'recordingDuration is required.';\r\n }\r\n\r\n if (typeof recordingDuration !== 'number') {\r\n throw 'recordingDuration must be a number.';\r\n }\r\n\r\n self.recordingDuration = recordingDuration;\r\n self.onRecordingStopped = callback || function() {};\r\n\r\n return {\r\n onRecordingStopped: function(callback) {\r\n self.onRecordingStopped = callback;\r\n }\r\n };\r\n },\r\n\r\n /**\r\n * This method can be used to clear/reset all the recorded data.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Figure out the difference between \"reset\" and \"clearRecordedData\" methods.\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n clearRecordedData: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n mediaRecorder.clearRecordedData();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Cleared old recorded data.');\r\n }\r\n },\r\n\r\n /**\r\n * Get the recorded blob. Use this method inside the \"stopRecording\" callback.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.getBlob();\r\n *\r\n * var file = new File([blob], 'filename.webm', {\r\n * type: 'video/webm'\r\n * });\r\n *\r\n * var formData = new FormData();\r\n * formData.append('file', file); // upload \"File\" object rather than a \"Blob\"\r\n * uploadToServer(formData);\r\n * });\r\n * @returns {Blob} Returns recorded data as \"Blob\" object.\r\n */\r\n getBlob: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return mediaRecorder.blob;\r\n },\r\n\r\n /**\r\n * Get data-URI instead of Blob.\r\n * @param {function} callback - Callback to get the Data-URI.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * recorder.getDataURL(function(dataURI) {\r\n * video.src = dataURI;\r\n * });\r\n * });\r\n */\r\n getDataURL: getDataURL,\r\n\r\n /**\r\n * Get virtual/temporary URL. Usage of this URL is limited to current tab.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * video.src = this.toURL();\r\n * });\r\n * @returns {String} Returns a virtual/temporary URL for the recorded \"Blob\".\r\n */\r\n toURL: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return URL.createObjectURL(mediaRecorder.blob);\r\n },\r\n\r\n /**\r\n * Get internal recording object (i.e. internal module) e.g. MutliStreamRecorder, MediaStreamRecorder, StereoAudioRecorder or WhammyRecorder etc.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var internalRecorder = recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n getInternalRecorder: function() {\r\n return mediaRecorder;\r\n },\r\n\r\n /**\r\n * Invoke save-as dialog to save the recorded blob into your disk.\r\n * @param {string} fileName - Set your own file name.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * this.save('file-name');\r\n *\r\n * // or manually:\r\n * invokeSaveAsDialog(this.getBlob(), 'filename.webm');\r\n * });\r\n */\r\n save: function(fileName) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n invokeSaveAsDialog(mediaRecorder.blob, fileName);\r\n },\r\n\r\n /**\r\n * This method gets a blob from indexed-DB storage.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.getFromDisk(function(dataURL) {\r\n * video.src = dataURL;\r\n * });\r\n */\r\n getFromDisk: function(callback) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n RecordRTC.getFromDisk(config.type, callback);\r\n },\r\n\r\n /**\r\n * This method appends an array of webp images to the recorded video-blob. It takes an \"array\" object.\r\n * @type {Array.}\r\n * @param {Array} arrayOfWebPImages - Array of webp images.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * var arrayOfWebPImages = [];\r\n * arrayOfWebPImages.push({\r\n * duration: index,\r\n * image: 'data:image/webp;base64,...'\r\n * });\r\n * recorder.setAdvertisementArray(arrayOfWebPImages);\r\n */\r\n setAdvertisementArray: function(arrayOfWebPImages) {\r\n config.advertisement = [];\r\n\r\n var length = arrayOfWebPImages.length;\r\n for (var i = 0; i < length; i++) {\r\n config.advertisement.push({\r\n duration: i,\r\n image: arrayOfWebPImages[i]\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * It is equivalent to \"recorder.getBlob()\"
method. Usage of \"getBlob\" is recommended, though.\r\n * @property {Blob} blob - Recorded Blob can be accessed using this property.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.blob;\r\n *\r\n * // below one is recommended\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n blob: null,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} bufferSize - Buffer-size used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used this buffer-size: ' + this.bufferSize);\r\n * });\r\n */\r\n bufferSize: 0,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} sampleRate - Sample-rates used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used these sample-rates: ' + this.sampleRate);\r\n * });\r\n */\r\n sampleRate: 0,\r\n\r\n /**\r\n * {recorderType:StereoAudioRecorder} returns ArrayBuffer object.\r\n * @property {ArrayBuffer} buffer - Audio ArrayBuffer, supported only in Chrome.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var arrayBuffer = this.buffer;\r\n * alert(arrayBuffer.byteLength);\r\n * });\r\n */\r\n buffer: null,\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.reset();\r\n * recorder.startRecording();\r\n */\r\n reset: function() {\r\n if (self.state === 'recording' && !config.disableLogs) {\r\n console.warn('Stop an active recorder.');\r\n }\r\n\r\n if (mediaRecorder && typeof mediaRecorder.clearRecordedData === 'function') {\r\n mediaRecorder.clearRecordedData();\r\n }\r\n mediaRecorder = null;\r\n setState('inactive');\r\n self.blob = null;\r\n },\r\n\r\n /**\r\n * This method is called whenever recorder's state changes. Use this as an \"event\".\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.onStateChanged = function(state) {\r\n * console.log('Recorder state: ', state);\r\n * };\r\n */\r\n onStateChanged: function(state) {\r\n if (!config.disableLogs) {\r\n console.log('Recorder state changed:', state);\r\n }\r\n },\r\n\r\n /**\r\n * A recorder can have inactive, recording, paused or stopped states.\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * // this looper function will keep you updated about the recorder's states.\r\n * (function looper() {\r\n * document.querySelector('h1').innerHTML = 'Recorder\\'s state is: ' + recorder.state;\r\n * if(recorder.state === 'stopped') return; // ignore+stop\r\n * setTimeout(looper, 1000); // update after every 3-seconds\r\n * })();\r\n * recorder.startRecording();\r\n */\r\n state: 'inactive',\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n getState: function() {\r\n return self.state;\r\n },\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n destroy: function() {\r\n var disableLogsCache = config.disableLogs;\r\n\r\n config = {\r\n disableLogs: true\r\n };\r\n self.reset();\r\n setState('destroyed');\r\n returnObject = self = null;\r\n\r\n if (Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor.close();\r\n Storage.AudioContextConstructor = null;\r\n }\r\n\r\n config.disableLogs = disableLogsCache;\r\n\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC is destroyed.');\r\n }\r\n },\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n version: '5.6.2'\r\n };\r\n\r\n if (!this) {\r\n self = returnObject;\r\n return returnObject;\r\n }\r\n\r\n // if someone wants to use RecordRTC with the \"new\" keyword.\r\n for (var prop in returnObject) {\r\n this[prop] = returnObject[prop];\r\n }\r\n\r\n self = this;\r\n\r\n return returnObject;\r\n}\r\n\r\nRecordRTC.version = '5.6.2';\r\n\r\nif (typeof module !== 'undefined' /* && !!module.exports*/ ) {\r\n module.exports = RecordRTC;\r\n}\r\n\r\nif (typeof define === 'function' && define.amd) {\r\n define('RecordRTC', [], function() {\r\n return RecordRTC;\r\n });\r\n}\n\r\nRecordRTC.getFromDisk = function(type, callback) {\r\n if (!callback) {\r\n throw 'callback is mandatory.';\r\n }\r\n\r\n console.log('Getting recorded ' + (type === 'all' ? 'blobs' : type + ' blob ') + ' from disk!');\r\n DiskStorage.Fetch(function(dataURL, _type) {\r\n if (type !== 'all' && _type === type + 'Blob' && callback) {\r\n callback(dataURL);\r\n }\r\n\r\n if (type === 'all' && callback) {\r\n callback(dataURL, _type.replace('Blob', ''));\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * RecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nRecordRTC.writeToDisk = function(options) {\r\n console.log('Writing recorded blob(s) to disk!');\r\n options = options || {};\r\n if (options.audio && options.video && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.video) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.video && options.gif) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL\r\n });\r\n });\r\n } else if (options.video) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n } else if (options.gif) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n }\r\n};\n\r\n// __________________________\r\n// RecordRTC-Configuration.js\r\n\r\n/**\r\n * {@link RecordRTCConfiguration} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It configures the 2nd parameter passed over {@link RecordRTC} and returns a valid \"config\" object.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCConfiguration\r\n * @class\r\n * @example\r\n * var options = RecordRTCConfiguration(mediaStream, options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, getNativeBlob:true, etc.}\r\n */\r\n\r\nfunction RecordRTCConfiguration(mediaStream, config) {\r\n if (!config.recorderType && !config.type) {\r\n if (!!config.audio && !!config.video) {\r\n config.type = 'video';\r\n } else if (!!config.audio && !config.video) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n if (config.recorderType && !config.type) {\r\n if (config.recorderType === WhammyRecorder || config.recorderType === CanvasRecorder || (typeof WebAssemblyRecorder !== 'undefined' && config.recorderType === WebAssemblyRecorder)) {\r\n config.type = 'video';\r\n } else if (config.recorderType === GifRecorder) {\r\n config.type = 'gif';\r\n } else if (config.recorderType === StereoAudioRecorder) {\r\n config.type = 'audio';\r\n } else if (config.recorderType === MediaStreamRecorder) {\r\n if (getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (!getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (getTracks(mediaStream, 'audio').length && !getTracks(mediaStream, 'video').length) {\r\n config.type = 'audio';\r\n } else {\r\n // config.type = 'UnKnown';\r\n }\r\n }\r\n }\r\n\r\n if (typeof MediaStreamRecorder !== 'undefined' && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (!config.mimeType) {\r\n config.mimeType = 'video/webm';\r\n }\r\n\r\n if (!config.type) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n\r\n if (!config.bitsPerSecond) {\r\n // config.bitsPerSecond = 128000;\r\n }\r\n }\r\n\r\n // consider default type=audio\r\n if (!config.type) {\r\n if (config.mimeType) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n if (!config.type) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n return config;\r\n}\n\r\n// __________________\r\n// GetRecorderType.js\r\n\r\n/**\r\n * {@link GetRecorderType} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It returns best recorder-type available for your browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GetRecorderType\r\n * @class\r\n * @example\r\n * var RecorderType = GetRecorderType(options);\r\n * var recorder = new RecorderType(options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction GetRecorderType(mediaStream, config) {\r\n var recorder;\r\n\r\n // StereoAudioRecorder can work with all three: Edge, Firefox and Chrome\r\n // todo: detect if it is Edge, then auto use: StereoAudioRecorder\r\n if (isChrome || isEdge || isOpera) {\r\n // Media Stream Recording API has not been implemented in chrome yet;\r\n // That's why using WebAudio API to record stereo audio in WAV format\r\n recorder = StereoAudioRecorder;\r\n }\r\n\r\n if (typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype && !isChrome) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n // video recorder (in WebM format)\r\n if (config.type === 'video' && (isChrome || isOpera)) {\r\n recorder = WhammyRecorder;\r\n\r\n if (typeof WebAssemblyRecorder !== 'undefined' && typeof ReadableStream !== 'undefined') {\r\n recorder = WebAssemblyRecorder;\r\n }\r\n }\r\n\r\n // video recorder (in Gif format)\r\n if (config.type === 'gif') {\r\n recorder = GifRecorder;\r\n }\r\n\r\n // html2canvas recording!\r\n if (config.type === 'canvas') {\r\n recorder = CanvasRecorder;\r\n }\r\n\r\n if (isMediaRecorderCompatible() && recorder !== CanvasRecorder && recorder !== GifRecorder && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (getTracks(mediaStream, 'video').length || getTracks(mediaStream, 'audio').length) {\r\n // audio-only recording\r\n if (config.type === 'audio') {\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('audio/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n // else recorder = StereoAudioRecorder;\r\n } else {\r\n // video or screen tracks\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('video/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (mediaStream instanceof Array && mediaStream.length) {\r\n recorder = MultiStreamRecorder;\r\n }\r\n\r\n if (config.recorderType) {\r\n recorder = config.recorderType;\r\n }\r\n\r\n if (!config.disableLogs && !!recorder && !!recorder.name) {\r\n console.log('Using recorderType:', recorder.name || recorder.constructor.name);\r\n }\r\n\r\n if (!recorder && isSafari) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n return recorder;\r\n}\n\r\n// _____________\r\n// MRecordRTC.js\r\n\r\n/**\r\n * MRecordRTC runs on top of {@link RecordRTC} to bring multiple recordings in a single place, by providing simple API.\r\n * @summary MRecordRTC stands for \"Multiple-RecordRTC\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MRecordRTC\r\n * @class\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.addStream(MediaStream);\r\n * recorder.mediaType = {\r\n * audio: true, // or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif: true // or GifRecorder\r\n * };\r\n * // mimeType is optional and should be set only in advance cases.\r\n * recorder.mimeType = {\r\n * audio: 'audio/wav',\r\n * video: 'video/webm',\r\n * gif: 'image/gif'\r\n * };\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC/tree/master/MRecordRTC|MRecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction MRecordRTC(mediaStream) {\r\n\r\n /**\r\n * This method attaches MediaStream object to {@link MRecordRTC}.\r\n * @param {MediaStream} mediaStream - A MediaStream object, either fetched using getUserMedia API, or generated using captureStreamUntilEnded or WebAudio API.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.addStream(MediaStream);\r\n */\r\n this.addStream = function(_mediaStream) {\r\n if (_mediaStream) {\r\n mediaStream = _mediaStream;\r\n }\r\n };\r\n\r\n /**\r\n * This property can be used to set the recording type e.g. audio, or video, or gif, or canvas.\r\n * @property {object} mediaType - {audio: true, video: true, gif: true}\r\n * @memberof MRecordRTC\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.mediaType = {\r\n * audio: true, // TRUE or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // TRUE or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif : true // TRUE or GifRecorder\r\n * };\r\n */\r\n this.mediaType = {\r\n audio: true,\r\n video: true\r\n };\r\n\r\n /**\r\n * This method starts recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.startRecording();\r\n */\r\n this.startRecording = function() {\r\n var mediaType = this.mediaType;\r\n var recorderType;\r\n var mimeType = this.mimeType || {\r\n audio: null,\r\n video: null,\r\n gif: null\r\n };\r\n\r\n if (typeof mediaType.audio !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'audio').length) {\r\n mediaType.audio = false;\r\n }\r\n\r\n if (typeof mediaType.video !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.video = false;\r\n }\r\n\r\n if (typeof mediaType.gif !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.gif = false;\r\n }\r\n\r\n if (!mediaType.audio && !mediaType.video && !mediaType.gif) {\r\n throw 'MediaStream must have either audio or video tracks.';\r\n }\r\n\r\n if (!!mediaType.audio) {\r\n recorderType = null;\r\n if (typeof mediaType.audio === 'function') {\r\n recorderType = mediaType.audio;\r\n }\r\n\r\n this.audioRecorder = new RecordRTC(mediaStream, {\r\n type: 'audio',\r\n bufferSize: this.bufferSize,\r\n sampleRate: this.sampleRate,\r\n numberOfAudioChannels: this.numberOfAudioChannels || 2,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.audio,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp\r\n });\r\n\r\n if (!mediaType.video) {\r\n this.audioRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.video) {\r\n recorderType = null;\r\n if (typeof mediaType.video === 'function') {\r\n recorderType = mediaType.video;\r\n }\r\n\r\n var newStream = mediaStream;\r\n\r\n if (isMediaRecorderCompatible() && !!mediaType.audio && typeof mediaType.audio === 'function') {\r\n var videoTrack = getTracks(mediaStream, 'video')[0];\r\n\r\n if (isFirefox) {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n\r\n if (recorderType && recorderType === WhammyRecorder) {\r\n // Firefox does NOT supports webp-encoding yet\r\n // But Firefox do supports WebAssemblyRecorder\r\n recorderType = MediaStreamRecorder;\r\n }\r\n } else {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n }\r\n }\r\n\r\n this.videoRecorder = new RecordRTC(newStream, {\r\n type: 'video',\r\n video: this.video,\r\n canvas: this.canvas,\r\n frameInterval: this.frameInterval || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.video,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp,\r\n workerPath: this.workerPath,\r\n webAssemblyPath: this.webAssemblyPath,\r\n frameRate: this.frameRate, // used by WebAssemblyRecorder; values: usually 30; accepts any.\r\n bitrate: this.bitrate // used by WebAssemblyRecorder; values: 0 to 1000+\r\n });\r\n\r\n if (!mediaType.audio) {\r\n this.videoRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.audio && !!mediaType.video) {\r\n var self = this;\r\n\r\n var isSingleRecorder = isMediaRecorderCompatible() === true;\r\n\r\n if (mediaType.audio instanceof StereoAudioRecorder && !!mediaType.video) {\r\n isSingleRecorder = false;\r\n } else if (mediaType.audio !== true && mediaType.video !== true && mediaType.audio !== mediaType.video) {\r\n isSingleRecorder = false;\r\n }\r\n\r\n if (isSingleRecorder === true) {\r\n self.audioRecorder = null;\r\n self.videoRecorder.startRecording();\r\n } else {\r\n self.videoRecorder.initRecorder(function() {\r\n self.audioRecorder.initRecorder(function() {\r\n // Both recorders are ready to record things accurately\r\n self.videoRecorder.startRecording();\r\n self.audioRecorder.startRecording();\r\n });\r\n });\r\n }\r\n }\r\n\r\n if (!!mediaType.gif) {\r\n recorderType = null;\r\n if (typeof mediaType.gif === 'function') {\r\n recorderType = mediaType.gif;\r\n }\r\n this.gifRecorder = new RecordRTC(mediaStream, {\r\n type: 'gif',\r\n frameRate: this.frameRate || 200,\r\n quality: this.quality || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.gif\r\n });\r\n this.gifRecorder.startRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording.\r\n * @param {function} callback - Callback function is invoked when all encoders finished their jobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.stopRecording(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n */\r\n this.stopRecording = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (this.audioRecorder) {\r\n this.audioRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'audio');\r\n });\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'video');\r\n });\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'gif');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.pauseRecording();\r\n */\r\n this.pauseRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.pauseRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.pauseRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.pauseRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.resumeRecording();\r\n */\r\n this.resumeRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.resumeRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.resumeRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.resumeRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs.\r\n * @param {function} callback - All recorded blobs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getBlob(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n * // or\r\n * var audioBlob = recorder.getBlob().audio;\r\n * var videoBlob = recorder.getBlob().video;\r\n */\r\n this.getBlob = function(callback) {\r\n var output = {};\r\n\r\n if (this.audioRecorder) {\r\n output.audio = this.audioRecorder.getBlob();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n output.video = this.videoRecorder.getBlob();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n output.gif = this.gifRecorder.getBlob();\r\n }\r\n\r\n if (callback) {\r\n callback(output);\r\n }\r\n\r\n return output;\r\n };\r\n\r\n /**\r\n * Destroy all recorder instances.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n this.destroy = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.destroy();\r\n this.audioRecorder = null;\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.destroy();\r\n this.videoRecorder = null;\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.destroy();\r\n this.gifRecorder = null;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs' DataURLs.\r\n * @param {function} callback - All recorded blobs' DataURLs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getDataURL(function(recording){\r\n * var audioDataURL = recording.audio;\r\n * var videoDataURL = recording.video;\r\n * var gifDataURL = recording.gif;\r\n * });\r\n */\r\n this.getDataURL = function(callback) {\r\n this.getBlob(function(blob) {\r\n if (blob.audio && blob.video) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n audio: _audioDataURL,\r\n video: _videoDataURL\r\n });\r\n });\r\n });\r\n } else if (blob.audio) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n callback({\r\n audio: _audioDataURL\r\n });\r\n });\r\n } else if (blob.video) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n video: _videoDataURL\r\n });\r\n });\r\n }\r\n });\r\n\r\n function getDataURL(blob, callback00) {\r\n if (typeof Worker !== 'undefined') {\r\n var webWorker = processInWebWorker(function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n });\r\n\r\n webWorker.onmessage = function(event) {\r\n callback00(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback00(event.target.result);\r\n };\r\n }\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n var url;\r\n if (typeof URL !== 'undefined') {\r\n url = URL;\r\n } else if (typeof webkitURL !== 'undefined') {\r\n url = webkitURL;\r\n } else {\r\n throw 'Neither URL nor webkitURL detected.';\r\n }\r\n url.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to ask {@link MRecordRTC} to write all recorded blobs into IndexedDB storage.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.writeToDisk();\r\n */\r\n this.writeToDisk = function() {\r\n RecordRTC.writeToDisk({\r\n audio: this.audioRecorder,\r\n video: this.videoRecorder,\r\n gif: this.gifRecorder\r\n });\r\n };\r\n\r\n /**\r\n * This method can be used to invoke a save-as dialog for all recorded blobs.\r\n * @param {object} args - {audio: 'audio-name', video: 'video-name', gif: 'gif-name'}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.save({\r\n * audio: 'audio-file-name',\r\n * video: 'video-file-name',\r\n * gif : 'gif-file-name'\r\n * });\r\n */\r\n this.save = function(args) {\r\n args = args || {\r\n audio: true,\r\n video: true,\r\n gif: true\r\n };\r\n\r\n if (!!args.audio && this.audioRecorder) {\r\n this.audioRecorder.save(typeof args.audio === 'string' ? args.audio : '');\r\n }\r\n\r\n if (!!args.video && this.videoRecorder) {\r\n this.videoRecorder.save(typeof args.video === 'string' ? args.video : '');\r\n }\r\n if (!!args.gif && this.gifRecorder) {\r\n this.gifRecorder.save(typeof args.gif === 'string' ? args.gif : '');\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * This method can be used to get all recorded blobs from IndexedDB storage.\r\n * @param {string} type - 'all' or 'audio' or 'video' or 'gif'\r\n * @param {function} callback - Callback function to get all stored blobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.getFromDisk('all', function(dataURL, type){\r\n * if(type === 'audio') { }\r\n * if(type === 'video') { }\r\n * if(type === 'gif') { }\r\n * });\r\n */\r\nMRecordRTC.getFromDisk = RecordRTC.getFromDisk;\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nMRecordRTC.writeToDisk = RecordRTC.writeToDisk;\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MRecordRTC = MRecordRTC;\r\n}\n\r\nvar browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n(function(that) {\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n})(typeof global !== 'undefined' ? global : null);\n\r\n// _____________________________\r\n// Cross-Browser-Declarations.js\r\n\r\n// animation-frame used in WebM recording\r\n\r\n/*jshint -W079 */\r\nvar requestAnimationFrame = window.requestAnimationFrame;\r\nif (typeof requestAnimationFrame === 'undefined') {\r\n if (typeof webkitRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = webkitRequestAnimationFrame;\r\n } else if (typeof mozRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = mozRequestAnimationFrame;\r\n } else if (typeof msRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = msRequestAnimationFrame;\r\n } else if (typeof requestAnimationFrame === 'undefined') {\r\n // via: https://gist.github.com/paulirish/1579671\r\n var lastTime = 0;\r\n\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = function(callback, element) {\r\n var currTime = new Date().getTime();\r\n var timeToCall = Math.max(0, 16 - (currTime - lastTime));\r\n var id = setTimeout(function() {\r\n callback(currTime + timeToCall);\r\n }, timeToCall);\r\n lastTime = currTime + timeToCall;\r\n return id;\r\n };\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar cancelAnimationFrame = window.cancelAnimationFrame;\r\nif (typeof cancelAnimationFrame === 'undefined') {\r\n if (typeof webkitCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = webkitCancelAnimationFrame;\r\n } else if (typeof mozCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = mozCancelAnimationFrame;\r\n } else if (typeof msCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = msCancelAnimationFrame;\r\n } else if (typeof cancelAnimationFrame === 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = function(id) {\r\n clearTimeout(id);\r\n };\r\n }\r\n}\r\n\r\n// WebAudio API representer\r\nvar AudioContext = window.AudioContext;\r\n\r\nif (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar URL = window.URL;\r\n\r\nif (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n}\r\n\r\nif (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n}\r\n\r\nvar isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveBlob || !!navigator.msSaveOrOpenBlob);\r\nvar isOpera = !!window.opera || navigator.userAgent.indexOf('OPR/') !== -1;\r\nvar isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1 && ('netscape' in window) && / rv:/.test(navigator.userAgent);\r\nvar isChrome = (!isOpera && !isEdge && !!navigator.webkitGetUserMedia) || isElectron() || navigator.userAgent.toLowerCase().indexOf('chrome/') !== -1;\r\n\r\nvar isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n\r\nif (isSafari && !isChrome && navigator.userAgent.indexOf('CriOS') !== -1) {\r\n isSafari = false;\r\n isChrome = true;\r\n}\r\n\r\nvar MediaStream = window.MediaStream;\r\n\r\nif (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n}\r\n\r\n/*global MediaStream:true */\r\nif (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n}\r\n\r\n// below function via: http://goo.gl/B3ae8c\r\n/**\r\n * Return human-readable file size.\r\n * @param {number} bytes - Pass bytes and get formatted string.\r\n * @returns {string} - formatted string\r\n * @example\r\n * bytesToSize(1024*1024*5) === '5 GB'\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction bytesToSize(bytes) {\r\n var k = 1000;\r\n var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n if (bytes === 0) {\r\n return '0 Bytes';\r\n }\r\n var i = parseInt(Math.floor(Math.log(bytes) / Math.log(k)), 10);\r\n return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object. This parameter is required.\r\n * @param {string} fileName - Optional file name e.g. \"Recorded-Video.webm\"\r\n * @example\r\n * invokeSaveAsDialog(blob or file, [optional] fileName);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction invokeSaveAsDialog(file, fileName) {\r\n if (!file) {\r\n throw 'Blob object is required.';\r\n }\r\n\r\n if (!file.type) {\r\n try {\r\n file.type = 'video/webm';\r\n } catch (e) {}\r\n }\r\n\r\n var fileExtension = (file.type || 'video/webm').split('/')[1];\r\n if (fileExtension.indexOf(';') !== -1) {\r\n // extended mimetype, e.g. 'video/webm;codecs=vp8,opus'\r\n fileExtension = fileExtension.split(';')[0];\r\n }\r\n if (fileName && fileName.indexOf('.') !== -1) {\r\n var splitted = fileName.split('.');\r\n fileName = splitted[0];\r\n fileExtension = splitted[1];\r\n }\r\n\r\n var fileFullName = (fileName || (Math.round(Math.random() * 9999999999) + 888888888)) + '.' + fileExtension;\r\n\r\n if (typeof navigator.msSaveOrOpenBlob !== 'undefined') {\r\n return navigator.msSaveOrOpenBlob(file, fileFullName);\r\n } else if (typeof navigator.msSaveBlob !== 'undefined') {\r\n return navigator.msSaveBlob(file, fileFullName);\r\n }\r\n\r\n var hyperlink = document.createElement('a');\r\n hyperlink.href = URL.createObjectURL(file);\r\n hyperlink.download = fileFullName;\r\n\r\n hyperlink.style = 'display:none;opacity:0;color:transparent;';\r\n (document.body || document.documentElement).appendChild(hyperlink);\r\n\r\n if (typeof hyperlink.click === 'function') {\r\n hyperlink.click();\r\n } else {\r\n hyperlink.target = '_blank';\r\n hyperlink.dispatchEvent(new MouseEvent('click', {\r\n view: window,\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n }\r\n\r\n URL.revokeObjectURL(hyperlink.href);\r\n}\r\n\r\n/**\r\n * from: https://github.com/cheton/is-electron/blob/master/index.js\r\n **/\r\nfunction isElectron() {\r\n // Renderer process\r\n if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {\r\n return true;\r\n }\r\n\r\n // Main process\r\n if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) {\r\n return true;\r\n }\r\n\r\n // Detect the user agent when the `nodeIntegration` option is set to true\r\n if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getTracks(stream, kind) {\r\n if (!stream || !stream.getTracks) {\r\n return [];\r\n }\r\n\r\n return stream.getTracks().filter(function(t) {\r\n return t.kind === (kind || 'audio');\r\n });\r\n}\r\n\r\nfunction setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object.\r\n * @param {function} callback - Callback function.\r\n * @example\r\n * getSeekableBlob(blob or file, callback);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction getSeekableBlob(inputBlob, callback) {\r\n // EBML.js copyrights goes to: https://github.com/legokichi/ts-ebml\r\n if (typeof EBML === 'undefined') {\r\n throw new Error('Please link: https://www.webrtc-experiment.com/EBML.js');\r\n }\r\n\r\n var reader = new EBML.Reader();\r\n var decoder = new EBML.Decoder();\r\n var tools = EBML.tools;\r\n\r\n var fileReader = new FileReader();\r\n fileReader.onload = function(e) {\r\n var ebmlElms = decoder.decode(this.result);\r\n ebmlElms.forEach(function(element) {\r\n reader.read(element);\r\n });\r\n reader.stop();\r\n var refinedMetadataBuf = tools.makeMetadataSeekable(reader.metadatas, reader.duration, reader.cues);\r\n var body = this.result.slice(reader.metadataSize);\r\n var newBlob = new Blob([refinedMetadataBuf, body], {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(newBlob);\r\n };\r\n fileReader.readAsArrayBuffer(inputBlob);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.invokeSaveAsDialog = invokeSaveAsDialog;\r\n RecordRTC.getTracks = getTracks;\r\n RecordRTC.getSeekableBlob = getSeekableBlob;\r\n RecordRTC.bytesToSize = bytesToSize;\r\n RecordRTC.isElectron = isElectron;\r\n}\r\n\r\n// __________ (used to handle stuff like http://goo.gl/xmE5eg) issue #129\r\n// Storage.js\r\n\r\n/**\r\n * Storage is a standalone object used by {@link RecordRTC} to store reusable objects e.g. \"new AudioContext\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * Storage.AudioContext === webkitAudioContext\r\n * @property {webkitAudioContext} AudioContext - Keeps a reference to AudioContext object.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Storage = {};\r\n\r\nif (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n} else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Storage = Storage;\r\n}\n\r\nfunction isMediaRecorderCompatible() {\r\n if (isFirefox || isSafari || isEdge) {\r\n return true;\r\n }\r\n\r\n var nVer = navigator.appVersion;\r\n var nAgt = navigator.userAgent;\r\n var fullVersion = '' + parseFloat(navigator.appVersion);\r\n var majorVersion = parseInt(navigator.appVersion, 10);\r\n var nameOffset, verOffset, ix;\r\n\r\n if (isChrome || isOpera) {\r\n verOffset = nAgt.indexOf('Chrome');\r\n fullVersion = nAgt.substring(verOffset + 7);\r\n }\r\n\r\n // trim the fullVersion string at semicolon/space if present\r\n if ((ix = fullVersion.indexOf(';')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n if ((ix = fullVersion.indexOf(' ')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n majorVersion = parseInt('' + fullVersion, 10);\r\n\r\n if (isNaN(majorVersion)) {\r\n fullVersion = '' + parseFloat(navigator.appVersion);\r\n majorVersion = parseInt(navigator.appVersion, 10);\r\n }\r\n\r\n return majorVersion >= 49;\r\n}\n\r\n// ______________________\r\n// MediaStreamRecorder.js\r\n\r\n/**\r\n * MediaStreamRecorder is an abstraction layer for {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}. It is used by {@link RecordRTC} to record MediaStream(s) in both Chrome and Firefox.\r\n * @summary Runs top over {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://github.com/muaz-khan|Muaz Khan}\r\n * @typedef MediaStreamRecorder\r\n * @class\r\n * @example\r\n * var config = {\r\n * mimeType: 'video/webm', // vp8, vp9, h264, mkv, opus/vorbis\r\n * audioBitsPerSecond : 256 * 8 * 1024,\r\n * videoBitsPerSecond : 256 * 8 * 1024,\r\n * bitsPerSecond: 256 * 8 * 1024, // if this is provided, skip above two\r\n * checkForInactiveTracks: true,\r\n * timeSlice: 1000, // concatenate intervals based blobs\r\n * ondataavailable: function() {} // get intervals based blobs\r\n * }\r\n * var recorder = new MediaStreamRecorder(mediaStream, config);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs:true, initCallback: function, mimeType: \"video/webm\", timeSlice: 1000}\r\n * @throws Will throw an error if first argument \"MediaStream\" is missing. Also throws error if \"MediaRecorder API\" are not supported by the browser.\r\n */\r\n\r\nfunction MediaStreamRecorder(mediaStream, config) {\r\n var self = this;\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n if (typeof MediaRecorder === 'undefined') {\r\n throw 'Your browser does not support the Media Recorder API. Please try other modules e.g. WhammyRecorder or StereoAudioRecorder.';\r\n }\r\n\r\n config = config || {\r\n // bitsPerSecond: 256 * 8 * 1024,\r\n mimeType: 'video/webm'\r\n };\r\n\r\n if (config.type === 'audio') {\r\n if (getTracks(mediaStream, 'video').length && getTracks(mediaStream, 'audio').length) {\r\n var stream;\r\n if (!!navigator.mozGetUserMedia) {\r\n stream = new MediaStream();\r\n stream.addTrack(getTracks(mediaStream, 'audio')[0]);\r\n } else {\r\n // webkitMediaStream\r\n stream = new MediaStream(getTracks(mediaStream, 'audio'));\r\n }\r\n mediaStream = stream;\r\n }\r\n\r\n if (!config.mimeType || config.mimeType.toString().toLowerCase().indexOf('audio') === -1) {\r\n config.mimeType = isChrome ? 'audio/webm' : 'audio/ogg';\r\n }\r\n\r\n if (config.mimeType && config.mimeType.toString().toLowerCase() !== 'audio/ogg' && !!navigator.mozGetUserMedia) {\r\n // forcing better codecs on Firefox (via #166)\r\n config.mimeType = 'audio/ogg';\r\n }\r\n }\r\n\r\n var arrayOfBlobs = [];\r\n\r\n /**\r\n * This method returns array of blobs. Use only with \"timeSlice\". Its useful to preview recording anytime, without using the \"stop\" method.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var arrayOfBlobs = recorder.getArrayOfBlobs();\r\n * @returns {Array} Returns array of recorded blobs.\r\n */\r\n this.getArrayOfBlobs = function() {\r\n return arrayOfBlobs;\r\n };\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // set defaults\r\n self.blob = null;\r\n self.clearRecordedData();\r\n self.timestamps = [];\r\n allStates = [];\r\n arrayOfBlobs = [];\r\n\r\n var recorderHints = config;\r\n\r\n if (!config.disableLogs) {\r\n console.log('Passing following config over MediaRecorder API.', recorderHints);\r\n }\r\n\r\n if (mediaRecorder) {\r\n // mandatory to make sure Firefox doesn't fails to record streams 3-4 times without reloading the page.\r\n mediaRecorder = null;\r\n }\r\n\r\n if (isChrome && !isMediaRecorderCompatible()) {\r\n // to support video-only recording on stable\r\n recorderHints = 'video/vp8';\r\n }\r\n\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && recorderHints.mimeType) {\r\n if (!MediaRecorder.isTypeSupported(recorderHints.mimeType)) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n\r\n recorderHints.mimeType = config.type === 'audio' ? 'audio/webm' : 'video/webm';\r\n }\r\n }\r\n\r\n // using MediaRecorder API here\r\n try {\r\n mediaRecorder = new MediaRecorder(mediaStream, recorderHints);\r\n\r\n // reset\r\n config.mimeType = recorderHints.mimeType;\r\n } catch (e) {\r\n // chrome-based fallback\r\n mediaRecorder = new MediaRecorder(mediaStream);\r\n }\r\n\r\n // old hack?\r\n if (recorderHints.mimeType && !MediaRecorder.isTypeSupported && 'canRecordMimeType' in mediaRecorder && mediaRecorder.canRecordMimeType(recorderHints.mimeType) === false) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n }\r\n\r\n // Dispatching OnDataAvailable Handler\r\n mediaRecorder.ondataavailable = function(e) {\r\n if (e.data) {\r\n allStates.push('ondataavailable: ' + bytesToSize(e.data.size));\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n if (e.data && e.data.size) {\r\n arrayOfBlobs.push(e.data);\r\n updateTimeStamp();\r\n\r\n if (typeof config.ondataavailable === 'function') {\r\n // intervals based blobs\r\n var blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n config.ondataavailable(blob);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (!e.data || !e.data.size || e.data.size < 100 || self.blob) {\r\n // make sure that stopRecording always getting fired\r\n // even if there is invalid data\r\n if (self.recordingCallback) {\r\n self.recordingCallback(new Blob([], {\r\n type: getMimeType(recorderHints)\r\n }));\r\n self.recordingCallback = null;\r\n }\r\n return;\r\n }\r\n\r\n self.blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n\r\n if (self.recordingCallback) {\r\n self.recordingCallback(self.blob);\r\n self.recordingCallback = null;\r\n }\r\n };\r\n\r\n mediaRecorder.onstart = function() {\r\n allStates.push('started');\r\n };\r\n\r\n mediaRecorder.onpause = function() {\r\n allStates.push('paused');\r\n };\r\n\r\n mediaRecorder.onresume = function() {\r\n allStates.push('resumed');\r\n };\r\n\r\n mediaRecorder.onstop = function() {\r\n allStates.push('stopped');\r\n };\r\n\r\n mediaRecorder.onerror = function(error) {\r\n if (!error) {\r\n return;\r\n }\r\n\r\n if (!error.name) {\r\n error.name = 'UnknownError';\r\n }\r\n\r\n allStates.push('error: ' + error);\r\n\r\n if (!config.disableLogs) {\r\n // via: https://w3c.github.io/mediacapture-record/MediaRecorder.html#exception-summary\r\n if (error.name.toString().toLowerCase().indexOf('invalidstate') !== -1) {\r\n console.error('The MediaRecorder is not in a state in which the proposed operation is allowed to be executed.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('notsupported') !== -1) {\r\n console.error('MIME type (', recorderHints.mimeType, ') is not supported.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('security') !== -1) {\r\n console.error('MediaRecorder security error', error);\r\n }\r\n\r\n // older code below\r\n else if (error.name === 'OutOfMemory') {\r\n console.error('The UA has exhaused the available memory. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'IllegalStreamModification') {\r\n console.error('A modification to the stream has occurred that makes it impossible to continue recording. An example would be the addition of a Track while recording is occurring. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'OtherRecordingError') {\r\n console.error('Used for an fatal error other than those listed above. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'GenericError') {\r\n console.error('The UA cannot provide the codec or recording option that has been requested.', error);\r\n } else {\r\n console.error('MediaRecorder Error', error);\r\n }\r\n }\r\n\r\n (function(looper) {\r\n if (!self.manuallyStopped && mediaRecorder && mediaRecorder.state === 'inactive') {\r\n delete config.timeslice;\r\n\r\n // 10 minutes, enough?\r\n mediaRecorder.start(10 * 60 * 1000);\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000);\r\n })();\r\n\r\n if (mediaRecorder.state !== 'inactive' && mediaRecorder.state !== 'stopped') {\r\n mediaRecorder.stop();\r\n }\r\n };\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n updateTimeStamp();\r\n mediaRecorder.start(config.timeSlice);\r\n } else {\r\n // default is 60 minutes; enough?\r\n // use config => {timeSlice: 1000} otherwise\r\n\r\n mediaRecorder.start(3.6e+6);\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback(); // old code\r\n }\r\n };\r\n\r\n /**\r\n * @property {Array} timestamps - Array of time stamps\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * console.log(recorder.timestamps);\r\n */\r\n this.timestamps = [];\r\n\r\n function updateTimeStamp() {\r\n self.timestamps.push(new Date().getTime());\r\n\r\n if (typeof config.onTimeStamp === 'function') {\r\n config.onTimeStamp(self.timestamps[self.timestamps.length - 1], self.timestamps);\r\n }\r\n }\r\n\r\n function getMimeType(secondObject) {\r\n if (mediaRecorder && mediaRecorder.mimeType) {\r\n return mediaRecorder.mimeType;\r\n }\r\n\r\n return secondObject.mimeType || 'video/webm';\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n self.manuallyStopped = true; // used inside the mediaRecorder.onerror\r\n\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.recordingCallback = callback;\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.stop();\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n setTimeout(function() {\r\n self.blob = new Blob(arrayOfBlobs, {\r\n type: getMimeType(config)\r\n });\r\n\r\n self.recordingCallback(self.blob);\r\n }, 100);\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'paused') {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder && mediaRecorder.state === 'recording') {\r\n self.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n arrayOfBlobs = [];\r\n mediaRecorder = null;\r\n self.timestamps = [];\r\n }\r\n\r\n // Reference to \"MediaRecorder\" object\r\n var mediaRecorder;\r\n\r\n /**\r\n * Access to native MediaRecorder API\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @instance\r\n * @example\r\n * var internal = recorder.getInternalRecorder();\r\n * internal.ondataavailable = function() {}; // override\r\n * internal.stream, internal.onpause, internal.onstop, etc.\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n this.getInternalRecorder = function() {\r\n return mediaRecorder;\r\n };\r\n\r\n function isMediaStreamActive() {\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n\r\n\r\n /**\r\n * Get MediaRecorder readonly state.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n if (!mediaRecorder) {\r\n return 'inactive';\r\n }\r\n\r\n return mediaRecorder.state || 'inactive';\r\n };\r\n\r\n // list of all recording states\r\n var allStates = [];\r\n\r\n /**\r\n * Get MediaRecorder all recording states.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getAllStates();\r\n * @returns {Array} Returns all recording states\r\n */\r\n this.getAllStates = function() {\r\n return allStates;\r\n };\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = false; // disable to minimize CPU usage\r\n }\r\n\r\n var self = this;\r\n\r\n // this method checks if media stream is stopped\r\n // or if any track is ended.\r\n (function looper() {\r\n if (!mediaRecorder || config.checkForInactiveTracks === false) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n self.stop();\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000); // check every second\r\n })();\r\n\r\n // for debugging\r\n this.name = 'MediaStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MediaStreamRecorder = MediaStreamRecorder;\r\n}\r\n\r\n// source code from: http://typedarray.org/wp-content/projects/WebAudioRecorder/script.js\r\n// https://github.com/mattdiamond/Recorderjs#license-mit\r\n// ______________________\r\n// StereoAudioRecorder.js\r\n\r\n/**\r\n * StereoAudioRecorder is a standalone class used by {@link RecordRTC} to bring \"stereo\" audio-recording in chrome.\r\n * @summary JavaScript standalone object for stereo audio recording.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef StereoAudioRecorder\r\n * @class\r\n * @example\r\n * var recorder = new StereoAudioRecorder(MediaStream, {\r\n * sampleRate: 44100,\r\n * bufferSize: 4096\r\n * });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {sampleRate: 44100, bufferSize: 4096, numberOfAudioChannels: 1, etc.}\r\n */\r\n\r\nfunction StereoAudioRecorder(mediaStream, config) {\r\n if (!getTracks(mediaStream, 'audio').length) {\r\n throw 'Your stream has no audio tracks.';\r\n }\r\n\r\n config = config || {};\r\n\r\n var self = this;\r\n\r\n // variables\r\n var leftchannel = [];\r\n var rightchannel = [];\r\n var recording = false;\r\n var recordingLength = 0;\r\n var jsAudioNode;\r\n\r\n var numberOfAudioChannels = 2;\r\n\r\n /**\r\n * Set sample rates such as 8K or 16K. Reference: http://stackoverflow.com/a/28977136/552182\r\n * @property {number} desiredSampRate - Desired Bits per sample * 1000\r\n * @memberof StereoAudioRecorder\r\n * @instance\r\n * @example\r\n * var recorder = StereoAudioRecorder(mediaStream, {\r\n * desiredSampRate: 16 * 1000 // bits-per-sample * 1000\r\n * });\r\n */\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n // backward compatibility\r\n if (config.leftChannel === true) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (config.numberOfAudioChannels === 1) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (!numberOfAudioChannels || numberOfAudioChannels < 1) {\r\n numberOfAudioChannels = 2;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('StereoAudioRecorder is set to record number of channels: ' + numberOfAudioChannels);\r\n }\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = true;\r\n }\r\n\r\n function isMediaStreamActive() {\r\n if (config.checkForInactiveTracks === false) {\r\n // always return \"true\"\r\n return true;\r\n }\r\n\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n resetVariables();\r\n\r\n isAudioProcessStarted = isPaused = false;\r\n recording = true;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n looper();\r\n }\r\n };\r\n\r\n function mergeLeftRightBuffers(config, callback) {\r\n function mergeAudioBuffers(config, cb) {\r\n var numberOfAudioChannels = config.numberOfAudioChannels;\r\n\r\n // todo: \"slice(0)\" --- is it causes loop? Should be removed?\r\n var leftBuffers = config.leftBuffers.slice(0);\r\n var rightBuffers = config.rightBuffers.slice(0);\r\n var sampleRate = config.sampleRate;\r\n var internalInterleavedLength = config.internalInterleavedLength;\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n rightBuffers = mergeBuffers(rightBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n rightBuffers = interpolateArray(rightBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n // set sample rate as desired sample rate\r\n if (desiredSampRate) {\r\n sampleRate = desiredSampRate;\r\n }\r\n\r\n // for changing the sampling rate, reference:\r\n // http://stackoverflow.com/a/28977136/552182\r\n function interpolateArray(data, newSampleRate, oldSampleRate) {\r\n var fitCount = Math.round(data.length * (newSampleRate / oldSampleRate));\r\n var newData = [];\r\n var springFactor = Number((data.length - 1) / (fitCount - 1));\r\n newData[0] = data[0];\r\n for (var i = 1; i < fitCount - 1; i++) {\r\n var tmp = i * springFactor;\r\n var before = Number(Math.floor(tmp)).toFixed();\r\n var after = Number(Math.ceil(tmp)).toFixed();\r\n var atPoint = tmp - before;\r\n newData[i] = linearInterpolate(data[before], data[after], atPoint);\r\n }\r\n newData[fitCount - 1] = data[data.length - 1];\r\n return newData;\r\n }\r\n\r\n function linearInterpolate(before, after, atPoint) {\r\n return before + (after - before) * atPoint;\r\n }\r\n\r\n function mergeBuffers(channelBuffer, rLength) {\r\n var result = new Float64Array(rLength);\r\n var offset = 0;\r\n var lng = channelBuffer.length;\r\n\r\n for (var i = 0; i < lng; i++) {\r\n var buffer = channelBuffer[i];\r\n result.set(buffer, offset);\r\n offset += buffer.length;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function interleave(leftChannel, rightChannel) {\r\n var length = leftChannel.length + rightChannel.length;\r\n\r\n var result = new Float64Array(length);\r\n\r\n var inputIndex = 0;\r\n\r\n for (var index = 0; index < length;) {\r\n result[index++] = leftChannel[inputIndex];\r\n result[index++] = rightChannel[inputIndex];\r\n inputIndex++;\r\n }\r\n return result;\r\n }\r\n\r\n function writeUTFBytes(view, offset, string) {\r\n var lng = string.length;\r\n for (var i = 0; i < lng; i++) {\r\n view.setUint8(offset + i, string.charCodeAt(i));\r\n }\r\n }\r\n\r\n // interleave both channels together\r\n var interleaved;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n interleaved = interleave(leftBuffers, rightBuffers);\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n interleaved = leftBuffers;\r\n }\r\n\r\n var interleavedLength = interleaved.length;\r\n\r\n // create wav file\r\n var resultingBufferLength = 44 + interleavedLength * 2;\r\n\r\n var buffer = new ArrayBuffer(resultingBufferLength);\r\n\r\n var view = new DataView(buffer);\r\n\r\n // RIFF chunk descriptor/identifier \r\n writeUTFBytes(view, 0, 'RIFF');\r\n\r\n // RIFF chunk length\r\n // changed \"44\" to \"36\" via #401\r\n view.setUint32(4, 36 + interleavedLength * 2, true);\r\n\r\n // RIFF type \r\n writeUTFBytes(view, 8, 'WAVE');\r\n\r\n // format chunk identifier \r\n // FMT sub-chunk\r\n writeUTFBytes(view, 12, 'fmt ');\r\n\r\n // format chunk length \r\n view.setUint32(16, 16, true);\r\n\r\n // sample format (raw)\r\n view.setUint16(20, 1, true);\r\n\r\n // stereo (2 channels)\r\n view.setUint16(22, numberOfAudioChannels, true);\r\n\r\n // sample rate \r\n view.setUint32(24, sampleRate, true);\r\n\r\n // byte rate (sample rate * block align)\r\n view.setUint32(28, sampleRate * numberOfAudioChannels * 2, true);\r\n\r\n // block align (channel count * bytes per sample) \r\n view.setUint16(32, numberOfAudioChannels * 2, true);\r\n\r\n // bits per sample \r\n view.setUint16(34, 16, true);\r\n\r\n // data sub-chunk\r\n // data chunk identifier \r\n writeUTFBytes(view, 36, 'data');\r\n\r\n // data chunk length \r\n view.setUint32(40, interleavedLength * 2, true);\r\n\r\n // write the PCM samples\r\n var lng = interleavedLength;\r\n var index = 44;\r\n var volume = 1;\r\n for (var i = 0; i < lng; i++) {\r\n view.setInt16(index, interleaved[i] * (0x7FFF * volume), true);\r\n index += 2;\r\n }\r\n\r\n if (cb) {\r\n return cb({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n postMessage({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n if (config.noWorker) {\r\n mergeAudioBuffers(config, function(data) {\r\n callback(data.buffer, data.view);\r\n });\r\n return;\r\n }\r\n\r\n\r\n var webWorker = processInWebWorker(mergeAudioBuffers);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data.buffer, event.data.view);\r\n\r\n // release memory\r\n URL.revokeObjectURL(webWorker.workerURL);\r\n\r\n // kill webworker (or Chrome will kill your page after ~25 calls)\r\n webWorker.terminate();\r\n };\r\n\r\n webWorker.postMessage(config);\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var workerURL = URL.createObjectURL(new Blob([_function.toString(),\r\n ';this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(workerURL);\r\n worker.workerURL = workerURL;\r\n return worker;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n // stop recording\r\n recording = false;\r\n\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: recordingLength,\r\n leftBuffers: leftchannel,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : rightchannel,\r\n noWorker: config.noWorker\r\n }, function(buffer, view) {\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n self.blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n\r\n /**\r\n * @property {ArrayBuffer} buffer - The recorded buffer object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var buffer = recorder.buffer;\r\n * });\r\n */\r\n self.buffer = new ArrayBuffer(view.buffer.byteLength);\r\n\r\n /**\r\n * @property {DataView} view - The recorded data-view object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var view = recorder.view;\r\n * });\r\n */\r\n self.view = view;\r\n\r\n self.sampleRate = desiredSampRate || sampleRate;\r\n self.bufferSize = bufferSize;\r\n\r\n // recorded audio length\r\n self.length = recordingLength;\r\n\r\n isAudioProcessStarted = false;\r\n\r\n if (callback) {\r\n callback(self.blob);\r\n }\r\n });\r\n };\r\n\r\n if (typeof RecordRTC.Storage === 'undefined') {\r\n RecordRTC.Storage = {\r\n AudioContextConstructor: null,\r\n AudioContext: window.AudioContext || window.webkitAudioContext\r\n };\r\n }\r\n\r\n if (!RecordRTC.Storage.AudioContextConstructor || RecordRTC.Storage.AudioContextConstructor.state === 'closed') {\r\n RecordRTC.Storage.AudioContextConstructor = new RecordRTC.Storage.AudioContext();\r\n }\r\n\r\n var context = RecordRTC.Storage.AudioContextConstructor;\r\n\r\n // creates an audio node from the microphone incoming stream\r\n var audioInput = context.createMediaStreamSource(mediaStream);\r\n\r\n var legalBufferValues = [0, 256, 512, 1024, 2048, 4096, 8192, 16384];\r\n\r\n /**\r\n * From the spec: This value controls how frequently the audioprocess event is\r\n * dispatched and how many sample-frames need to be processed each call.\r\n * Lower values for buffer size will result in a lower (better) latency.\r\n * Higher values will be necessary to avoid audio breakup and glitches\r\n * The size of the buffer (in sample-frames) which needs to\r\n * be processed each time onprocessaudio is called.\r\n * Legal values are (256, 512, 1024, 2048, 4096, 8192, 16384).\r\n * @property {number} bufferSize - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * bufferSize: 4096\r\n * });\r\n */\r\n\r\n // \"0\" means, let chrome decide the most accurate buffer-size for current platform.\r\n var bufferSize = typeof config.bufferSize === 'undefined' ? 4096 : config.bufferSize;\r\n\r\n if (legalBufferValues.indexOf(bufferSize) === -1) {\r\n if (!config.disableLogs) {\r\n console.log('Legal values for buffer-size are ' + JSON.stringify(legalBufferValues, null, '\\t'));\r\n }\r\n }\r\n\r\n if (context.createJavaScriptNode) {\r\n jsAudioNode = context.createJavaScriptNode(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else if (context.createScriptProcessor) {\r\n jsAudioNode = context.createScriptProcessor(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else {\r\n throw 'WebAudio API has no support on this browser.';\r\n }\r\n\r\n // connect the stream to the script processor\r\n audioInput.connect(jsAudioNode);\r\n\r\n if (!config.bufferSize) {\r\n bufferSize = jsAudioNode.bufferSize; // device buffer-size\r\n }\r\n\r\n /**\r\n * The sample rate (in sample-frames per second) at which the\r\n * AudioContext handles audio. It is assumed that all AudioNodes\r\n * in the context run at this rate. In making this assumption,\r\n * sample-rate converters or \"varispeed\" processors are not supported\r\n * in real-time processing.\r\n * The sampleRate parameter describes the sample-rate of the\r\n * linear PCM audio data in the buffer in sample-frames per second.\r\n * An implementation must support sample-rates in at least\r\n * the range 22050 to 96000.\r\n * @property {number} sampleRate - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * sampleRate: 44100\r\n * });\r\n */\r\n var sampleRate = typeof config.sampleRate !== 'undefined' ? config.sampleRate : context.sampleRate || 44100;\r\n\r\n if (sampleRate < 22050 || sampleRate > 96000) {\r\n // Ref: http://stackoverflow.com/a/26303918/552182\r\n if (!config.disableLogs) {\r\n console.log('sample-rate must be under range 22050 and 96000.');\r\n }\r\n }\r\n\r\n if (!config.disableLogs) {\r\n if (config.desiredSampRate) {\r\n console.log('Desired sample-rate: ' + config.desiredSampRate);\r\n }\r\n }\r\n\r\n var isPaused = false;\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n if (!recording) {\r\n if (!config.disableLogs) {\r\n console.log('Seems recording has been restarted.');\r\n }\r\n this.record();\r\n return;\r\n }\r\n\r\n isPaused = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n config.checkForInactiveTracks = false;\r\n\r\n if (recording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function resetVariables() {\r\n leftchannel = [];\r\n rightchannel = [];\r\n recordingLength = 0;\r\n isAudioProcessStarted = false;\r\n recording = false;\r\n isPaused = false;\r\n context = null;\r\n\r\n self.leftchannel = leftchannel;\r\n self.rightchannel = rightchannel;\r\n self.numberOfAudioChannels = numberOfAudioChannels;\r\n self.desiredSampRate = desiredSampRate;\r\n self.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n }\r\n\r\n function clearRecordedDataCB() {\r\n if (jsAudioNode) {\r\n jsAudioNode.onaudioprocess = null;\r\n jsAudioNode.disconnect();\r\n jsAudioNode = null;\r\n }\r\n\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n\r\n resetVariables();\r\n }\r\n\r\n // for debugging\r\n this.name = 'StereoAudioRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var isAudioProcessStarted = false;\r\n\r\n function onAudioProcessDataAvailable(e) {\r\n if (isPaused) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n jsAudioNode.disconnect();\r\n recording = false;\r\n }\r\n\r\n if (!recording) {\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n return;\r\n }\r\n\r\n /**\r\n * This method is called on \"onaudioprocess\" event's first invocation.\r\n * @method {function} onAudioProcessStarted\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.onAudioProcessStarted: function() { };\r\n */\r\n if (!isAudioProcessStarted) {\r\n isAudioProcessStarted = true;\r\n if (config.onAudioProcessStarted) {\r\n config.onAudioProcessStarted();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n }\r\n\r\n var left = e.inputBuffer.getChannelData(0);\r\n\r\n // we clone the samples\r\n var chLeft = new Float32Array(left);\r\n leftchannel.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n var right = e.inputBuffer.getChannelData(1);\r\n var chRight = new Float32Array(right);\r\n rightchannel.push(chRight);\r\n }\r\n\r\n recordingLength += bufferSize;\r\n\r\n // export raw PCM\r\n self.recordingLength = recordingLength;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n intervalsBasedBuffers.recordingLength += bufferSize;\r\n intervalsBasedBuffers.left.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n intervalsBasedBuffers.right.push(chRight);\r\n }\r\n }\r\n }\r\n\r\n jsAudioNode.onaudioprocess = onAudioProcessDataAvailable;\r\n\r\n // to prevent self audio to be connected with speakers\r\n if (context.createMediaStreamDestination) {\r\n jsAudioNode.connect(context.createMediaStreamDestination());\r\n } else {\r\n jsAudioNode.connect(context.destination);\r\n }\r\n\r\n // export raw PCM\r\n this.leftchannel = leftchannel;\r\n this.rightchannel = rightchannel;\r\n this.numberOfAudioChannels = numberOfAudioChannels;\r\n this.desiredSampRate = desiredSampRate;\r\n this.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n // helper for intervals based blobs\r\n var intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n\r\n // this looper is used to support intervals based blobs (via timeSlice+ondataavailable)\r\n function looper() {\r\n if (!recording || typeof config.ondataavailable !== 'function' || typeof config.timeSlice === 'undefined') {\r\n return;\r\n }\r\n\r\n if (intervalsBasedBuffers.left.length) {\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: intervalsBasedBuffers.recordingLength,\r\n leftBuffers: intervalsBasedBuffers.left,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : intervalsBasedBuffers.right\r\n }, function(buffer, view) {\r\n var blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n config.ondataavailable(blob);\r\n\r\n setTimeout(looper, config.timeSlice);\r\n });\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n } else {\r\n setTimeout(looper, config.timeSlice);\r\n }\r\n }\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.StereoAudioRecorder = StereoAudioRecorder;\r\n}\r\n\r\n// _________________\r\n// CanvasRecorder.js\r\n\r\n/**\r\n * CanvasRecorder is a standalone class used by {@link RecordRTC} to bring HTML5-Canvas recording into video WebM. It uses HTML2Canvas library and runs top over {@link Whammy}.\r\n * @summary HTML2Canvas recording into video WebM.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef CanvasRecorder\r\n * @class\r\n * @example\r\n * var recorder = new CanvasRecorder(htmlElement, { disableLogs: true, useWhammyRecorder: true });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {HTMLElement} htmlElement - querySelector/getElementById/getElementsByTagName[0]/etc.\r\n * @param {object} config - {disableLogs:true, initCallback: function}\r\n */\r\n\r\nfunction CanvasRecorder(htmlElement, config) {\r\n if (typeof html2canvas === 'undefined') {\r\n throw 'Please link: https://www.webrtc-experiment.com/screenshot.js';\r\n }\r\n\r\n config = config || {};\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n // via DetectRTC.js\r\n var isCanvasSupportsStreamCapturing = false;\r\n ['captureStream', 'mozCaptureStream', 'webkitCaptureStream'].forEach(function(item) {\r\n if (item in document.createElement('canvas')) {\r\n isCanvasSupportsStreamCapturing = true;\r\n }\r\n });\r\n\r\n var _isChrome = (!!window.webkitRTCPeerConnection || !!window.webkitGetUserMedia) && !!window.chrome;\r\n\r\n var chromeVersion = 50;\r\n var matchArray = navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\r\n if (_isChrome && matchArray && matchArray[2]) {\r\n chromeVersion = parseInt(matchArray[2], 10);\r\n }\r\n\r\n if (_isChrome && chromeVersion < 52) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n if (config.useWhammyRecorder) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n var globalCanvas, mediaStreamRecorder;\r\n\r\n if (isCanvasSupportsStreamCapturing) {\r\n if (!config.disableLogs) {\r\n console.log('Your browser supports both MediRecorder API and canvas.captureStream!');\r\n }\r\n\r\n if (htmlElement instanceof HTMLCanvasElement) {\r\n globalCanvas = htmlElement;\r\n } else if (htmlElement instanceof CanvasRenderingContext2D) {\r\n globalCanvas = htmlElement.canvas;\r\n } else {\r\n throw 'Please pass either HTMLCanvasElement or CanvasRenderingContext2D.';\r\n }\r\n } else if (!!navigator.mozGetUserMedia) {\r\n if (!config.disableLogs) {\r\n console.error('Canvas recording is NOT supported in Firefox.');\r\n }\r\n }\r\n\r\n var isRecording;\r\n\r\n /**\r\n * This method records Canvas.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n isRecording = true;\r\n\r\n if (isCanvasSupportsStreamCapturing && !config.useWhammyRecorder) {\r\n // CanvasCaptureMediaStream\r\n var canvasMediaStream;\r\n if ('captureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.captureStream(25); // 25 FPS\r\n } else if ('mozCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.mozCaptureStream(25);\r\n } else if ('webkitCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.webkitCaptureStream(25);\r\n }\r\n\r\n try {\r\n var mdStream = new MediaStream();\r\n mdStream.addTrack(getTracks(canvasMediaStream, 'video')[0]);\r\n canvasMediaStream = mdStream;\r\n } catch (e) {}\r\n\r\n if (!canvasMediaStream) {\r\n throw 'captureStream API are NOT available.';\r\n }\r\n\r\n // Note: Jan 18, 2016 status is that, \r\n // Firefox MediaRecorder API can't record CanvasCaptureMediaStream object.\r\n mediaStreamRecorder = new MediaStreamRecorder(canvasMediaStream, {\r\n mimeType: config.mimeType || 'video/webm'\r\n });\r\n mediaStreamRecorder.record();\r\n } else {\r\n whammy.frames = [];\r\n lastTime = new Date().getTime();\r\n drawCanvasFrame();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n this.getWebPImages = function(callback) {\r\n if (htmlElement.nodeName.toLowerCase() !== 'canvas') {\r\n callback();\r\n return;\r\n }\r\n\r\n var framesLength = whammy.frames.length;\r\n whammy.frames.forEach(function(frame, idx) {\r\n var framesRemaining = framesLength - idx;\r\n if (!config.disableLogs) {\r\n console.log(framesRemaining + '/' + framesLength + ' frames remaining');\r\n }\r\n\r\n if (config.onEncodingCallback) {\r\n config.onEncodingCallback(framesRemaining, framesLength);\r\n }\r\n\r\n var webp = frame.image.toDataURL('image/webp', 1);\r\n whammy.frames[idx].image = webp;\r\n });\r\n\r\n if (!config.disableLogs) {\r\n console.log('Generating WebM');\r\n }\r\n\r\n callback();\r\n };\r\n\r\n /**\r\n * This method stops recording Canvas.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n isRecording = false;\r\n\r\n var that = this;\r\n\r\n if (isCanvasSupportsStreamCapturing && mediaStreamRecorder) {\r\n mediaStreamRecorder.stop(callback);\r\n return;\r\n }\r\n\r\n this.getWebPImages(function() {\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n if (!config.disableLogs) {\r\n console.log('Recording finished!');\r\n }\r\n\r\n that.blob = blob;\r\n\r\n if (that.blob.forEach) {\r\n that.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(that.blob);\r\n }\r\n\r\n whammy.frames = [];\r\n });\r\n });\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.pause();\r\n return;\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.resume();\r\n return;\r\n }\r\n\r\n if (!isRecording) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (isRecording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isRecording = false;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'CanvasRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n function cloneCanvas() {\r\n //create a new canvas\r\n var newCanvas = document.createElement('canvas');\r\n var context = newCanvas.getContext('2d');\r\n\r\n //set dimensions\r\n newCanvas.width = htmlElement.width;\r\n newCanvas.height = htmlElement.height;\r\n\r\n //apply the old canvas to the new one\r\n context.drawImage(htmlElement, 0, 0);\r\n\r\n //return the new canvas\r\n return newCanvas;\r\n }\r\n\r\n function drawCanvasFrame() {\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawCanvasFrame, 500);\r\n }\r\n\r\n if (htmlElement.nodeName.toLowerCase() === 'canvas') {\r\n var duration = new Date().getTime() - lastTime;\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: cloneCanvas(),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n return;\r\n }\r\n\r\n html2canvas(htmlElement, {\r\n grabMouse: typeof config.showMousePointer === 'undefined' || config.showMousePointer,\r\n onrendered: function(canvas) {\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: canvas.toDataURL('image/webp', 1),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n }\r\n });\r\n }\r\n\r\n var lastTime = new Date().getTime();\r\n\r\n var whammy = new Whammy.Video(100);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.CanvasRecorder = CanvasRecorder;\r\n}\n\r\n// _________________\r\n// WhammyRecorder.js\r\n\r\n/**\r\n * WhammyRecorder is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It runs top over {@link Whammy}.\r\n * @summary Video recording feature in Chrome.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WhammyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WhammyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs: true, initCallback: function, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction WhammyRecorder(mediaStream, config) {\r\n\r\n config = config || {};\r\n\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Using frames-interval:', config.frameInterval);\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (!config.width) {\r\n config.width = 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n context = canvas.getContext('2d');\r\n\r\n // setting defaults\r\n if (config.video && config.video instanceof HTMLVideoElement) {\r\n video = config.video.cloneNode();\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n } else {\r\n video = document.createElement('video');\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.onloadedmetadata = function() { // \"onloadedmetadata\" may NOT work in FF?\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n video.width = config.video.width;\r\n video.height = config.video.height;\r\n }\r\n\r\n video.muted = true;\r\n video.play();\r\n\r\n lastTime = new Date().getTime();\r\n whammy = new Whammy.Video();\r\n\r\n if (!config.disableLogs) {\r\n console.log('canvas resolutions', canvas.width, '*', canvas.height);\r\n console.log('video width/height', video.width || canvas.width, '*', video.height || canvas.height);\r\n }\r\n\r\n drawFrames(config.frameInterval);\r\n };\r\n\r\n /**\r\n * Draw and push frames to Whammy\r\n * @param {integer} frameInterval - set minimum interval (in milliseconds) between each time we push a frame to Whammy\r\n */\r\n function drawFrames(frameInterval) {\r\n frameInterval = typeof frameInterval !== 'undefined' ? frameInterval : 10;\r\n\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawFrames, 100);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n if (video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n whammy.frames.push({\r\n duration: duration,\r\n image: canvas.toDataURL('image/webp')\r\n });\r\n\r\n if (!isStopDrawing) {\r\n setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n }\r\n\r\n function asyncLoop(o) {\r\n var i = -1,\r\n length = o.length;\r\n\r\n (function loop() {\r\n i++;\r\n if (i === length) {\r\n o.callback();\r\n return;\r\n }\r\n\r\n // \"setTimeout\" added by Jim McLeod\r\n setTimeout(function() {\r\n o.functionToLoop(loop, i);\r\n }, 1);\r\n })();\r\n }\r\n\r\n\r\n /**\r\n * remove black frames from the beginning to the specified frame\r\n * @param {Array} _frames - array of frames to be checked\r\n * @param {number} _framesToCheck - number of frame until check will be executed (-1 - will drop all frames until frame not matched will be found)\r\n * @param {number} _pixTolerance - 0 - very strict (only black pixel color) ; 1 - all\r\n * @param {number} _frameTolerance - 0 - very strict (only black frame color) ; 1 - all\r\n * @returns {Array} - array of frames\r\n */\r\n // pull#293 by @volodalexey\r\n function dropBlackFrames(_frames, _framesToCheck, _pixTolerance, _frameTolerance, callback) {\r\n var localCanvas = document.createElement('canvas');\r\n localCanvas.width = canvas.width;\r\n localCanvas.height = canvas.height;\r\n var context2d = localCanvas.getContext('2d');\r\n var resultFrames = [];\r\n\r\n var checkUntilNotBlack = _framesToCheck === -1;\r\n var endCheckFrame = (_framesToCheck && _framesToCheck > 0 && _framesToCheck <= _frames.length) ?\r\n _framesToCheck : _frames.length;\r\n var sampleColor = {\r\n r: 0,\r\n g: 0,\r\n b: 0\r\n };\r\n var maxColorDifference = Math.sqrt(\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2)\r\n );\r\n var pixTolerance = _pixTolerance && _pixTolerance >= 0 && _pixTolerance <= 1 ? _pixTolerance : 0;\r\n var frameTolerance = _frameTolerance && _frameTolerance >= 0 && _frameTolerance <= 1 ? _frameTolerance : 0;\r\n var doNotCheckNext = false;\r\n\r\n asyncLoop({\r\n length: endCheckFrame,\r\n functionToLoop: function(loop, f) {\r\n var matchPixCount, endPixCheck, maxPixCount;\r\n\r\n var finishImage = function() {\r\n if (!doNotCheckNext && maxPixCount - matchPixCount <= maxPixCount * frameTolerance) {\r\n // console.log('removed black frame : ' + f + ' ; frame duration ' + _frames[f].duration);\r\n } else {\r\n // console.log('frame is passed : ' + f);\r\n if (checkUntilNotBlack) {\r\n doNotCheckNext = true;\r\n }\r\n resultFrames.push(_frames[f]);\r\n }\r\n loop();\r\n };\r\n\r\n if (!doNotCheckNext) {\r\n var image = new Image();\r\n image.onload = function() {\r\n context2d.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n var imageData = context2d.getImageData(0, 0, canvas.width, canvas.height);\r\n matchPixCount = 0;\r\n endPixCheck = imageData.data.length;\r\n maxPixCount = imageData.data.length / 4;\r\n\r\n for (var pix = 0; pix < endPixCheck; pix += 4) {\r\n var currentColor = {\r\n r: imageData.data[pix],\r\n g: imageData.data[pix + 1],\r\n b: imageData.data[pix + 2]\r\n };\r\n var colorDifference = Math.sqrt(\r\n Math.pow(currentColor.r - sampleColor.r, 2) +\r\n Math.pow(currentColor.g - sampleColor.g, 2) +\r\n Math.pow(currentColor.b - sampleColor.b, 2)\r\n );\r\n // difference in color it is difference in color vectors (r1,g1,b1) <=> (r2,g2,b2)\r\n if (colorDifference <= maxColorDifference * pixTolerance) {\r\n matchPixCount++;\r\n }\r\n }\r\n finishImage();\r\n };\r\n image.src = _frames[f].image;\r\n } else {\r\n finishImage();\r\n }\r\n },\r\n callback: function() {\r\n resultFrames = resultFrames.concat(_frames.slice(endCheckFrame));\r\n\r\n if (resultFrames.length <= 0) {\r\n // at least one last frame should be available for next manipulation\r\n // if total duration of all frames will be < 1000 than ffmpeg doesn't work well...\r\n resultFrames.push(_frames[_frames.length - 1]);\r\n }\r\n callback(resultFrames);\r\n }\r\n });\r\n }\r\n\r\n var isStopDrawing = false;\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n isStopDrawing = true;\r\n\r\n var _this = this;\r\n // analyse of all frames takes some time!\r\n setTimeout(function() {\r\n // e.g. dropBlackFrames(frames, 10, 1, 1) - will cut all 10 frames\r\n // e.g. dropBlackFrames(frames, 10, 0.5, 0.5) - will analyse 10 frames\r\n // e.g. dropBlackFrames(frames, 10) === dropBlackFrames(frames, 10, 0, 0) - will analyse 10 frames with strict black color\r\n dropBlackFrames(whammy.frames, -1, null, null, function(frames) {\r\n whammy.frames = frames;\r\n\r\n // to display advertisement images!\r\n if (config.advertisement && config.advertisement.length) {\r\n whammy.frames = config.advertisement.concat(whammy.frames);\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n _this.blob = blob;\r\n\r\n if (_this.blob.forEach) {\r\n _this.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(_this.blob);\r\n }\r\n });\r\n });\r\n }, 10);\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (isStopDrawing) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (!isStopDrawing) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isStopDrawing = true;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'WhammyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n var video;\r\n var lastTime;\r\n var whammy;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WhammyRecorder = WhammyRecorder;\r\n}\n\r\n// https://github.com/antimatter15/whammy/blob/master/LICENSE\r\n// _________\r\n// Whammy.js\r\n\r\n// todo: Firefox now supports webp for webm containers!\r\n// their MediaRecorder implementation works well!\r\n// should we provide an option to record via Whammy.js or MediaRecorder API is a better solution?\r\n\r\n/**\r\n * Whammy is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It is written by {@link https://github.com/antimatter15|antimatter15}\r\n * @summary A real time javascript webm encoder based on a canvas hack.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef Whammy\r\n * @class\r\n * @example\r\n * var recorder = new Whammy().Video(15);\r\n * recorder.add(context || canvas || dataURL);\r\n * var output = recorder.compile();\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Whammy = (function() {\r\n // a more abstract-ish API\r\n\r\n function WhammyVideo(duration) {\r\n this.frames = [];\r\n this.duration = duration || 1;\r\n this.quality = 0.8;\r\n }\r\n\r\n /**\r\n * Pass Canvas or Context or image/webp(string) to {@link Whammy} encoder.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.add(canvas || context || 'image/webp');\r\n * @param {string} frame - Canvas || Context || image/webp\r\n * @param {number} duration - Stick a duration (in milliseconds)\r\n */\r\n WhammyVideo.prototype.add = function(frame, duration) {\r\n if ('canvas' in frame) { //CanvasRenderingContext2D\r\n frame = frame.canvas;\r\n }\r\n\r\n if ('toDataURL' in frame) {\r\n frame = frame.toDataURL('image/webp', this.quality);\r\n }\r\n\r\n if (!(/^data:image\\/webp;base64,/ig).test(frame)) {\r\n throw 'Input must be formatted properly as a base64 encoded DataURI of type image/webp';\r\n }\r\n this.frames.push({\r\n image: frame,\r\n duration: duration || this.duration\r\n });\r\n };\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n\r\n function whammyInWebWorker(frames) {\r\n function ArrayToWebM(frames) {\r\n var info = checkFrames(frames);\r\n if (!info) {\r\n return [];\r\n }\r\n\r\n var clusterMaxDuration = 30000;\r\n\r\n var EBML = [{\r\n 'id': 0x1a45dfa3, // EBML\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0x4286 // EBMLVersion\r\n }, {\r\n 'data': 1,\r\n 'id': 0x42f7 // EBMLReadVersion\r\n }, {\r\n 'data': 4,\r\n 'id': 0x42f2 // EBMLMaxIDLength\r\n }, {\r\n 'data': 8,\r\n 'id': 0x42f3 // EBMLMaxSizeLength\r\n }, {\r\n 'data': 'webm',\r\n 'id': 0x4282 // DocType\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4287 // DocTypeVersion\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4285 // DocTypeReadVersion\r\n }]\r\n }, {\r\n 'id': 0x18538067, // Segment\r\n 'data': [{\r\n 'id': 0x1549a966, // Info\r\n 'data': [{\r\n 'data': 1e6, //do things in millisecs (num of nanosecs for duration scale)\r\n 'id': 0x2ad7b1 // TimecodeScale\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x4d80 // MuxingApp\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x5741 // WritingApp\r\n }, {\r\n 'data': doubleToString(info.duration),\r\n 'id': 0x4489 // Duration\r\n }]\r\n }, {\r\n 'id': 0x1654ae6b, // Tracks\r\n 'data': [{\r\n 'id': 0xae, // TrackEntry\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0xd7 // TrackNumber\r\n }, {\r\n 'data': 1,\r\n 'id': 0x73c5 // TrackUID\r\n }, {\r\n 'data': 0,\r\n 'id': 0x9c // FlagLacing\r\n }, {\r\n 'data': 'und',\r\n 'id': 0x22b59c // Language\r\n }, {\r\n 'data': 'V_VP8',\r\n 'id': 0x86 // CodecID\r\n }, {\r\n 'data': 'VP8',\r\n 'id': 0x258688 // CodecName\r\n }, {\r\n 'data': 1,\r\n 'id': 0x83 // TrackType\r\n }, {\r\n 'id': 0xe0, // Video\r\n 'data': [{\r\n 'data': info.width,\r\n 'id': 0xb0 // PixelWidth\r\n }, {\r\n 'data': info.height,\r\n 'id': 0xba // PixelHeight\r\n }]\r\n }]\r\n }]\r\n }]\r\n }];\r\n\r\n //Generate clusters (max duration)\r\n var frameNumber = 0;\r\n var clusterTimecode = 0;\r\n while (frameNumber < frames.length) {\r\n\r\n var clusterFrames = [];\r\n var clusterDuration = 0;\r\n do {\r\n clusterFrames.push(frames[frameNumber]);\r\n clusterDuration += frames[frameNumber].duration;\r\n frameNumber++;\r\n } while (frameNumber < frames.length && clusterDuration < clusterMaxDuration);\r\n\r\n var clusterCounter = 0;\r\n var cluster = {\r\n 'id': 0x1f43b675, // Cluster\r\n 'data': getClusterData(clusterTimecode, clusterCounter, clusterFrames)\r\n }; //Add cluster to segment\r\n EBML[1].data.push(cluster);\r\n clusterTimecode += clusterDuration;\r\n }\r\n\r\n return generateEBML(EBML);\r\n }\r\n\r\n function getClusterData(clusterTimecode, clusterCounter, clusterFrames) {\r\n return [{\r\n 'data': clusterTimecode,\r\n 'id': 0xe7 // Timecode\r\n }].concat(clusterFrames.map(function(webp) {\r\n var block = makeSimpleBlock({\r\n discardable: 0,\r\n frame: webp.data.slice(4),\r\n invisible: 0,\r\n keyframe: 1,\r\n lacing: 0,\r\n trackNum: 1,\r\n timecode: Math.round(clusterCounter)\r\n });\r\n clusterCounter += webp.duration;\r\n return {\r\n data: block,\r\n id: 0xa3\r\n };\r\n }));\r\n }\r\n\r\n // sums the lengths of all the frames and gets the duration\r\n\r\n function checkFrames(frames) {\r\n if (!frames[0]) {\r\n postMessage({\r\n error: 'Something went wrong. Maybe WebP format is not supported in the current browser.'\r\n });\r\n return;\r\n }\r\n\r\n var width = frames[0].width,\r\n height = frames[0].height,\r\n duration = frames[0].duration;\r\n\r\n for (var i = 1; i < frames.length; i++) {\r\n duration += frames[i].duration;\r\n }\r\n return {\r\n duration: duration,\r\n width: width,\r\n height: height\r\n };\r\n }\r\n\r\n function numToBuffer(num) {\r\n var parts = [];\r\n while (num > 0) {\r\n parts.push(num & 0xff);\r\n num = num >> 8;\r\n }\r\n return new Uint8Array(parts.reverse());\r\n }\r\n\r\n function strToBuffer(str) {\r\n return new Uint8Array(str.split('').map(function(e) {\r\n return e.charCodeAt(0);\r\n }));\r\n }\r\n\r\n function bitsToBuffer(bits) {\r\n var data = [];\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data.push(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return new Uint8Array(data);\r\n }\r\n\r\n function generateEBML(json) {\r\n var ebml = [];\r\n for (var i = 0; i < json.length; i++) {\r\n var data = json[i].data;\r\n\r\n if (typeof data === 'object') {\r\n data = generateEBML(data);\r\n }\r\n\r\n if (typeof data === 'number') {\r\n data = bitsToBuffer(data.toString(2));\r\n }\r\n\r\n if (typeof data === 'string') {\r\n data = strToBuffer(data);\r\n }\r\n\r\n var len = data.size || data.byteLength || data.length;\r\n var zeroes = Math.ceil(Math.ceil(Math.log(len) / Math.log(2)) / 8);\r\n var sizeToString = len.toString(2);\r\n var padded = (new Array((zeroes * 7 + 7 + 1) - sizeToString.length)).join('0') + sizeToString;\r\n var size = (new Array(zeroes)).join('0') + '1' + padded;\r\n\r\n ebml.push(numToBuffer(json[i].id));\r\n ebml.push(bitsToBuffer(size));\r\n ebml.push(data);\r\n }\r\n\r\n return new Blob(ebml, {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n function toBinStrOld(bits) {\r\n var data = '';\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data += String.fromCharCode(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return data;\r\n }\r\n\r\n function makeSimpleBlock(data) {\r\n var flags = 0;\r\n\r\n if (data.keyframe) {\r\n flags |= 128;\r\n }\r\n\r\n if (data.invisible) {\r\n flags |= 8;\r\n }\r\n\r\n if (data.lacing) {\r\n flags |= (data.lacing << 1);\r\n }\r\n\r\n if (data.discardable) {\r\n flags |= 1;\r\n }\r\n\r\n if (data.trackNum > 127) {\r\n throw 'TrackNumber > 127 not supported';\r\n }\r\n\r\n var out = [data.trackNum | 0x80, data.timecode >> 8, data.timecode & 0xff, flags].map(function(e) {\r\n return String.fromCharCode(e);\r\n }).join('') + data.frame;\r\n\r\n return out;\r\n }\r\n\r\n function parseWebP(riff) {\r\n var VP8 = riff.RIFF[0].WEBP[0];\r\n\r\n var frameStart = VP8.indexOf('\\x9d\\x01\\x2a'); // A VP8 keyframe starts with the 0x9d012a header\r\n for (var i = 0, c = []; i < 4; i++) {\r\n c[i] = VP8.charCodeAt(frameStart + 3 + i);\r\n }\r\n\r\n var width, height, tmp;\r\n\r\n //the code below is literally copied verbatim from the bitstream spec\r\n tmp = (c[1] << 8) | c[0];\r\n width = tmp & 0x3FFF;\r\n tmp = (c[3] << 8) | c[2];\r\n height = tmp & 0x3FFF;\r\n return {\r\n width: width,\r\n height: height,\r\n data: VP8,\r\n riff: riff\r\n };\r\n }\r\n\r\n function getStrLength(string, offset) {\r\n return parseInt(string.substr(offset + 4, 4).split('').map(function(i) {\r\n var unpadded = i.charCodeAt(0).toString(2);\r\n return (new Array(8 - unpadded.length + 1)).join('0') + unpadded;\r\n }).join(''), 2);\r\n }\r\n\r\n function parseRIFF(string) {\r\n var offset = 0;\r\n var chunks = {};\r\n\r\n while (offset < string.length) {\r\n var id = string.substr(offset, 4);\r\n var len = getStrLength(string, offset);\r\n var data = string.substr(offset + 4 + 4, len);\r\n offset += 4 + 4 + len;\r\n chunks[id] = chunks[id] || [];\r\n\r\n if (id === 'RIFF' || id === 'LIST') {\r\n chunks[id].push(parseRIFF(data));\r\n } else {\r\n chunks[id].push(data);\r\n }\r\n }\r\n return chunks;\r\n }\r\n\r\n function doubleToString(num) {\r\n return [].slice.call(\r\n new Uint8Array((new Float64Array([num])).buffer), 0).map(function(e) {\r\n return String.fromCharCode(e);\r\n }).reverse().join('');\r\n }\r\n\r\n var webm = new ArrayToWebM(frames.map(function(frame) {\r\n var webp = parseWebP(parseRIFF(atob(frame.image.slice(23))));\r\n webp.duration = frame.duration;\r\n return webp;\r\n }));\r\n\r\n postMessage(webm);\r\n }\r\n\r\n /**\r\n * Encodes frames in WebM container. It uses WebWorkinvoke to invoke 'ArrayToWebM' method.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.compile(function(blob) {\r\n * // blob.size - blob.type\r\n * });\r\n */\r\n WhammyVideo.prototype.compile = function(callback) {\r\n var webWorker = processInWebWorker(whammyInWebWorker);\r\n\r\n webWorker.onmessage = function(event) {\r\n if (event.data.error) {\r\n console.error(event.data.error);\r\n return;\r\n }\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(this.frames);\r\n };\r\n\r\n return {\r\n /**\r\n * A more abstract-ish API.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * @param {?number} speed - 0.8\r\n * @param {?number} quality - 100\r\n */\r\n Video: WhammyVideo\r\n };\r\n})();\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Whammy = Whammy;\r\n}\n\r\n// ______________ (indexed-db)\r\n// DiskStorage.js\r\n\r\n/**\r\n * DiskStorage is a standalone object used by {@link RecordRTC} to store recorded blobs in IndexedDB storage.\r\n * @summary Writing blobs into IndexedDB.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n * // DiskStorage.dataStoreName = 'recordRTC';\r\n * // DiskStorage.onError = function(error) { };\r\n * @property {function} init - This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @property {function} Fetch - This method fetches stored blobs from IndexedDB.\r\n * @property {function} Store - This method stores blobs in IndexedDB.\r\n * @property {function} onError - This function is invoked for any known/unknown error.\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\n\r\nvar DiskStorage = {\r\n /**\r\n * This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.init();\r\n */\r\n init: function() {\r\n var self = this;\r\n\r\n if (typeof indexedDB === 'undefined' || typeof indexedDB.open === 'undefined') {\r\n console.error('IndexedDB API are not available in this browser.');\r\n return;\r\n }\r\n\r\n var dbVersion = 1;\r\n var dbName = this.dbName || location.href.replace(/\\/|:|#|%|\\.|\\[|\\]/g, ''),\r\n db;\r\n var request = indexedDB.open(dbName, dbVersion);\r\n\r\n function createObjectStore(dataBase) {\r\n dataBase.createObjectStore(self.dataStoreName);\r\n }\r\n\r\n function putInDB() {\r\n var transaction = db.transaction([self.dataStoreName], 'readwrite');\r\n\r\n if (self.videoBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.videoBlob, 'videoBlob');\r\n }\r\n\r\n if (self.gifBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.gifBlob, 'gifBlob');\r\n }\r\n\r\n if (self.audioBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.audioBlob, 'audioBlob');\r\n }\r\n\r\n function getFromStore(portionName) {\r\n transaction.objectStore(self.dataStoreName).get(portionName).onsuccess = function(event) {\r\n if (self.callback) {\r\n self.callback(event.target.result, portionName);\r\n }\r\n };\r\n }\r\n\r\n getFromStore('audioBlob');\r\n getFromStore('videoBlob');\r\n getFromStore('gifBlob');\r\n }\r\n\r\n request.onerror = self.onError;\r\n\r\n request.onsuccess = function() {\r\n db = request.result;\r\n db.onerror = self.onError;\r\n\r\n if (db.setVersion) {\r\n if (db.version !== dbVersion) {\r\n var setVersion = db.setVersion(dbVersion);\r\n setVersion.onsuccess = function() {\r\n createObjectStore(db);\r\n putInDB();\r\n };\r\n } else {\r\n putInDB();\r\n }\r\n } else {\r\n putInDB();\r\n }\r\n };\r\n request.onupgradeneeded = function(event) {\r\n createObjectStore(event.target.result);\r\n };\r\n },\r\n /**\r\n * This method fetches stored blobs from IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n */\r\n Fetch: function(callback) {\r\n this.callback = callback;\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This method stores blobs in IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n */\r\n Store: function(config) {\r\n this.audioBlob = config.audioBlob;\r\n this.videoBlob = config.videoBlob;\r\n this.gifBlob = config.gifBlob;\r\n\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This function is invoked for any known/unknown error.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.onError = function(error){\r\n * alerot( JSON.stringify(error) );\r\n * };\r\n */\r\n onError: function(error) {\r\n console.error(JSON.stringify(error, null, '\\t'));\r\n },\r\n\r\n /**\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.dataStoreName = 'recordRTC';\r\n */\r\n dataStoreName: 'recordRTC',\r\n dbName: null\r\n};\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.DiskStorage = DiskStorage;\r\n}\n\r\n// ______________\r\n// GifRecorder.js\r\n\r\n/**\r\n * GifRecorder is standalone calss used by {@link RecordRTC} to record video or canvas into animated gif.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GifRecorder\r\n * @class\r\n * @example\r\n * var recorder = new GifRecorder(mediaStream || canvas || context, { onGifPreview: function, onGifRecordingStarted: function, width: 1280, height: 720, frameRate: 200, quality: 10 });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object or HTMLCanvasElement or CanvasRenderingContext2D.\r\n * @param {object} config - {disableLogs:true, initCallback: function, width: 320, height: 240, frameRate: 200, quality: 10}\r\n */\r\n\r\nfunction GifRecorder(mediaStream, config) {\r\n if (typeof GIFEncoder === 'undefined') {\r\n var script = document.createElement('script');\r\n script.src = 'https://www.webrtc-experiment.com/gif-recorder.js';\r\n (document.body || document.documentElement).appendChild(script);\r\n }\r\n\r\n config = config || {};\r\n\r\n var isHTMLObject = mediaStream instanceof CanvasRenderingContext2D || mediaStream instanceof HTMLCanvasElement;\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (typeof GIFEncoder === 'undefined') {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isLoadedMetaData) {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isHTMLObject) {\r\n if (!config.width) {\r\n config.width = video.offsetWidth || 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = video.offsetHeight || 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n video.width = config.video.width || 320;\r\n video.height = config.video.height || 240;\r\n }\r\n\r\n // external library to record as GIF images\r\n gifEncoder = new GIFEncoder();\r\n\r\n // void setRepeat(int iter) \r\n // Sets the number of times the set of GIF frames should be played. \r\n // Default is 1; 0 means play indefinitely.\r\n gifEncoder.setRepeat(0);\r\n\r\n // void setFrameRate(Number fps) \r\n // Sets frame rate in frames per second. \r\n // Equivalent to setDelay(1000/fps).\r\n // Using \"setDelay\" instead of \"setFrameRate\"\r\n gifEncoder.setDelay(config.frameRate || 200);\r\n\r\n // void setQuality(int quality) \r\n // Sets quality of color quantization (conversion of images to the \r\n // maximum 256 colors allowed by the GIF specification). \r\n // Lower values (minimum = 1) produce better colors, \r\n // but slow processing significantly. 10 is the default, \r\n // and produces good color mapping at reasonable speeds. \r\n // Values greater than 20 do not yield significant improvements in speed.\r\n gifEncoder.setQuality(config.quality || 10);\r\n\r\n // Boolean start() \r\n // This writes the GIF Header and returns false if it fails.\r\n gifEncoder.start();\r\n\r\n if (typeof config.onGifRecordingStarted === 'function') {\r\n config.onGifRecordingStarted();\r\n }\r\n\r\n startTime = Date.now();\r\n\r\n function drawVideoFrame(time) {\r\n if (self.clearedRecordedData === true) {\r\n return;\r\n }\r\n\r\n if (isPausedRecording) {\r\n return setTimeout(function() {\r\n drawVideoFrame(time);\r\n }, 100);\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (typeof lastFrameTime === undefined) {\r\n lastFrameTime = time;\r\n }\r\n\r\n // ~10 fps\r\n if (time - lastFrameTime < 90) {\r\n return;\r\n }\r\n\r\n if (!isHTMLObject && video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n if (!isHTMLObject) {\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n if (config.onGifPreview) {\r\n config.onGifPreview(canvas.toDataURL('image/png'));\r\n }\r\n\r\n gifEncoder.addFrame(context);\r\n lastFrameTime = time;\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (lastAnimationFrame) {\r\n cancelAnimationFrame(lastAnimationFrame);\r\n }\r\n\r\n endTime = Date.now();\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = new Blob([new Uint8Array(gifEncoder.stream().bin)], {\r\n type: 'image/gif'\r\n });\r\n\r\n callback(this.blob);\r\n\r\n // bug: find a way to clear old recorded blobs\r\n gifEncoder.stream().bin = [];\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n self.clearedRecordedData = true;\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n if (gifEncoder) {\r\n gifEncoder.stream().bin = [];\r\n }\r\n }\r\n\r\n // for debugging\r\n this.name = 'GifRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n if (isHTMLObject) {\r\n if (mediaStream instanceof CanvasRenderingContext2D) {\r\n context = mediaStream;\r\n canvas = context.canvas;\r\n } else if (mediaStream instanceof HTMLCanvasElement) {\r\n context = mediaStream.getContext('2d');\r\n canvas = mediaStream;\r\n }\r\n }\r\n\r\n var isLoadedMetaData = true;\r\n\r\n if (!isHTMLObject) {\r\n var video = document.createElement('video');\r\n video.muted = true;\r\n video.autoplay = true;\r\n video.playsInline = true;\r\n\r\n isLoadedMetaData = false;\r\n video.onloadedmetadata = function() {\r\n isLoadedMetaData = true;\r\n };\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.play();\r\n }\r\n\r\n var lastAnimationFrame = null;\r\n var startTime, endTime, lastFrameTime;\r\n\r\n var gifEncoder;\r\n\r\n var self = this;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.GifRecorder = GifRecorder;\r\n}\n\r\n// Last time updated: 2019-06-21 4:09:42 AM UTC\r\n\r\n// ________________________\r\n// MultiStreamsMixer v1.2.2\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/MultiStreamsMixer\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\nfunction MultiStreamsMixer(arrayOfMediaStreams, elementClass) {\r\n\r\n var browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n (function(that) {\r\n if (typeof RecordRTC !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n })(typeof global !== 'undefined' ? global : null);\r\n\r\n // requires: chrome://flags/#enable-experimental-web-platform-features\r\n\r\n elementClass = elementClass || 'multi-streams-mixer';\r\n\r\n var videos = [];\r\n var isStopDrawingFrames = false;\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n canvas.style.opacity = 0;\r\n canvas.style.position = 'absolute';\r\n canvas.style.zIndex = -1;\r\n canvas.style.top = '-1000em';\r\n canvas.style.left = '-1000em';\r\n canvas.className = elementClass;\r\n (document.body || document.documentElement).appendChild(canvas);\r\n\r\n this.disableLogs = false;\r\n this.frameInterval = 10;\r\n\r\n this.width = 360;\r\n this.height = 240;\r\n\r\n // use gain node to prevent echo\r\n this.useGainNode = true;\r\n\r\n var self = this;\r\n\r\n // _____________________________\r\n // Cross-Browser-Declarations.js\r\n\r\n // WebAudio API representer\r\n var AudioContext = window.AudioContext;\r\n\r\n if (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n }\r\n\r\n /*jshint -W079 */\r\n var URL = window.URL;\r\n\r\n if (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n }\r\n\r\n if (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n }\r\n\r\n var MediaStream = window.MediaStream;\r\n\r\n if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n }\r\n\r\n /*global MediaStream:true */\r\n if (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n }\r\n\r\n var Storage = {};\r\n\r\n if (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n } else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n }\r\n\r\n function setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n }\r\n\r\n this.startDrawingFrames = function() {\r\n drawVideosToCanvas();\r\n };\r\n\r\n function drawVideosToCanvas() {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var videosLength = videos.length;\r\n\r\n var fullcanvas = false;\r\n var remaining = [];\r\n videos.forEach(function(video) {\r\n if (!video.stream) {\r\n video.stream = {};\r\n }\r\n\r\n if (video.stream.fullcanvas) {\r\n fullcanvas = video;\r\n } else {\r\n // todo: video.stream.active or video.stream.live to fix blank frames issues?\r\n remaining.push(video);\r\n }\r\n });\r\n\r\n if (fullcanvas) {\r\n canvas.width = fullcanvas.stream.width;\r\n canvas.height = fullcanvas.stream.height;\r\n } else if (remaining.length) {\r\n canvas.width = videosLength > 1 ? remaining[0].width * 2 : remaining[0].width;\r\n\r\n var height = 1;\r\n if (videosLength === 3 || videosLength === 4) {\r\n height = 2;\r\n }\r\n if (videosLength === 5 || videosLength === 6) {\r\n height = 3;\r\n }\r\n if (videosLength === 7 || videosLength === 8) {\r\n height = 4;\r\n }\r\n if (videosLength === 9 || videosLength === 10) {\r\n height = 5;\r\n }\r\n canvas.height = remaining[0].height * height;\r\n } else {\r\n canvas.width = self.width || 360;\r\n canvas.height = self.height || 240;\r\n }\r\n\r\n if (fullcanvas && fullcanvas instanceof HTMLVideoElement) {\r\n drawImage(fullcanvas);\r\n }\r\n\r\n remaining.forEach(function(video, idx) {\r\n drawImage(video, idx);\r\n });\r\n\r\n setTimeout(drawVideosToCanvas, self.frameInterval);\r\n }\r\n\r\n function drawImage(video, idx) {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var x = 0;\r\n var y = 0;\r\n var width = video.width;\r\n var height = video.height;\r\n\r\n if (idx === 1) {\r\n x = video.width;\r\n }\r\n\r\n if (idx === 2) {\r\n y = video.height;\r\n }\r\n\r\n if (idx === 3) {\r\n x = video.width;\r\n y = video.height;\r\n }\r\n\r\n if (idx === 4) {\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 5) {\r\n x = video.width;\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 6) {\r\n y = video.height * 3;\r\n }\r\n\r\n if (idx === 7) {\r\n x = video.width;\r\n y = video.height * 3;\r\n }\r\n\r\n if (typeof video.stream.left !== 'undefined') {\r\n x = video.stream.left;\r\n }\r\n\r\n if (typeof video.stream.top !== 'undefined') {\r\n y = video.stream.top;\r\n }\r\n\r\n if (typeof video.stream.width !== 'undefined') {\r\n width = video.stream.width;\r\n }\r\n\r\n if (typeof video.stream.height !== 'undefined') {\r\n height = video.stream.height;\r\n }\r\n\r\n context.drawImage(video, x, y, width, height);\r\n\r\n if (typeof video.stream.onRender === 'function') {\r\n video.stream.onRender(context, x, y, width, height, idx);\r\n }\r\n }\r\n\r\n function getMixedStream() {\r\n isStopDrawingFrames = false;\r\n var mixedVideoStream = getMixedVideoStream();\r\n\r\n var mixedAudioStream = getMixedAudioStream();\r\n if (mixedAudioStream) {\r\n mixedAudioStream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).forEach(function(track) {\r\n mixedVideoStream.addTrack(track);\r\n });\r\n }\r\n\r\n var fullcanvas;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (stream.fullcanvas) {\r\n fullcanvas = true;\r\n }\r\n });\r\n\r\n // mixedVideoStream.prototype.appendStreams = appendStreams;\r\n // mixedVideoStream.prototype.resetVideoStreams = resetVideoStreams;\r\n // mixedVideoStream.prototype.clearRecordedData = clearRecordedData;\r\n\r\n return mixedVideoStream;\r\n }\r\n\r\n function getMixedVideoStream() {\r\n resetVideoStreams();\r\n\r\n var capturedStream;\r\n\r\n if ('captureStream' in canvas) {\r\n capturedStream = canvas.captureStream();\r\n } else if ('mozCaptureStream' in canvas) {\r\n capturedStream = canvas.mozCaptureStream();\r\n } else if (!self.disableLogs) {\r\n console.error('Upgrade to latest Chrome or otherwise enable this flag: chrome://flags/#enable-experimental-web-platform-features');\r\n }\r\n\r\n var videoStream = new MediaStream();\r\n\r\n capturedStream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).forEach(function(track) {\r\n videoStream.addTrack(track);\r\n });\r\n\r\n canvas.stream = videoStream;\r\n\r\n return videoStream;\r\n }\r\n\r\n function getMixedAudioStream() {\r\n // via: @pehrsons\r\n if (!Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor = new Storage.AudioContext();\r\n }\r\n\r\n self.audioContext = Storage.AudioContextConstructor;\r\n\r\n self.audioSources = [];\r\n\r\n if (self.useGainNode === true) {\r\n self.gainNode = self.audioContext.createGain();\r\n self.gainNode.connect(self.audioContext.destination);\r\n self.gainNode.gain.value = 0; // don't hear self\r\n }\r\n\r\n var audioTracksLength = 0;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n return;\r\n }\r\n\r\n audioTracksLength++;\r\n\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n\r\n if (self.useGainNode === true) {\r\n audioSource.connect(self.gainNode);\r\n }\r\n\r\n self.audioSources.push(audioSource);\r\n });\r\n\r\n if (!audioTracksLength) {\r\n // because \"self.audioContext\" is not initialized\r\n // that's why we've to ignore rest of the code\r\n return;\r\n }\r\n\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n self.audioSources.forEach(function(audioSource) {\r\n audioSource.connect(self.audioDestination);\r\n });\r\n return self.audioDestination.stream;\r\n }\r\n\r\n function getVideo(stream) {\r\n var video = document.createElement('video');\r\n\r\n setSrcObject(stream, video);\r\n\r\n video.className = elementClass;\r\n\r\n video.muted = true;\r\n video.volume = 0;\r\n\r\n video.width = stream.width || self.width || 360;\r\n video.height = stream.height || self.height || 240;\r\n\r\n video.play();\r\n\r\n return video;\r\n }\r\n\r\n this.appendStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n streams.forEach(function(stream) {\r\n var newStream = new MediaStream();\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n\r\n newStream.addTrack(stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n })[0]);\r\n }\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n audioSource.connect(self.audioDestination);\r\n\r\n newStream.addTrack(self.audioDestination.stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n })[0]);\r\n }\r\n\r\n arrayOfMediaStreams.push(newStream);\r\n });\r\n };\r\n\r\n this.releaseStreams = function() {\r\n videos = [];\r\n isStopDrawingFrames = true;\r\n\r\n if (self.gainNode) {\r\n self.gainNode.disconnect();\r\n self.gainNode = null;\r\n }\r\n\r\n if (self.audioSources.length) {\r\n self.audioSources.forEach(function(source) {\r\n source.disconnect();\r\n });\r\n self.audioSources = [];\r\n }\r\n\r\n if (self.audioDestination) {\r\n self.audioDestination.disconnect();\r\n self.audioDestination = null;\r\n }\r\n\r\n if (self.audioContext) {\r\n self.audioContext.close();\r\n }\r\n\r\n self.audioContext = null;\r\n\r\n context.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (canvas.stream) {\r\n canvas.stream.stop();\r\n canvas.stream = null;\r\n }\r\n };\r\n\r\n this.resetVideoStreams = function(streams) {\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n resetVideoStreams(streams);\r\n };\r\n\r\n function resetVideoStreams(streams) {\r\n videos = [];\r\n streams = streams || arrayOfMediaStreams;\r\n\r\n // via: @adrian-ber\r\n streams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n return;\r\n }\r\n\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n });\r\n }\r\n\r\n // for debugging\r\n this.name = 'MultiStreamsMixer';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n this.getMixedStream = getMixedStream;\r\n\r\n}\r\n\r\nif (typeof RecordRTC === 'undefined') {\r\n if (typeof module !== 'undefined' /* && !!module.exports*/ ) {\r\n module.exports = MultiStreamsMixer;\r\n }\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n define('MultiStreamsMixer', [], function() {\r\n return MultiStreamsMixer;\r\n });\r\n }\r\n}\n\r\n// ______________________\r\n// MultiStreamRecorder.js\r\n\r\n/*\r\n * Video conference recording, using captureStream API along with WebAudio and Canvas2D API.\r\n */\r\n\r\n/**\r\n * MultiStreamRecorder can record multiple videos in single container.\r\n * @summary Multi-videos recorder.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MultiStreamRecorder\r\n * @class\r\n * @example\r\n * var options = {\r\n * mimeType: 'video/webm'\r\n * }\r\n * var recorder = new MultiStreamRecorder(ArrayOfMediaStreams, options);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams.\r\n * @param {object} config - {disableLogs:true, frameInterval: 1, mimeType: \"video/webm\"}\r\n */\r\n\r\nfunction MultiStreamRecorder(arrayOfMediaStreams, options) {\r\n arrayOfMediaStreams = arrayOfMediaStreams || [];\r\n var self = this;\r\n\r\n var mixer;\r\n var mediaRecorder;\r\n\r\n options = options || {\r\n elementClass: 'multi-streams-mixer',\r\n mimeType: 'video/webm',\r\n video: {\r\n width: 360,\r\n height: 240\r\n }\r\n };\r\n\r\n if (!options.frameInterval) {\r\n options.frameInterval = 10;\r\n }\r\n\r\n if (!options.video) {\r\n options.video = {};\r\n }\r\n\r\n if (!options.video.width) {\r\n options.video.width = 360;\r\n }\r\n\r\n if (!options.video.height) {\r\n options.video.height = 240;\r\n }\r\n\r\n /**\r\n * This method records all MediaStreams.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // github/muaz-khan/MultiStreamsMixer\r\n mixer = new MultiStreamsMixer(arrayOfMediaStreams, options.elementClass || 'multi-streams-mixer');\r\n\r\n if (getAllVideoTracks().length) {\r\n mixer.frameInterval = options.frameInterval || 10;\r\n mixer.width = options.video.width || 360;\r\n mixer.height = options.video.height || 240;\r\n mixer.startDrawingFrames();\r\n }\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n\r\n // record using MediaRecorder API\r\n mediaRecorder = new MediaStreamRecorder(mixer.getMixedStream(), options);\r\n mediaRecorder.record();\r\n };\r\n\r\n function getAllVideoTracks() {\r\n var tracks = [];\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n getTracks(stream, 'video').forEach(function(track) {\r\n tracks.push(track);\r\n });\r\n });\r\n return tracks;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n mediaRecorder.stop(function(blob) {\r\n self.blob = blob;\r\n\r\n callback(blob);\r\n\r\n self.clearRecordedData();\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder = null;\r\n }\r\n\r\n if (mixer) {\r\n mixer.releaseStreams();\r\n mixer = null;\r\n }\r\n };\r\n\r\n /**\r\n * Add extra media-streams to existing recordings.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.addStreams([newAudioStream, newVideoStream]);\r\n */\r\n this.addStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n arrayOfMediaStreams.concat(streams);\r\n\r\n if (!mediaRecorder || !mixer) {\r\n return;\r\n }\r\n\r\n mixer.appendStreams(streams);\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n };\r\n\r\n /**\r\n * Reset videos during live recording. Replace old videos e.g. replace cameras with full-screen.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.resetVideoStreams([newVideo1, newVideo2]);\r\n */\r\n this.resetVideoStreams = function(streams) {\r\n if (!mixer) {\r\n return;\r\n }\r\n\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n mixer.resetVideoStreams(streams);\r\n };\r\n\r\n /**\r\n * Returns MultiStreamsMixer\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * let mixer = recorder.getMixer();\r\n * mixer.appendStreams([newStream]);\r\n */\r\n this.getMixer = function() {\r\n return mixer;\r\n };\r\n\r\n // for debugging\r\n this.name = 'MultiStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MultiStreamRecorder = MultiStreamRecorder;\r\n}\n\r\n// _____________________\r\n// RecordRTC.promises.js\r\n\r\n/**\r\n * RecordRTCPromisesHandler adds promises support in {@link RecordRTC}. Try a {@link https://github.com/muaz-khan/RecordRTC/blob/master/simple-demos/RecordRTCPromisesHandler.html|demo here}\r\n * @summary Promises for {@link RecordRTC}\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCPromisesHandler\r\n * @class\r\n * @example\r\n * var recorder = new RecordRTCPromisesHandler(mediaStream, options);\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n * // Note: You can access all RecordRTC API using \"recorder.recordRTC\" e.g. \r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n * recorder.recordRTC.setRecordingDuration(5000);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n * @throws Will throw an error if \"new\" keyword is not used to initiate \"RecordRTCPromisesHandler\". Also throws error if first argument \"MediaStream\" is missing.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction RecordRTCPromisesHandler(mediaStream, options) {\r\n if (!this) {\r\n throw 'Use \"new RecordRTCPromisesHandler()\"';\r\n }\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n var self = this;\r\n\r\n /**\r\n * @property {Blob} blob - Access/reach the native {@link RecordRTC} object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internal = recorder.recordRTC.getInternalRecorder();\r\n * alert(internal instanceof MediaStreamRecorder);\r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n */\r\n self.recordRTC = new RecordRTC(mediaStream, options);\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.startRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.startRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method stops the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * var blob = recorder.getBlob();\r\n * }).catch(errorCB);\r\n */\r\n this.stopRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.stopRecording(function(url) {\r\n self.blob = self.recordRTC.getBlob();\r\n\r\n if (!self.blob || !self.blob.size) {\r\n reject('Empty blob.', self.blob);\r\n return;\r\n }\r\n\r\n resolve(url);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.pauseRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.pauseRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.pauseRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.resumeRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.resumeRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.resumeRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns data-url for the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getDataURL().then(function(dataURL) {\r\n * window.open(dataURL);\r\n * }).catch(errorCB);;\r\n * }).catch(errorCB);\r\n */\r\n this.getDataURL = function(callback) {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.getDataURL(function(dataURL) {\r\n resolve(dataURL);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getBlob().then(function(blob) {})\r\n * }).catch(errorCB);\r\n */\r\n this.getBlob = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getBlob());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the internal recording object.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internalRecorder = await recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} \r\n */\r\n this.getInternalRecorder = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getInternalRecorder());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.reset();\r\n * recorder.startRecording(); // record again\r\n */\r\n this.reset = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.reset());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.destroy().then(successCB).catch(errorCB);\r\n */\r\n this.destroy = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.destroy());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let state = await recorder.getState();\r\n * // or\r\n * recorder.getState().then(state => { console.log(state); })\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getState());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.stopRecording();\r\n * let blob = recorder.getBlob(); // or \"recorder.recordRTC.blob\"\r\n * invokeSaveAsDialog(blob);\r\n */\r\n this.blob = null;\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTCPromisesHandler\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n this.version = '5.6.2';\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.RecordRTCPromisesHandler = RecordRTCPromisesHandler;\r\n}\n\r\n// ______________________\r\n// WebAssemblyRecorder.js\r\n\r\n/**\r\n * WebAssemblyRecorder lets you create webm videos in JavaScript via WebAssembly. The library consumes raw RGBA32 buffers (4 bytes per pixel) and turns them into a webm video with the given framerate and quality. This makes it compatible out-of-the-box with ImageData from a CANVAS. With realtime mode you can also use webm-wasm for streaming webm videos.\r\n * @summary Video recording feature in Chrome, Firefox and maybe Edge.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WebAssemblyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WebAssemblyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {webAssemblyPath:'webm-wasm.wasm',workerPath: 'webm-worker.js', frameRate: 30, width: 1920, height: 1080, bitrate: 1024, realtime: true}\r\n */\r\nfunction WebAssemblyRecorder(stream, config) {\r\n // based on: github.com/GoogleChromeLabs/webm-wasm\r\n\r\n if (typeof ReadableStream === 'undefined' || typeof WritableStream === 'undefined') {\r\n // because it fixes readable/writable streams issues\r\n console.error('Following polyfill is strongly recommended: https://unpkg.com/@mattiasbuelens/web-streams-polyfill/dist/polyfill.min.js');\r\n }\r\n\r\n config = config || {};\r\n\r\n config.width = config.width || 640;\r\n config.height = config.height || 480;\r\n config.frameRate = config.frameRate || 30;\r\n config.bitrate = config.bitrate || 1200;\r\n config.realtime = config.realtime || true;\r\n\r\n function createBufferURL(buffer, type) {\r\n return URL.createObjectURL(new Blob([buffer], {\r\n type: type || ''\r\n }));\r\n }\r\n\r\n var finished;\r\n\r\n function cameraStream() {\r\n return new ReadableStream({\r\n start: function(controller) {\r\n var cvs = document.createElement('canvas');\r\n var video = document.createElement('video');\r\n var first = true;\r\n video.srcObject = stream;\r\n video.muted = true;\r\n video.height = config.height;\r\n video.width = config.width;\r\n video.volume = 0;\r\n video.onplaying = function() {\r\n cvs.width = config.width;\r\n cvs.height = config.height;\r\n var ctx = cvs.getContext('2d');\r\n var frameTimeout = 1000 / config.frameRate;\r\n var cameraTimer = setInterval(function f() {\r\n if (finished) {\r\n clearInterval(cameraTimer);\r\n controller.close();\r\n }\r\n\r\n if (first) {\r\n first = false;\r\n if (config.onVideoProcessStarted) {\r\n config.onVideoProcessStarted();\r\n }\r\n }\r\n\r\n ctx.drawImage(video, 0, 0);\r\n if (controller._controlledReadableStream.state !== 'closed') {\r\n try {\r\n controller.enqueue(\r\n ctx.getImageData(0, 0, config.width, config.height)\r\n );\r\n } catch (e) {}\r\n }\r\n }, frameTimeout);\r\n };\r\n video.play();\r\n }\r\n });\r\n }\r\n\r\n var worker;\r\n\r\n function startRecording(stream, buffer) {\r\n if (!config.workerPath && !buffer) {\r\n finished = false;\r\n\r\n // is it safe to use @latest ?\r\n\r\n fetch(\r\n 'https://unpkg.com/webm-wasm@latest/dist/webm-worker.js'\r\n ).then(function(r) {\r\n r.arrayBuffer().then(function(buffer) {\r\n startRecording(stream, buffer);\r\n });\r\n });\r\n return;\r\n }\r\n\r\n if (!config.workerPath && buffer instanceof ArrayBuffer) {\r\n var blob = new Blob([buffer], {\r\n type: 'text/javascript'\r\n });\r\n config.workerPath = URL.createObjectURL(blob);\r\n }\r\n\r\n if (!config.workerPath) {\r\n console.error('workerPath parameter is missing.');\r\n }\r\n\r\n worker = new Worker(config.workerPath);\r\n\r\n worker.postMessage(config.webAssemblyPath || 'https://unpkg.com/webm-wasm@latest/dist/webm-wasm.wasm');\r\n worker.addEventListener('message', function(event) {\r\n if (event.data === 'READY') {\r\n worker.postMessage({\r\n width: config.width,\r\n height: config.height,\r\n bitrate: config.bitrate || 1200,\r\n timebaseDen: config.frameRate || 30,\r\n realtime: config.realtime\r\n });\r\n\r\n cameraStream().pipeTo(new WritableStream({\r\n write: function(image) {\r\n if (finished) {\r\n console.error('Got image, but recorder is finished!');\r\n return;\r\n }\r\n\r\n worker.postMessage(image.data.buffer, [image.data.buffer]);\r\n }\r\n }));\r\n } else if (!!event.data) {\r\n if (!isPaused) {\r\n arrayOfBuffers.push(event.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n startRecording(stream);\r\n\r\n if (typeof config.initCallback === 'function') {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n var isPaused;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPaused = false;\r\n };\r\n\r\n function terminate(callback) {\r\n if (!worker) {\r\n if (callback) {\r\n callback();\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Wait for null event data to indicate that the encoding is complete\r\n worker.addEventListener('message', function(event) {\r\n if (event.data === null) {\r\n worker.terminate();\r\n worker = null;\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n }\r\n });\r\n\r\n worker.postMessage(null);\r\n }\r\n\r\n var arrayOfBuffers = [];\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n finished = true;\r\n\r\n var recorder = this;\r\n\r\n terminate(function() {\r\n recorder.blob = new Blob(arrayOfBuffers, {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(recorder.blob);\r\n });\r\n };\r\n\r\n // for debugging\r\n this.name = 'WebAssemblyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n\r\n // todo: if recording-ON then STOP it first\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WebAssemblyRecorder = WebAssemblyRecorder;\r\n}\n","import {downloadRecord} from \"../utils\";\nimport RecordRTC from 'recordrtc';\nimport {EVENTS, FILE_SUFFIX} from \"../constant\";\nimport Emitter from \"../utils/emitter\";\n\nexport default class RecordRTCLoader extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n this.fileName = '';\n this.fileType = FILE_SUFFIX.webm;\n this.isRecording = false;\n this.recordingTimestamp = 0;\n this.recordingInterval = null;\n player.debug.log('Recorder', 'init');\n }\n\n destroy() {\n this._reset();\n this.player.debug.log('Recorder', 'destroy');\n }\n\n setFileName(fileName, fileType) {\n this.fileName = fileName;\n\n if (FILE_SUFFIX.mp4 === fileType || FILE_SUFFIX.webm === fileType) {\n this.fileType = fileType;\n }\n }\n\n get recording() {\n return this.isRecording;\n }\n\n get recordTime() {\n return this.recordingTimestamp;\n }\n\n startRecord() {\n const debug = this.player.debug;\n const options = {\n type: 'video',\n mimeType: 'video/webm;codecs=h264',\n onTimeStamp: (timestamp) => {\n debug.log('Recorder', 'record timestamp :' + timestamp);\n },\n disableLogs: !this.player._opt.debug\n }\n\n try {\n const stream = this.player.video.$videoElement.captureStream(25);\n if (this.player.audio && this.player.audio.mediaStreamAudioDestinationNode &&\n this.player.audio.mediaStreamAudioDestinationNode.stream &&\n !this.player.audio.isStateSuspended() &&\n this.player.audio.hasAudio && this.player._opt.hasAudio) {\n const audioStream = this.player.audio.mediaStreamAudioDestinationNode.stream;\n if (audioStream.getAudioTracks().length > 0) {\n const audioTrack = audioStream.getAudioTracks()[0];\n if (audioTrack && audioTrack.enabled) {\n stream.addTrack(audioTrack);\n }\n }\n }\n this.recorder = RecordRTC(stream, options);\n } catch (e) {\n debug.error('Recorder', e);\n this.emit(EVENTS.recordCreateError);\n }\n if (this.recorder) {\n this.isRecording = true;\n this.player.emit(EVENTS.recording, true);\n this.recorder.startRecording();\n debug.log('Recorder', 'start recording');\n this.player.emit(EVENTS.recordStart);\n this.recordingInterval = window.setInterval(() => {\n this.recordingTimestamp += 1;\n this.player.emit(EVENTS.recordingTimestamp, this.recordingTimestamp);\n }, 1000);\n }\n }\n\n stopRecordAndSave() {\n if (!this.recorder || !this.isRecording) {\n return;\n }\n this.recorder.stopRecording(() => {\n this.player.debug.log('Recorder', 'stop recording');\n this.player.emit(EVENTS.recordEnd)\n downloadRecord(this.recorder.getBlob(), this.fileName, this.fileType);\n this._reset();\n this.player.emit(EVENTS.recording, false);\n })\n }\n\n _reset() {\n this.isRecording = false;\n this.recordingTimestamp = 0;\n\n if (this.recorder) {\n this.recorder.destroy();\n this.recorder = null;\n }\n this.fileName = null;\n if (this.recordingInterval) {\n clearInterval(this.recordingInterval);\n }\n this.recordingInterval = null;\n }\n\n\n}\n","import RecordRTCLoader from \"./recordRTCLoader\";\n\nexport default class Recorder {\n constructor(player) {\n const Loader = Recorder.getLoaderFactory();\n return new Loader(player);\n }\n\n static getLoaderFactory() {\n return RecordRTCLoader;\n }\n}\n","import {EVENTS, EVENTS_ERROR, MEDIA_TYPE, WASM_ERROR, WORKER_CMD_TYPE, WORKER_SEND_TYPE} from \"../constant\";\nimport {now} from \"../utils\";\n\nexport default class DecoderWorker {\n constructor(player) {\n this.player = player;\n this.decoderWorker = new Worker(player._opt.decoder)\n this._initDecoderWorker();\n player.debug.log('decoderWorker', 'init')\n }\n\n destroy() {\n this.decoderWorker.postMessage({cmd: WORKER_SEND_TYPE.close})\n this.decoderWorker.terminate();\n this.decoderWorker = null;\n this.player.debug.log(`decoderWorker`, 'destroy');\n }\n\n _initDecoderWorker() {\n const {\n debug,\n events: {proxy},\n } = this.player;\n\n this.decoderWorker.onmessage = (event) => {\n const msg = event.data;\n switch (msg.cmd) {\n case WORKER_CMD_TYPE.init:\n debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.init);\n if (!this.player.loaded) {\n this.player.emit(EVENTS.load);\n }\n this.player.emit(EVENTS.decoderWorkerInit);\n this._initWork();\n break;\n case WORKER_CMD_TYPE.videoCode:\n debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.videoCode, msg.code);\n if (!this.player._times.decodeStart) {\n this.player._times.decodeStart = now();\n }\n this.player.video.updateVideoInfo({\n encTypeCode: msg.code\n })\n break;\n case WORKER_CMD_TYPE.audioCode:\n debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.audioCode, msg.code);\n this.player.audio && this.player.audio.updateAudioInfo({\n encTypeCode: msg.code\n })\n break;\n case WORKER_CMD_TYPE.initVideo:\n debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.initVideo, `width:${msg.w},height:${msg.h}`);\n this.player.video.updateVideoInfo({\n width: msg.w,\n height: msg.h\n })\n this.player.video.initCanvasViewSize();\n break;\n case WORKER_CMD_TYPE.initAudio:\n debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.initAudio, `channels:${msg.channels},sampleRate:${msg.sampleRate}`);\n if (this.player.audio) {\n this.player.audio.updateAudioInfo(msg);\n this.player.audio.initScriptNode(msg);\n }\n break;\n case WORKER_CMD_TYPE.render:\n // debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.render, `msg ts:${msg.ts}`);\n this.player.handleRender();\n this.player.video.render(msg);\n this.player.emit(EVENTS.timeUpdate, msg.ts)\n this.player.updateStats({fps: true, ts: msg.ts, buf: msg.delay})\n if (!this.player._times.videoStart) {\n this.player._times.videoStart = now();\n this.player.handlePlayToRenderTimes();\n }\n break;\n case WORKER_CMD_TYPE.playAudio:\n // debug.log(`decoderWorker`, 'onmessage:', WORKER_CMD_TYPE.playAudio, `msg ts:${msg.ts}`);\n // 只有在 playing 的时候。\n if (this.player.playing && this.player.audio) {\n this.player.audio.play(msg.buffer, msg.ts);\n }\n break;\n case WORKER_CMD_TYPE.wasmError:\n if (msg.message) {\n if (msg.message.indexOf(WASM_ERROR.invalidNalUnitSize) !== -1) {\n this.player.emit(EVENTS.error, EVENTS_ERROR.wasmDecodeError);\n this.player.emit(EVENTS_ERROR.wasmDecodeError);\n }\n }\n break;\n default:\n this.player[msg.cmd] && this.player[msg.cmd](msg);\n }\n }\n }\n\n _initWork() {\n const opt = {\n debug: this.player._opt.debug,\n forceNoOffscreen: this.player._opt.forceNoOffscreen,\n useWCS: this.player._opt.useWCS,\n videoBuffer: this.player._opt.videoBuffer,\n openWebglAlignment: this.player._opt.openWebglAlignment\n }\n this.decoderWorker.postMessage({\n cmd: WORKER_SEND_TYPE.init,\n opt: JSON.stringify(opt),\n sampleRate: (this.player.audio && this.player.audio.audioContext.sampleRate) || 0\n })\n }\n\n decodeVideo(arrayBuffer, ts, isIFrame) {\n\n const options = {\n type: MEDIA_TYPE.video,\n ts: Math.max(ts, 0),\n isIFrame\n }\n // this.player.debug.log('decoderWorker', 'decodeVideo', options);\n this.decoderWorker.postMessage({\n cmd: WORKER_SEND_TYPE.decode,\n buffer: arrayBuffer,\n options\n }, [arrayBuffer.buffer])\n }\n\n decodeAudio(arrayBuffer, ts) {\n if (this.player._opt.useWCS && !this.player._opt.useOffscreen) {\n this._decodeAudioNoDelay(arrayBuffer, ts);\n } else if (this.player._opt.useMSE) {\n this._decodeAudioNoDelay(arrayBuffer, ts);\n } else {\n this._decodeAudio(arrayBuffer, ts);\n }\n }\n\n //\n _decodeAudio(arrayBuffer, ts) {\n const options = {\n type: MEDIA_TYPE.audio,\n ts: Math.max(ts, 0)\n }\n // this.player.debug.log('decoderWorker', 'decodeAudio',options);\n this.decoderWorker.postMessage({\n cmd: WORKER_SEND_TYPE.decode,\n buffer: arrayBuffer,\n options\n }, [arrayBuffer.buffer])\n }\n\n\n _decodeAudioNoDelay(arrayBuffer, ts) {\n // console.log('_decodeAudioNoDelay', arrayBuffer);\n this.decoderWorker.postMessage({\n cmd: WORKER_SEND_TYPE.audioDecode,\n buffer: arrayBuffer,\n ts: Math.max(ts, 0)\n }, [arrayBuffer.buffer])\n }\n\n\n updateWorkConfig(config) {\n this.decoderWorker.postMessage({\n cmd: WORKER_SEND_TYPE.updateConfig,\n key: config.key,\n value: config.value\n })\n }\n\n}\n","import Emitter from \"../utils/emitter\";\nimport {MEDIA_TYPE} from \"../constant\";\n\nexport default class CommonLoader extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n\n this.stopId = null;\n this.firstTimestamp = null;\n this.startTimestamp = null;\n this.delay = -1;\n this.bufferList = [];\n this.dropping = false;\n this.initInterval();\n }\n\n destroy() {\n if (this.stopId) {\n clearInterval(this.stopId);\n this.stopId = null;\n }\n this.firstTimestamp = null;\n this.startTimestamp = null;\n this.delay = -1;\n this.bufferList = [];\n this.dropping = false;\n this.off();\n }\n\n getDelay(timestamp) {\n if (!timestamp) {\n return -1\n }\n if (!this.firstTimestamp) {\n this.firstTimestamp = timestamp\n this.startTimestamp = Date.now()\n this.delay = -1;\n } else {\n if (timestamp) {\n this.delay = (Date.now() - this.startTimestamp) - (timestamp - this.firstTimestamp)\n }\n }\n return this.delay\n }\n\n resetDelay() {\n this.firstTimestamp = null;\n this.startTimestamp = null;\n this.delay = -1;\n this.dropping = false;\n }\n\n //\n initInterval() {\n this.player.debug.log('common dumex', `init Interval`);\n let _loop = () => {\n let data;\n const videoBuffer = this.player._opt.videoBuffer;\n if (this.bufferList.length) {\n if (this.dropping) {\n // this.player.debug.log('common dumex', `is dropping`);\n data = this.bufferList.shift();\n if (data.type === MEDIA_TYPE.audio && data.payload[1] === 0) {\n this._doDecoderDecode(data);\n }\n while (!data.isIFrame && this.bufferList.length) {\n data = this.bufferList.shift();\n if (data.type === MEDIA_TYPE.audio && data.payload[1] === 0) {\n this._doDecoderDecode(data);\n }\n }\n // i frame\n if (data.isIFrame) {\n this.dropping = false;\n this._doDecoderDecode(data);\n }\n } else {\n data = this.bufferList[0];\n if (this.getDelay(data.ts) === -1) {\n // this.player.debug.log('common dumex', `delay is -1`);\n this.bufferList.shift()\n this._doDecoderDecode(data);\n } else if (this.delay > videoBuffer + 1000) {\n // this.player.debug.log('common dumex', `delay is ${this.delay}, set dropping is true`);\n this.resetDelay();\n this.dropping = true\n } else {\n while (this.bufferList.length) {\n data = this.bufferList[0]\n\n if (this.getDelay(data.ts) > videoBuffer) {\n // drop frame\n this.bufferList.shift()\n this._doDecoderDecode(data);\n } else {\n // this.player.debug.log('common dumex', `delay is ${this.delay}`);\n break;\n }\n }\n }\n }\n }\n }\n _loop();\n this.stopId = setInterval(_loop, 10)\n }\n\n _doDecode(payload, type, ts, isIFrame) {\n const player = this.player;\n let options = {\n ts: ts,\n type: type,\n isIFrame: false\n }\n // use offscreen\n if (player._opt.useWCS && !player._opt.useOffscreen) {\n if (type === MEDIA_TYPE.video) {\n options.isIFrame = isIFrame;\n }\n this.pushBuffer(payload, options)\n } else if (player._opt.useMSE) {\n // use mse\n if (type === MEDIA_TYPE.video) {\n options.isIFrame = isIFrame;\n }\n this.pushBuffer(payload, options)\n } else {\n //\n if (type === MEDIA_TYPE.video) {\n player.decoderWorker && player.decoderWorker.decodeVideo(payload, ts, isIFrame);\n } else if (type === MEDIA_TYPE.audio) {\n if (player._opt.hasAudio) {\n player.decoderWorker && player.decoderWorker.decodeAudio(payload, ts);\n }\n }\n }\n }\n\n _doDecoderDecode(data) {\n const player = this.player;\n const {webcodecsDecoder, mseDecoder} = player;\n\n if (data.type === MEDIA_TYPE.audio) {\n if (player._opt.hasAudio) {\n player.decoderWorker && player.decoderWorker.decodeAudio(data.payload, data.ts)\n }\n } else if (data.type === MEDIA_TYPE.video) {\n if (player._opt.useWCS && !player._opt.useOffscreen) {\n webcodecsDecoder.decodeVideo(data.payload, data.ts, data.isIFrame);\n } else if (player._opt.useMSE) {\n mseDecoder.decodeVideo(data.payload, data.ts, data.isIFrame);\n }\n }\n }\n\n pushBuffer(payload, options) {\n // 音频\n if (options.type === MEDIA_TYPE.audio) {\n this.bufferList.push({\n ts: options.ts,\n payload: payload,\n type: MEDIA_TYPE.audio,\n })\n } else if (options.type === MEDIA_TYPE.video) {\n this.bufferList.push({\n ts: options.ts,\n payload: payload,\n type: MEDIA_TYPE.video,\n isIFrame: options.isIFrame\n })\n }\n }\n\n close() {\n\n }\n\n\n}\n","import {FLV_MEDIA_TYPE, MEDIA_TYPE} from \"../constant\";\nimport CommonLoader from \"./commonLoader\";\nimport {now} from \"../utils\";\n\nexport default class FlvLoader extends CommonLoader {\n constructor(player) {\n super(player);\n this.input = this._inputFlv();\n this.flvDemux = this.dispatchFlvData(this.input);\n player.debug.log('FlvDemux', 'init')\n }\n\n destroy() {\n super.destroy();\n this.input = null;\n this.flvDemux = null;\n this.player.debug.log('FlvDemux', 'destroy')\n }\n\n dispatch(data) {\n this.flvDemux(data);\n }\n\n * _inputFlv() {\n yield 9;\n const tmp = new ArrayBuffer(4)\n const tmp8 = new Uint8Array(tmp)\n const tmp32 = new Uint32Array(tmp)\n const player = this.player;\n\n while (true) {\n tmp8[3] = 0\n const t = yield 15\n const type = t[4]\n tmp8[0] = t[7]\n tmp8[1] = t[6]\n tmp8[2] = t[5]\n const length = tmp32[0]\n tmp8[0] = t[10]\n tmp8[1] = t[9]\n tmp8[2] = t[8]\n let ts = tmp32[0]\n if (ts === 0xFFFFFF) {\n tmp8[3] = t[11]\n ts = tmp32[0]\n }\n const payload = yield length\n switch (type) {\n case FLV_MEDIA_TYPE.audio:\n if (player._opt.hasAudio) {\n player.updateStats({\n abps: payload.byteLength\n })\n if (payload.byteLength > 0) {\n this._doDecode(payload, MEDIA_TYPE.audio, ts)\n }\n }\n break\n case FLV_MEDIA_TYPE.video:\n if (!player._times.demuxStart) {\n player._times.demuxStart = now();\n }\n if (player._opt.hasVideo) {\n player.updateStats({\n vbps: payload.byteLength\n })\n const isIFrame = payload[0] >> 4 === 1;\n if (payload.byteLength > 0) {\n this._doDecode(payload, MEDIA_TYPE.video, ts, isIFrame);\n }\n }\n break\n }\n }\n }\n\n dispatchFlvData(input) {\n let need = input.next()\n let buffer = null\n return (value) => {\n let data = new Uint8Array(value)\n if (buffer) {\n let combine = new Uint8Array(buffer.length + data.length)\n combine.set(buffer)\n combine.set(data, buffer.length)\n data = combine\n buffer = null\n }\n while (data.length >= need.value) {\n let remain = data.slice(need.value)\n need = input.next(data.slice(0, need.value))\n data = remain\n }\n if (data.length > 0) {\n buffer = data\n }\n }\n }\n\n close() {\n this.input && this.input.return(null)\n }\n\n\n}\n","import {FLV_MEDIA_TYPE, MEDIA_TYPE} from \"../constant\";\nimport CommonLoader from \"./commonLoader\";\nimport {now} from \"../utils\";\n\nexport default class M7sLoader extends CommonLoader {\n constructor(player) {\n super(player);\n player.debug.log('M7sDemux', 'init')\n }\n\n destroy() {\n super.destroy();\n this.player.debug.log('M7sDemux', 'destroy')\n }\n\n dispatch(data) {\n const player = this.player;\n const dv = new DataView(data)\n const type = dv.getUint8(0);\n const ts = dv.getUint32(1, false);\n switch (type) {\n case MEDIA_TYPE.audio:\n if (player._opt.hasAudio) {\n const payload = new Uint8Array(data, 5)\n player.updateStats({\n abps: payload.byteLength\n })\n if (payload.byteLength > 0) {\n this._doDecode(payload, type, ts)\n }\n }\n break;\n case MEDIA_TYPE.video:\n if (player._opt.hasVideo) {\n if (!player._times.demuxStart) {\n player._times.demuxStart = now();\n }\n if (dv.byteLength > 5) {\n const payload = new Uint8Array(data, 5);\n const isIframe = dv.getUint8(5) >> 4 === 1;\n player.updateStats({\n vbps: payload.byteLength\n })\n if (payload.byteLength > 0) {\n this._doDecode(payload, type, ts, isIframe)\n }\n }\n }\n break;\n }\n }\n\n\n}\n","import FlvLoader from \"./flvLoader\";\nimport M7sLoader from \"./m7sLoader\";\nimport {DEMUX_TYPE} from \"../constant\";\n\nexport default class Demux {\n constructor(player) {\n const Loader = Demux.getLoaderFactory(player._opt.demuxType);\n return new Loader(player);\n }\n\n static getLoaderFactory(type) {\n if (type === DEMUX_TYPE.m7s) {\n return M7sLoader;\n } else if (type === DEMUX_TYPE.flv) {\n return FlvLoader;\n }\n }\n}\n","import {formatVideoDecoderConfigure, noop, now} from \"../utils\";\nimport Emitter from \"../utils/emitter\";\nimport {ENCODED_VIDEO_TYPE, EVENTS, EVENTS_ERROR, VIDEO_ENC_CODE} from \"../constant\";\n\n\nexport default class WebcodecsDecoder extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n this.hasInit = false;\n this.isInitInfo = false;\n this.decoder = null;\n this.initDecoder();\n player.debug.log('Webcodecs', 'init')\n }\n\n destroy() {\n if (this.decoder) {\n this.decoder.close();\n this.decoder = null;\n }\n\n this.hasInit = false;\n this.isInitInfo = false;\n this.off();\n this.player.debug.log('Webcodecs', 'destroy')\n }\n\n initDecoder() {\n const _this = this;\n this.decoder = new VideoDecoder({\n output(videoFrame) {\n _this.handleDecode(videoFrame)\n },\n error(error) {\n _this.handleError(error)\n }\n })\n }\n\n handleDecode(videoFrame) {\n if (!this.isInitInfo) {\n this.player.video.updateVideoInfo({\n width: videoFrame.codedWidth,\n height: videoFrame.codedHeight\n })\n this.player.video.initCanvasViewSize();\n this.isInitInfo = true;\n }\n\n if (!this.player._times.videoStart) {\n this.player._times.videoStart = now();\n this.player.handlePlayToRenderTimes();\n }\n\n this.player.handleRender();\n this.player.video.render({\n videoFrame\n })\n\n this.player.updateStats({fps: true, ts: 0, buf: this.player.demux.delay})\n\n // release resource\n setTimeout(function () {\n if (videoFrame.close) {\n videoFrame.close()\n } else {\n videoFrame.destroy()\n }\n }, 100)\n }\n\n handleError(error) {\n this.player.debug.log('Webcodecs', 'VideoDecoder handleError', error)\n }\n\n decodeVideo(payload, ts, isIframe) {\n // this.player.debug.log('Webcodecs decoder', 'decodeVideo', ts, isIframe);\n if (!this.hasInit) {\n if (isIframe && payload[1] === 0) {\n const videoCodec = (payload[0] & 0x0F);\n this.player.video.updateVideoInfo({\n encTypeCode: videoCodec\n })\n\n // 如果解码出来的是\n if (videoCodec === VIDEO_ENC_CODE.h265) {\n this.emit(EVENTS_ERROR.webcodecsH265NotSupport)\n return;\n }\n if (!this.player._times.decodeStart) {\n this.player._times.decodeStart = now();\n }\n\n const config = formatVideoDecoderConfigure(payload.slice(5));\n this.decoder.configure(config);\n this.hasInit = true;\n }\n } else {\n const chunk = new EncodedVideoChunk({\n data: payload.slice(5),\n timestamp: ts,\n type: isIframe ? ENCODED_VIDEO_TYPE.key : ENCODED_VIDEO_TYPE.delta\n })\n this.decoder.decode(chunk);\n }\n }\n\n\n}\n","const iconsMap = {\n play: '播放',\n pause: '暂停',\n audio: '',\n mute: '',\n screenshot: '截图',\n loading: '加载',\n fullscreen: '全屏',\n fullscreenExit: '退出全屏',\n record: '录制',\n recordStop: '停止录制',\n}\n\nexport default Object.keys(iconsMap).reduce((icons, key) => {\n icons[key] = `\n \n ${iconsMap[key] ? `${iconsMap[key]}` : ''}\n`;\n return icons;\n}, {});\n","import icons from './icons';\n\nexport default (player, control) => {\n\n if (player._opt.hasControl && player._opt.controlAutoHide) {\n player.$container.classList.add('jessibuca-controls-show-auto-hide');\n }\n else {\n player.$container.classList.add('jessibuca-controls-show');\n }\n const options = player._opt;\n const operateBtns = options.operateBtns;\n\n\n player.$container.insertAdjacentHTML(\n 'beforeend',\n `\n ${options.background ? `` : ''}\n \n ${icons.loading}\n ${options.loadingText ? `
${options.loadingText}
` : ''}\n
\n ${options.hasControl && operateBtns.play ? `` : ''}\n ${options.hasControl ? `\n \n
\n
\n ${options.showBandwidth ? `
` : ''}\n
\n
\n ${operateBtns.audio ? `\n
\n ${icons.audio}\n ${icons.mute}\n
\n
\n ` : ''}\n ${operateBtns.play ? `
${icons.play}
${icons.pause}
` : ''}\n ${operateBtns.screenshot ? `
${icons.screenshot}
` : ''}\n ${operateBtns.record ? `
${icons.record}
${icons.recordStop}
` : ''}\n ${operateBtns.fullscreen ? `
${icons.fullscreen}
${icons.fullscreenExit}
` : ''}\n
\n
\n
\n ` : ''}\n\n `\n )\n\n Object.defineProperty(control, '$poster', {\n value: player.$container.querySelector('.jessibuca-poster'),\n });\n\n Object.defineProperty(control, '$loading', {\n value: player.$container.querySelector('.jessibuca-loading'),\n });\n\n Object.defineProperty(control, '$play', {\n value: player.$container.querySelector('.jessibuca-play'),\n });\n\n Object.defineProperty(control, '$playBig', {\n value: player.$container.querySelector('.jessibuca-play-big'),\n });\n\n Object.defineProperty(control, '$pause', {\n value: player.$container.querySelector('.jessibuca-pause'),\n });\n\n Object.defineProperty(control, '$controls', {\n value: player.$container.querySelector('.jessibuca-controls'),\n });\n\n Object.defineProperty(control, '$fullscreen', {\n value: player.$container.querySelector('.jessibuca-fullscreen'),\n });\n\n Object.defineProperty(control, '$fullscreen', {\n value: player.$container.querySelector('.jessibuca-fullscreen'),\n });\n\n\n Object.defineProperty(control, '$volume', {\n value: player.$container.querySelector('.jessibuca-volume'),\n });\n\n Object.defineProperty(control, '$volumePanelWrap', {\n value: player.$container.querySelector('.jessibuca-volume-panel-wrap'),\n });\n\n Object.defineProperty(control, '$volumePanelText', {\n value: player.$container.querySelector('.jessibuca-volume-panel-text'),\n });\n\n Object.defineProperty(control, '$volumePanel', {\n value: player.$container.querySelector('.jessibuca-volume-panel'),\n });\n\n Object.defineProperty(control, '$volumeHandle', {\n value: player.$container.querySelector('.jessibuca-volume-panel-handle'),\n });\n\n Object.defineProperty(control, '$volumeOn', {\n value: player.$container.querySelector('.jessibuca-icon-audio'),\n });\n\n Object.defineProperty(control, '$volumeOff', {\n value: player.$container.querySelector('.jessibuca-icon-mute'),\n });\n\n\n Object.defineProperty(control, '$fullscreen', {\n value: player.$container.querySelector('.jessibuca-fullscreen'),\n });\n\n Object.defineProperty(control, '$fullscreenExit', {\n value: player.$container.querySelector('.jessibuca-fullscreen-exit'),\n });\n\n Object.defineProperty(control, '$record', {\n value: player.$container.querySelector('.jessibuca-record'),\n });\n Object.defineProperty(control, '$recordStop', {\n value: player.$container.querySelector('.jessibuca-record-stop'),\n });\n\n Object.defineProperty(control, '$screenshot', {\n value: player.$container.querySelector('.jessibuca-screenshot'),\n });\n\n Object.defineProperty(control, '$speed', {\n value: player.$container.querySelector('.jessibuca-speed'),\n });\n}\n","import {EVENTS} from \"../constant\";\nimport {bpsSize, getStyle, isBoolean, setStyle} from \"../utils\";\nimport screenfull from \"screenfull\";\n\nexport default (player, control) => {\n const {\n events: {proxy},\n } = player;\n\n const object = document.createElement('object');\n object.setAttribute('aria-hidden', 'true');\n object.setAttribute('tabindex', -1);\n object.type = 'text/html';\n object.data = 'about:blank';\n\n setStyle(object, {\n display: 'block',\n position: 'absolute',\n top: '0',\n left: '0',\n height: '100%',\n width: '100%',\n overflow: 'hidden',\n pointerEvents: 'none',\n zIndex: '-1',\n });\n\n let playerWidth = player.width;\n let playerHeight = player.height;\n\n proxy(object, 'load', () => {\n proxy(object.contentDocument.defaultView, 'resize', () => {\n if (player.width !== playerWidth || player.height !== playerHeight) {\n playerWidth = player.width;\n playerHeight = player.height;\n player.emit(EVENTS.resize);\n }\n });\n });\n player.$container.appendChild(object);\n\n player.on(EVENTS.destroy, () => {\n player.$container.removeChild(object);\n })\n\n function setVolumeHandle(percentage) {\n if (percentage === 0) {\n setStyle(control.$volumeOn, 'display', 'none');\n setStyle(control.$volumeOff, 'display', 'flex');\n setStyle(control.$volumeHandle, 'top', `${48}px`);\n } else {\n if (control.$volumeHandle && control.$volumePanel) {\n const panelHeight = getStyle(control.$volumePanel, 'height') || 60;\n const handleHeight = getStyle(control.$volumeHandle, 'height');\n const top = panelHeight - (panelHeight - handleHeight) * percentage - handleHeight;\n setStyle(control.$volumeHandle, 'top', `${top}px`);\n setStyle(control.$volumeOn, 'display', 'flex');\n setStyle(control.$volumeOff, 'display', 'none');\n }\n }\n control.$volumePanelText && (control.$volumePanelText.innerHTML = parseInt(percentage * 100))\n }\n\n player.on(EVENTS.volumechange, () => {\n setVolumeHandle(player.volume);\n });\n\n player.on(EVENTS.loading, (flag) => {\n setStyle(control.$loading, 'display', flag ? 'flex' : 'none');\n setStyle(control.$poster, 'display', 'none')\n\n if (flag) {\n setStyle(control.$playBig, 'display', 'none');\n }\n })\n\n const screenfullChange = (fullscreen) => {\n let isFullScreen = isBoolean(fullscreen) ? fullscreen : player.fullscreen\n setStyle(control.$fullscreenExit, 'display', isFullScreen ? 'flex' : 'none');\n setStyle(control.$fullscreen, 'display', isFullScreen ? 'none' : 'flex');\n // control.autoSize();\n };\n try {\n\n screenfull.on('change', screenfullChange);\n player.events.destroys.push(() => {\n screenfull.off('change', screenfullChange);\n });\n } catch (error) {\n //\n }\n\n //\n player.on(EVENTS.webFullscreen, (value) => {\n screenfullChange(value);\n })\n\n\n player.on(EVENTS.recording, () => {\n setStyle(control.$record, 'display', player.recording ? 'none' : 'flex');\n setStyle(control.$recordStop, 'display', player.recording ? 'flex' : 'none');\n })\n\n //\n player.on(EVENTS.recordingTimestamp, (timestamp) => {\n // console.log(timestamp);\n })\n\n player.on(EVENTS.playing, (flag) => {\n setStyle(control.$play, 'display', flag ? 'none' : 'flex');\n setStyle(control.$playBig, 'display', flag ? 'none' : 'block');\n setStyle(control.$pause, 'display', flag ? 'flex' : 'none');\n setStyle(control.$screenshot, 'display', flag ? 'flex' : 'none');\n setStyle(control.$record, 'display', flag ? 'flex' : 'none');\n setStyle(control.$fullscreen, 'display', flag ? 'flex' : 'none');\n\n // 不在播放\n if (!flag) {\n control.$speed && (control.$speed.innerHTML = bpsSize(''));\n }\n })\n\n\n player.on(EVENTS.kBps, (rate) => {\n const bps = bpsSize(rate);\n control.$speed && (control.$speed.innerHTML = bps);\n })\n}\n","export default (player, control) => {\n\n Object.defineProperty(control, 'controlsRect', {\n get: () => {\n return control.$controls.getBoundingClientRect();\n },\n });\n\n}\n","import {clamp, isMobile, setStyle} from \"../utils\";\n\nexport default (player, control) => {\n const {\n events: {proxy},\n debug\n } = player;\n\n function volumeChangeFromEvent(event) {\n const {bottom: panelBottom, height: panelHeight} = control.$volumePanel.getBoundingClientRect();\n const {height: handleHeight} = control.$volumeHandle.getBoundingClientRect();\n\n let moveLen = event.y;\n\n // if (isMobile() && player.fullscreen) {\n // moveLen = event.x;\n // }\n\n const percentage =\n clamp(panelBottom - moveLen - handleHeight / 2, 0, panelHeight - handleHeight / 2) / (panelHeight - handleHeight);\n return percentage;\n }\n\n //\n proxy(window, ['click', 'contextmenu'], event => {\n if (event.composedPath().indexOf(player.$container) > -1) {\n control.isFocus = true;\n } else {\n control.isFocus = false;\n }\n });\n\n //\n proxy(window, 'orientationchange', () => {\n setTimeout(() => {\n player.resize();\n }, 300);\n });\n\n\n proxy(control.$controls, 'click', (e) => {\n e.stopPropagation();\n })\n\n proxy(control.$pause, 'click', (e) => {\n player.pause();\n })\n // 监听 play 方法\n proxy(control.$play, 'click', (e) => {\n player.play();\n })\n\n // 监听 play 方法\n proxy(control.$playBig, 'click', (e) => {\n player.play();\n })\n\n proxy(control.$volume, 'mouseover', () => {\n control.$volumePanelWrap.classList.add('jessibuca-volume-panel-wrap-show');\n })\n\n proxy(control.$volume, 'mouseout', () => {\n control.$volumePanelWrap.classList.remove('jessibuca-volume-panel-wrap-show');\n })\n\n proxy(control.$volumeOn, 'click', (e) => {\n e.stopPropagation();\n setStyle(control.$volumeOn, 'display', 'none');\n setStyle(control.$volumeOff, 'display', 'block');\n player.lastVolume = player.volume;\n player.volume = 0;\n })\n\n proxy(control.$volumeOff, 'click', (e) => {\n e.stopPropagation();\n setStyle(control.$volumeOn, 'display', 'block');\n setStyle(control.$volumeOff, 'display', 'none');\n player.volume = player.lastVolume || 0.5;\n })\n\n proxy(control.$screenshot, 'click', (e) => {\n e.stopPropagation();\n player.video.screenshot();\n })\n\n proxy(control.$volumePanel, 'click', event => {\n event.stopPropagation();\n player.volume = volumeChangeFromEvent(event);\n });\n\n proxy(control.$volumeHandle, 'mousedown', () => {\n control.isVolumeDroging = true;\n });\n\n proxy(control.$volumeHandle, 'mousemove', event => {\n if (control.isVolumeDroging) {\n player.volume = volumeChangeFromEvent(event);\n }\n });\n\n proxy(document, 'mouseup', () => {\n if (control.isVolumeDroging) {\n control.isVolumeDroging = false;\n }\n });\n\n proxy(control.$record, 'click', (e) => {\n e.stopPropagation();\n player.recording = true;\n })\n\n proxy(control.$recordStop, 'click', (e) => {\n e.stopPropagation();\n player.recording = false;\n })\n\n proxy(control.$fullscreen, 'click', (e) => {\n e.stopPropagation();\n player.fullscreen = true;\n })\n\n proxy(control.$fullscreenExit, 'click', (e) => {\n e.stopPropagation();\n player.fullscreen = false;\n })\n\n if (player._opt.hasControl && player._opt.controlAutoHide) {\n //\n proxy(player.$container, 'mouseover', () => {\n if (!player.fullscreen) {\n setStyle(control.$controls, 'display', 'block');\n }\n })\n\n proxy(player.$container, 'mouseout', () => {\n setStyle(control.$controls, 'display', 'none');\n })\n }\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","// todo: 待定\nimport {HOT_KEY} from \"../constant\";\n\nexport default (player, control) => {\n const {\n events: {proxy}\n } = player;\n\n const keys = {};\n\n function addHotkey(key, event) {\n if (keys[key]) {\n keys[key].push(event);\n } else {\n keys[key] = [event];\n }\n }\n\n //\n addHotkey(HOT_KEY.esc, () => {\n if (player.fullscreen) {\n player.fullscreen = false;\n }\n })\n\n //\n addHotkey(HOT_KEY.arrowUp, () => {\n player.volume += 0.05;\n })\n\n //\n addHotkey(HOT_KEY.arrowDown, () => {\n player.volume -= 0.05;\n })\n\n proxy(window, 'keydown', event => {\n if (control.isFocus) {\n const tag = document.activeElement.tagName.toUpperCase();\n const editable = document.activeElement.getAttribute('contenteditable');\n if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {\n const events = keys[event.keyCode];\n if (events) {\n event.preventDefault();\n events.forEach(fn => fn());\n }\n }\n }\n });\n}\n","import template from \"./template\";\nimport observer from './observer';\nimport property from './property';\nimport events from './events';\nimport './style.scss'\nimport hotkey from \"./hotkey\";\n\nexport default class Control {\n constructor(player) {\n this.player = player;\n template(player, this);\n observer(player, this);\n property(player, this);\n events(player, this);\n if (player._opt.hotKey) {\n hotkey(player, this);\n }\n this.player.debug.log('Control', 'init');\n }\n\n destroy() {\n if (this.$poster) {\n this.player.$container.removeChild(this.$poster);\n }\n if (this.$loading) {\n this.player.$container.removeChild(this.$loading);\n }\n if (this.$controls) {\n this.player.$container.removeChild(this.$controls);\n }\n\n if(this.$playBig){\n this.player.$container.removeChild(this.$playBig);\n }\n\n this.player.debug.log('control', 'destroy');\n }\n\n autoSize() {\n const player = this.player;\n player.$container.style.padding = '0 0';\n const playerWidth = player.width;\n const playerHeight = player.height;\n const playerRatio = playerWidth / playerHeight;\n const canvasWidth = player.video.$videoElement.width;\n const canvasHeight = player.video.$videoElement.height;\n const canvasRatio = canvasWidth / canvasHeight;\n if (playerRatio > canvasRatio) {\n const padding = (playerWidth - playerHeight * canvasRatio) / 2;\n player.$container.style.padding = `0 ${padding}px`;\n } else {\n const padding = (playerHeight - playerWidth / canvasRatio) / 2;\n player.$container.style.padding = `${padding}px 0`;\n }\n }\n\n\n}\n","export default (player) => {\n\n const {\n _opt,\n debug,\n events: {proxy},\n } = player;\n\n\n if (_opt.supportDblclickFullscreen) {\n proxy(player.$container, 'dblclick', () => {\n player.fullscreen = !player.fullscreen;\n })\n }\n\n\n //\n proxy(document, 'visibilitychange', () => {\n if (_opt.hiddenAutoPause) {\n debug.log('visibilitychange', document.visibilityState, player._isPlayingBeforePageHidden)\n\n if (\"visible\" === document.visibilityState) {\n if (player._isPlayingBeforePageHidden) {\n player.play();\n }\n } else {\n player._isPlayingBeforePageHidden = player.playing;\n // hidden\n if (player.playing) {\n player.pause();\n }\n }\n }\n })\n\n proxy(window, 'fullscreenchange', () => {\n //\n if (player.keepScreenOn !== null && \"visible\" === document.visibilityState) {\n player.enableWakeLock();\n }\n })\n}\n","class MP4 {\n\n static init() {\n MP4.types = {\n avc1: [],\n avcC: [],\n hvc1: [],\n hvcC: [],\n btrt: [],\n dinf: [],\n dref: [],\n esds: [],\n ftyp: [],\n hdlr: [],\n mdat: [],\n mdhd: [],\n mdia: [],\n mfhd: [],\n minf: [],\n moof: [],\n moov: [],\n mp4a: [],\n mvex: [],\n mvhd: [],\n sdtp: [],\n stbl: [],\n stco: [],\n stsc: [],\n stsd: [],\n stsz: [],\n stts: [],\n tfdt: [],\n tfhd: [],\n traf: [],\n trak: [],\n trun: [],\n trex: [],\n tkhd: [],\n vmhd: [],\n smhd: []\n };\n\n for (let name in MP4.types) {\n if (MP4.types.hasOwnProperty(name)) {\n MP4.types[name] = [\n name.charCodeAt(0),\n name.charCodeAt(1),\n name.charCodeAt(2),\n name.charCodeAt(3)\n ];\n }\n }\n\n let constants = MP4.constants = {};\n\n constants.FTYP = new Uint8Array([\n 0x69, 0x73, 0x6F, 0x6D, // major_brand: isom\n 0x0, 0x0, 0x0, 0x1, // minor_version: 0x01\n 0x69, 0x73, 0x6F, 0x6D, // isom\n 0x61, 0x76, 0x63, 0x31 // avc1\n ]);\n\n constants.STSD_PREFIX = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]);\n\n constants.STTS = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n\n constants.STSC = constants.STCO = constants.STTS;\n\n constants.STSZ = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]);\n\n constants.HDLR_VIDEO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x56, 0x69, 0x64, 0x65,\n 0x6F, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler\n ]);\n\n constants.HDLR_AUDIO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6F, 0x75, 0x6E, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x53, 0x6F, 0x75, 0x6E,\n 0x64, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler\n ]);\n\n constants.DREF = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0C, // entry_size\n 0x75, 0x72, 0x6C, 0x20, // type 'url '\n 0x00, 0x00, 0x00, 0x01 // version(0) + flags\n ]);\n\n // Sound media header\n constants.SMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)\n ]);\n\n // video media header\n constants.VMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x01, // version(0) + flags\n 0x00, 0x00, // graphicsmode: 2 bytes\n 0x00, 0x00, 0x00, 0x00, // opcolor: 3 * 2 bytes\n 0x00, 0x00\n ]);\n }\n\n // Generate a box\n static box(type) {\n let size = 8;\n let result = null;\n let datas = Array.prototype.slice.call(arguments, 1);\n let arrayCount = datas.length;\n\n for (let i = 0; i < arrayCount; i++) {\n size += datas[i].byteLength;\n }\n\n result = new Uint8Array(size);\n result[0] = (size >>> 24) & 0xFF; // size\n result[1] = (size >>> 16) & 0xFF;\n result[2] = (size >>> 8) & 0xFF;\n result[3] = (size) & 0xFF;\n\n result.set(type, 4); // type\n\n let offset = 8;\n for (let i = 0; i < arrayCount; i++) { // data body\n result.set(datas[i], offset);\n offset += datas[i].byteLength;\n }\n\n return result;\n }\n\n // emit ftyp & moov\n static generateInitSegment(meta) {\n let ftyp = MP4.box(MP4.types.ftyp, MP4.constants.FTYP);\n let moov = MP4.moov(meta);\n\n let result = new Uint8Array(ftyp.byteLength + moov.byteLength);\n result.set(ftyp, 0);\n result.set(moov, ftyp.byteLength);\n return result;\n }\n\n // Movie metadata box\n static moov(meta) {\n let mvhd = MP4.mvhd(meta.timescale, meta.duration);\n let trak = MP4.trak(meta);\n let mvex = MP4.mvex(meta);\n return MP4.box(MP4.types.moov, mvhd, trak, mvex);\n }\n\n // Movie header box\n static mvhd(timescale, duration) {\n return MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0\n 0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n 0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----\n 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID\n ]));\n }\n\n // Track box\n static trak(meta) {\n return MP4.box(MP4.types.trak, MP4.tkhd(meta), MP4.mdia(meta));\n }\n\n // Track header box\n static tkhd(meta) {\n let trackId = meta.id, duration = meta.duration;\n let width = meta.presentWidth, height = meta.presentHeight;\n\n return MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x07, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (trackId >>> 24) & 0xFF, // track_ID: 4 bytes\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes)\n 0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes)\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n (width >>> 8) & 0xFF, // width and height\n (width) & 0xFF,\n 0x00, 0x00,\n (height >>> 8) & 0xFF,\n (height) & 0xFF,\n 0x00, 0x00\n ]));\n }\n\n static mdia(meta) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(meta), MP4.hdlr(meta), MP4.minf(meta))\n }\n\n // Media header box\n static mdhd(meta) {\n let timescale = meta.timescale;\n let duration = meta.duration;\n return MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x55, 0xC4, // language: und (undetermined)\n 0x00, 0x00 // pre_defined = 0\n ]));\n }\n\n // Media handler reference box\n static hdlr(meta) {\n let data = null;\n if (meta.type === 'audio') {\n data = MP4.constants.HDLR_AUDIO;\n } else {\n data = MP4.constants.HDLR_VIDEO;\n }\n return MP4.box(MP4.types.hdlr, data);\n }\n\n // Media infomation box\n static minf(meta) {\n let xmhd = null;\n if (meta.type === 'audio') {\n xmhd = MP4.box(MP4.types.smhd, MP4.constants.SMHD);\n } else {\n xmhd = MP4.box(MP4.types.vmhd, MP4.constants.VMHD);\n }\n return MP4.box(MP4.types.minf, xmhd, MP4.dinf(), MP4.stbl(meta));\n }\n\n // Data infomation box\n static dinf() {\n let result = MP4.box(MP4.types.dinf,\n MP4.box(MP4.types.dref, MP4.constants.DREF)\n );\n return result;\n }\n\n // Sample table box\n static stbl(meta) {\n let result = MP4.box(MP4.types.stbl, // type: stbl\n MP4.stsd(meta), // Sample Description Table\n MP4.box(MP4.types.stts, MP4.constants.STTS), // Time-To-Sample\n MP4.box(MP4.types.stsc, MP4.constants.STSC), // Sample-To-Chunk\n MP4.box(MP4.types.stsz, MP4.constants.STSZ), // Sample size\n MP4.box(MP4.types.stco, MP4.constants.STCO) // Chunk offset\n );\n return result;\n }\n\n // Sample description box\n static stsd(meta) {\n if (meta.type === 'audio') {\n // else: aac -> mp4a\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp4a(meta));\n } else {\n if (meta.videoType === 'avc') {\n //\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.avc1(meta));\n } else {\n //\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.hvc1(meta))\n }\n }\n }\n\n static mp4a(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types.mp4a, data, MP4.esds(meta));\n }\n\n static esds(meta) {\n let config = meta.config || [];\n let configSize = config.length;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version 0 + flags\n\n 0x03, // descriptor_type\n 0x17 + configSize, // length3\n 0x00, 0x01, // es_id\n 0x00, // stream_priority\n\n 0x04, // descriptor_type\n 0x0F + configSize, // length\n 0x40, // codec: mpeg4_audio\n 0x15, // stream_type: Audio\n 0x00, 0x00, 0x00, // buffer_size\n 0x00, 0x00, 0x00, 0x00, // maxBitrate\n 0x00, 0x00, 0x00, 0x00, // avgBitrate\n\n 0x05 // descriptor_type\n ].concat([\n configSize\n ]).concat(\n config\n ).concat([\n 0x06, 0x01, 0x02 // GASpecificConfig\n ]));\n return MP4.box(MP4.types.esds, data);\n }\n\n // avc\n static avc1(meta) {\n let avcc = meta.avcc;\n const width = meta.codecWidth;\n const height = meta.codecHeight;\n let data = new Uint8Array([\n 0, 0, 0, 0,\n 0, 0, 0, 1,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n width >>> 8 & 255,\n width & 255,\n height >>> 8 & 255,\n height & 255,\n 0, 72, 0, 0,\n 0, 72, 0, 0,\n 0, 0, 0, 0,\n 0, 1,\n 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0,\n 0, 24,\n 255, 255]\n );\n return MP4.box(MP4.types.avc1, data, MP4.box(MP4.types.avcC, avcc))\n }\n\n // hvc\n static hvc1(meta) {\n let avcc = meta.avcc;\n const width = meta.codecWidth;\n const height = meta.codecHeight;\n let data = new Uint8Array([\n 0, 0, 0, 0,\n 0, 0, 0, 1,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n width >>> 8 & 255,\n width & 255,\n height >>> 8 & 255,\n height & 255,\n 0, 72, 0, 0,\n 0, 72, 0, 0,\n 0, 0, 0, 0,\n 0, 1,\n 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0,\n 0, 24,\n 255, 255\n ]);\n return MP4.box(MP4.types.hvc1, data, MP4.box(MP4.types.hvcC, avcc))\n }\n\n // Movie Extends box\n static mvex(meta) {\n return MP4.box(MP4.types.mvex, MP4.trex(meta))\n }\n\n // Track Extends box\n static trex(meta) {\n let trackId = meta.id;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]);\n return MP4.box(MP4.types.trex, data);\n }\n\n // Movie fragment box\n static moof(track, baseMediaDecodeTime) {\n return MP4.box(MP4.types.moof, MP4.mfhd(track.sequenceNumber), MP4.traf(track, baseMediaDecodeTime))\n }\n //\n static mfhd(sequenceNumber) {\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n (sequenceNumber >>> 24) & 0xFF, // sequence_number: int32\n (sequenceNumber >>> 16) & 0xFF,\n (sequenceNumber >>> 8) & 0xFF,\n (sequenceNumber) & 0xFF\n ]);\n return MP4.box(MP4.types.mfhd, data);\n }\n\n // Track fragment box\n static traf(track, baseMediaDecodeTime) {\n let trackId = track.id;\n\n // Track fragment header box\n let tfhd = MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF\n ]));\n // Track Fragment Decode Time\n let tfdt = MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (baseMediaDecodeTime >>> 24) & 0xFF, // baseMediaDecodeTime: int32\n (baseMediaDecodeTime >>> 16) & 0xFF,\n (baseMediaDecodeTime >>> 8) & 0xFF,\n (baseMediaDecodeTime) & 0xFF\n ]));\n let sdtp = MP4.sdtp(track);\n let trun = MP4.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);\n\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun, sdtp);\n }\n\n // Sample Dependency Type box\n static sdtp(track) {\n let data = new Uint8Array(4 + 1);\n let flags = track.flags;\n data[4] = flags.isLeading << 6\n | flags.dependsOn << 4\n | flags.isDependedOn << 2\n | flags.hasRedundancy;\n return MP4.box(MP4.types.sdtp, data);\n }\n // trun\n static trun(track, offset) {\n let dataSize = 12 + 16;\n let data = new Uint8Array(dataSize);\n offset += 8 + dataSize;\n\n data.set([\n 0x00, 0x00, 0x0F, 0x01, // version(0) & flags\n 0x00, 0x00, 0x00, 0x01, // sample_count\n (offset >>> 24) & 0xFF, // data_offset\n (offset >>> 16) & 0xFF,\n (offset >>> 8) & 0xFF,\n (offset) & 0xFF\n ], 0);\n\n let duration = track.duration;\n let size = track.size;\n let flags = track.flags;\n let cts = track.cts;\n\n data.set([\n (duration >>> 24) & 0xFF, // sample_duration\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n (size >>> 24) & 0xFF, // sample_size\n (size >>> 16) & 0xFF,\n (size >>> 8) & 0xFF,\n (size) & 0xFF,\n (flags.isLeading << 2) | flags.dependsOn, // sample_flags\n (flags.isDependedOn << 6) | (flags.hasRedundancy << 4) | flags.isNonSync,\n 0x00, 0x00, // sample_degradation_priority\n (cts >>> 24) & 0xFF, // sample_composition_time_offset\n (cts >>> 16) & 0xFF,\n (cts >>> 8) & 0xFF,\n (cts) & 0xFF\n ], 12);\n\n return MP4.box(MP4.types.trun, data);\n }\n // mdat\n static mdat(data) {\n return MP4.box(MP4.types.mdat, data)\n }\n}\n\nMP4.init();\n\nexport default MP4;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n// Exponential-Golomb buffer decoder\nclass ExpGolomb {\n\n constructor(uint8array) {\n this.TAG = 'ExpGolomb';\n\n this._buffer = uint8array;\n this._buffer_index = 0;\n this._total_bytes = uint8array.byteLength;\n this._total_bits = uint8array.byteLength * 8;\n this._current_word = 0;\n this._current_word_bits_left = 0;\n }\n\n destroy() {\n this._buffer = null;\n }\n\n _fillCurrentWord() {\n let buffer_bytes_left = this._total_bytes - this._buffer_index;\n if (buffer_bytes_left <= 0) {\n // throw new IllegalStateException('ExpGolomb: _fillCurrentWord() but no bytes available');\n }\n\n let bytes_read = Math.min(4, buffer_bytes_left);\n let word = new Uint8Array(4);\n word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));\n this._current_word = new DataView(word.buffer).getUint32(0, false);\n\n this._buffer_index += bytes_read;\n this._current_word_bits_left = bytes_read * 8;\n }\n\n readBits(bits) {\n if (bits > 32) {\n // throw new InvalidArgumentException('ExpGolomb: readBits() bits exceeded max 32bits!');\n }\n\n if (bits <= this._current_word_bits_left) {\n let result = this._current_word >>> (32 - bits);\n this._current_word <<= bits;\n this._current_word_bits_left -= bits;\n return result;\n }\n\n let result = this._current_word_bits_left ? this._current_word : 0;\n result = result >>> (32 - this._current_word_bits_left);\n let bits_need_left = bits - this._current_word_bits_left;\n\n this._fillCurrentWord();\n let bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);\n\n let result2 = this._current_word >>> (32 - bits_read_next);\n this._current_word <<= bits_read_next;\n this._current_word_bits_left -= bits_read_next;\n\n result = (result << bits_read_next) | result2;\n return result;\n }\n\n readBool() {\n return this.readBits(1) === 1;\n }\n\n readByte() {\n return this.readBits(8);\n }\n\n _skipLeadingZero() {\n let zero_count;\n for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {\n if (0 !== (this._current_word & (0x80000000 >>> zero_count))) {\n this._current_word <<= zero_count;\n this._current_word_bits_left -= zero_count;\n return zero_count;\n }\n }\n this._fillCurrentWord();\n return zero_count + this._skipLeadingZero();\n }\n\n readUEG() { // unsigned exponential golomb\n let leading_zeros = this._skipLeadingZero();\n return this.readBits(leading_zeros + 1) - 1;\n }\n\n readSEG() { // signed exponential golomb\n let value = this.readUEG();\n if (value & 0x01) {\n return (value + 1) >>> 1;\n } else {\n return -1 * (value >>> 1);\n }\n }\n\n}\n\nexport default ExpGolomb;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExpGolomb from './exp-golomb.js';\n\nclass SPSParser {\n\n static _ebsp2rbsp(uint8array) {\n let src = uint8array;\n let src_length = src.byteLength;\n let dst = new Uint8Array(src_length);\n let dst_idx = 0;\n\n for (let i = 0; i < src_length; i++) {\n if (i >= 2) {\n // Unescape: Skip 0x03 after 00 00\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dst_idx] = src[i];\n dst_idx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dst_idx);\n }\n\n // 解析 SPS\n // https://zhuanlan.zhihu.com/p/27896239\n static parseSPS(uint8array) {\n let rbsp = SPSParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n gb.readByte();\n // 标识当前H.264码流的profile。\n // 我们知道,H.264中定义了三种常用的档次profile: 基准档次:baseline profile;主要档次:main profile; 扩展档次:extended profile;\n\n let profile_idc = gb.readByte(); // profile_idc\n gb.readByte(); // constraint_set_flags[5] + reserved_zero[3]\n // 标识当前码流的Level。编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。\n let level_idc = gb.readByte(); // level_idc\n // 表示当前的序列参数集的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。\n gb.readUEG(); // seq_parameter_set_id\n\n let profile_string = SPSParser.getProfileString(profile_idc);\n\n let level_string = SPSParser.getLevelString(level_idc);\n\n let chroma_format_idc = 1;\n let chroma_format = 420;\n let chroma_format_table = [0, 420, 422, 444];\n let bit_depth = 8;\n\n //\n if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 ||\n profile_idc === 244 || profile_idc === 44 || profile_idc === 83 ||\n profile_idc === 86 || profile_idc === 118 || profile_idc === 128 ||\n profile_idc === 138 || profile_idc === 144) {\n //\n chroma_format_idc = gb.readUEG();\n\n if (chroma_format_idc === 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n if (chroma_format_idc <= 3) {\n chroma_format = chroma_format_table[chroma_format_idc];\n }\n\n bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8\n gb.readUEG(); // bit_depth_chroma_minus8\n gb.readBits(1); // qpprime_y_zero_transform_bypass_flag\n if (gb.readBool()) { // seq_scaling_matrix_present_flag\n let scaling_list_count = (chroma_format_idc !== 3) ? 8 : 12;\n for (let i = 0; i < scaling_list_count; i++) {\n if (gb.readBool()) { // seq_scaling_list_present_flag\n if (i < 6) {\n SPSParser._skipScalingList(gb, 16);\n } else {\n SPSParser._skipScalingList(gb, 64);\n }\n }\n }\n }\n }\n // 用于计算MaxFrameNum的值。计算公式为MaxFrameNum = 2^(log2_max_frame_num_minus4 +\n gb.readUEG(); // log2_max_frame_num_minus4\n // 表示解码picture order count(POC)的方法。POC是另一种计量图像序号的方式,与frame_num有着不同的计算方法。该语法元素的取值为0、1或2。\n let pic_order_cnt_type = gb.readUEG();\n if (pic_order_cnt_type === 0) {\n gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4\n } else if (pic_order_cnt_type === 1) {\n gb.readBits(1); // delta_pic_order_always_zero_flag\n gb.readSEG(); // offset_for_non_ref_pic\n gb.readSEG(); // offset_for_top_to_bottom_field\n let num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();\n for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {\n gb.readSEG(); // offset_for_ref_frame\n }\n }\n // 用于表示参考帧的最大数目。\n let ref_frames = gb.readUEG(); // max_num_ref_frames\n // 标识位,说明frame_num中是否允许不连续的值。\n gb.readBits(1); // gaps_in_frame_num_value_allowed_flag\n // 用于计算图像的宽度。单位为宏块个数,因此图像的实际宽度为:\n let pic_width_in_mbs_minus1 = gb.readUEG();\n // 使用PicHeightInMapUnits来度量视频中一帧图像的高度。\n // PicHeightInMapUnits并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。PicHeightInMapUnits的计算方式为:\n let pic_height_in_map_units_minus1 = gb.readUEG();\n // 标识位,说明宏块的编码方式。当该标识位为0时,宏块可能为帧编码或场编码;\n // 该标识位为1时,所有宏块都采用帧编码。根据该标识位取值不同,PicHeightInMapUnits的含义也不同,\n // 为0时表示一场数据按宏块计算的高度,为1时表示一帧数据按宏块计算的高度。\n let frame_mbs_only_flag = gb.readBits(1);\n if (frame_mbs_only_flag === 0) {\n // 标识位,说明是否采用了宏块级的帧场自适应编码。当该标识位为0时,不存在帧编码和场编码之间的切换;当标识位为1时,宏块可能在帧编码和场编码模式之间进行选择。\n gb.readBits(1); // mb_adaptive_frame_field_flag\n }\n // 标识位,用于B_Skip、B_Direct模式运动矢量的推导计算。\n gb.readBits(1); // direct_8x8_inference_flag\n\n let frame_crop_left_offset = 0;\n let frame_crop_right_offset = 0;\n let frame_crop_top_offset = 0;\n let frame_crop_bottom_offset = 0;\n\n let frame_cropping_flag = gb.readBool();\n if (frame_cropping_flag) {\n frame_crop_left_offset = gb.readUEG();\n frame_crop_right_offset = gb.readUEG();\n frame_crop_top_offset = gb.readUEG();\n frame_crop_bottom_offset = gb.readUEG();\n }\n\n let sar_width = 1, sar_height = 1;\n let fps = 0, fps_fixed = true, fps_num = 0, fps_den = 0;\n // 标识位,说明SPS中是否存在VUI信息。\n let vui_parameters_present_flag = gb.readBool();\n if (vui_parameters_present_flag) {\n if (gb.readBool()) { // aspect_ratio_info_present_flag\n let aspect_ratio_idc = gb.readByte();\n let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n\n if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n sar_width = sar_w_table[aspect_ratio_idc - 1];\n sar_height = sar_h_table[aspect_ratio_idc - 1];\n } else if (aspect_ratio_idc === 255) {\n sar_width = gb.readByte() << 8 | gb.readByte();\n sar_height = gb.readByte() << 8 | gb.readByte();\n }\n }\n\n if (gb.readBool()) { // overscan_info_present_flag\n gb.readBool(); // overscan_appropriate_flag\n }\n if (gb.readBool()) { // video_signal_type_present_flag\n gb.readBits(4); // video_format & video_full_range_flag\n if (gb.readBool()) { // colour_description_present_flag\n gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients\n }\n }\n if (gb.readBool()) { // chroma_loc_info_present_flag\n gb.readUEG(); // chroma_sample_loc_type_top_field\n gb.readUEG(); // chroma_sample_loc_type_bottom_field\n }\n if (gb.readBool()) { // timing_info_present_flag\n let num_units_in_tick = gb.readBits(32);\n let time_scale = gb.readBits(32);\n fps_fixed = gb.readBool(); // fixed_frame_rate_flag\n\n fps_num = time_scale;\n fps_den = num_units_in_tick * 2;\n fps = fps_num / fps_den;\n }\n }\n\n let sarScale = 1;\n if (sar_width !== 1 || sar_height !== 1) {\n sarScale = sar_width / sar_height;\n }\n\n let crop_unit_x = 0, crop_unit_y = 0;\n if (chroma_format_idc === 0) {\n crop_unit_x = 1;\n crop_unit_y = 2 - frame_mbs_only_flag;\n } else {\n let sub_wc = (chroma_format_idc === 3) ? 1 : 2;\n let sub_hc = (chroma_format_idc === 1) ? 2 : 1;\n crop_unit_x = sub_wc;\n crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);\n }\n\n let codec_width = (pic_width_in_mbs_minus1 + 1) * 16;\n let codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);\n\n codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;\n codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;\n\n let present_width = Math.ceil(codec_width * sarScale);\n\n gb.destroy();\n gb = null;\n\n\n // 解析出来的SPS 内容。\n return {\n profile_string: profile_string, // baseline, high, high10, ...\n level_string: level_string, // 3, 3.1, 4, 4.1, 5, 5.1, ...\n bit_depth: bit_depth, // 8bit, 10bit, ...\n ref_frames: ref_frames,\n chroma_format: chroma_format, // 4:2:0, 4:2:2, ...\n chroma_format_string: SPSParser.getChromaFormatString(chroma_format),\n\n frame_rate: {\n fixed: fps_fixed,\n fps: fps,\n fps_den: fps_den,\n fps_num: fps_num\n },\n\n sar_ratio: {\n width: sar_width,\n height: sar_height\n },\n\n codec_size: {\n width: codec_width,\n height: codec_height\n },\n\n present_size: {\n width: present_width,\n height: codec_height\n }\n };\n }\n\n static _skipScalingList(gb, count) {\n let last_scale = 8, next_scale = 8;\n let delta_scale = 0;\n for (let i = 0; i < count; i++) {\n if (next_scale !== 0) {\n delta_scale = gb.readSEG();\n next_scale = (last_scale + delta_scale + 256) % 256;\n }\n last_scale = (next_scale === 0) ? last_scale : next_scale;\n }\n }\n\n // profile_idc = 66 → baseline profile;\n // profile_idc = 77 → main profile;\n // profile_idc = 88 → extended profile;\n // 在新版的标准中,还包括了High、High 10、High 4:2:2、High 4:4:4、High 10 Intra、High\n // 4:2:2 Intra、High 4:4:4 Intra、CAVLC 4:4:4 Intra\n static getProfileString(profile_idc) {\n switch (profile_idc) {\n case 66:\n return 'Baseline';\n case 77:\n return 'Main';\n case 88:\n return 'Extended';\n case 100:\n return 'High';\n case 110:\n return 'High10';\n case 122:\n return 'High422';\n case 244:\n return 'High444';\n default:\n return 'Unknown';\n }\n }\n\n static getLevelString(level_idc) {\n return (level_idc / 10).toFixed(1);\n }\n\n static getChromaFormatString(chroma) {\n switch (chroma) {\n case 420:\n return '4:2:0';\n case 422:\n return '4:2:2';\n case 444:\n return '4:4:4';\n default:\n return 'Unknown';\n }\n }\n\n}\n\nexport default SPSParser;","import SPSParser from './h264-sps-parser.js';\n\n//\nexport function parseAVCDecoderConfigurationRecord(arrayBuffer) {\n const meta = {}\n const v = new DataView(arrayBuffer.buffer);\n let version = v.getUint8(0); // configurationVersion\n let avcProfile = v.getUint8(1); // avcProfileIndication\n let profileCompatibility = v.getUint8(2); // profile_compatibil\n let avcLevel = v.getUint8(3); // AVCLevelIndication\n\n if (version !== 1 || avcProfile === 0) {\n // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');\n\n return;\n }\n\n const _naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne\n\n if (_naluLengthSize !== 3 && _naluLengthSize !== 4) { // holy shit!!!\n // this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${_naluLengthSize - 1}`);\n return;\n }\n let spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets\n\n if (spsCount === 0) {\n // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');\n return;\n } else if (spsCount > 1) {\n // Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: SPS Count = ${spsCount}`);\n }\n\n let offset = 6;\n for (let i = 0; i < spsCount; i++) {\n let len = v.getUint16(offset, false); // sequenceParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // Notice: Nalu without startcode header (00 00 00 01)\n let sps = new Uint8Array(arrayBuffer.buffer, offset, len);\n offset += len;\n // flv.js作者选择了自己来解析这个数据结构,也是迫不得已,因为JS环境下没有ffmpeg,解析这个结构主要是为了提取 sps和pps。虽然理论上sps允许有多个,但其实一般就一个。\n // packetTtype 为 1 表示 NALU,NALU= network abstract layer unit,这是H.264的概念,网络抽象层数据单元,其实简单理解就是一帧视频数据。\n // pps的信息没什么用,所以作者只实现了sps的分析器,说明作者下了很大功夫去学习264的标准,其中的Golomb解码还是挺复杂的,能解对不容易,我在PC和手机平台都是用ffmpeg去解析的。\n // SPS里面包括了视频分辨率,帧率,profile level等视频重要信息。\n let config = SPSParser.parseSPS(sps);\n if (i !== 0) {\n // ignore other sps's config\n continue;\n }\n\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n meta.frameRate = config.frame_rate;\n\n if (config.frame_rate.fixed === false ||\n config.frame_rate.fps_num === 0 ||\n config.frame_rate.fps_den === 0) {\n meta.frameRate = {};\n }\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n\n meta.refSampleDuration = meta.timescale * (fps_den / fps_num);\n\n let codecArray = sps.subarray(1, 4);\n\n let codecString = 'avc1.';\n for (let j = 0; j < 3; j++) {\n let h = codecArray[j].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n codecString += h;\n }\n // codec\n meta.codec = codecString;\n }\n\n let ppsCount = v.getUint8(offset); // numOfPictureParameterSets\n if (ppsCount === 0) {\n // this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');\n return;\n } else if (ppsCount > 1) {\n // Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: PPS Count = ${ppsCount}`);\n }\n\n offset++;\n for (let i = 0; i < ppsCount; i++) {\n let len = v.getUint16(offset, false); // pictureParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n let pps = new Uint8Array(arrayBuffer.buffer, offset, len);\n\n // pps is useless for extracting video information\n offset += len;\n }\n\n meta.videoType = 'avc';\n\n // meta.avcc = arrayBuffer;\n return meta;\n}\n","class SPSParser {\n static parseSPS(uint8array) {\n\n }\n}\n\nexport default SPSParser\n","import {H265_NAL_TYPE} from \"../constant\";\nimport SPSParser from \"./h265-sps-parser\";\n\nexport function parseHEVCDecoderConfigurationRecord(arrayBuffer) {\n const meta = {}\n meta.videoType = 'hevc'\n let offset = 28 - 5;\n //\n const vpsTag = arrayBuffer[offset];\n\n if (vpsTag !== H265_NAL_TYPE.vps) {\n return meta;\n }\n\n offset += 2;\n offset += 1;\n const vpsLength = arrayBuffer[offset + 1] | (arrayBuffer[offset] << 8);\n offset += 2;\n const vpsData = arrayBuffer.slice(offset, (offset + vpsLength));\n console.log(Uint8Array.from(vpsData));\n offset += vpsLength;\n\n const spsTag = arrayBuffer[offset]\n if (spsTag !== H265_NAL_TYPE.sps) {\n return meta;\n }\n offset += 2;\n offset += 1;\n const spsLength = arrayBuffer[offset + 1] | (arrayBuffer[offset] << 8);\n\n offset += 2;\n const spsData = arrayBuffer.slice(offset, (offset + spsLength))\n console.log(Uint8Array.from(spsData));\n\n offset += spsLength;\n\n const ppsTag = arrayBuffer[offset];\n\n if (ppsTag !== H265_NAL_TYPE.pps) {\n return meta;\n }\n offset += 2;\n offset += 1;\n const ppsLength = arrayBuffer[offset + 1] | (arrayBuffer[offset] << 8);\n offset += 2;\n const ppsData = arrayBuffer.slice(offset, (offset + ppsLength))\n console.log(Uint8Array.from(ppsData));\n\n let sps = Uint8Array.from(spsData);\n let config = SPSParser.parseSPS(sps);\n\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n\n return meta;\n}\n","import Emitter from \"../utils/emitter\";\nimport {EVENTS, EVENTS_ERROR, FRAG_DURATION, MEDIA_SOURCE_STATE, MP4_CODECS, VIDEO_ENC_CODE} from \"../constant\";\nimport MP4 from \"../remux/fmp4-generator\";\nimport {parseAVCDecoderConfigurationRecord} from \"../utils/h264\";\nimport {parseHEVCDecoderConfigurationRecord} from \"../utils/h265\";\nimport {now} from \"../utils\";\n\nexport default class MseDecoder extends Emitter {\n constructor(player) {\n super();\n this.player = player;\n this.isAvc = true;\n this.mediaSource = new window.MediaSource();\n this.sourceBuffer = null;\n this.hasInit = false;\n this.isInitInfo = false;\n this.cacheTrack = {};\n this.timeInit = false;\n this.sequenceNumber = 0;\n this.mediaSourceOpen = false;\n this.bufferList = [];\n this.dropping = false;\n this.player.video.$videoElement.src = window.URL.createObjectURL(this.mediaSource);\n const {\n debug,\n events: {proxy},\n } = player;\n\n\n proxy(this.mediaSource, 'sourceopen', () => {\n this.mediaSourceOpen = true;\n this.player.emit(EVENTS.mseSourceOpen)\n })\n\n proxy(this.mediaSource, 'sourceclose', () => {\n this.player.emit(EVENTS.mseSourceClose);\n })\n\n player.debug.log('MediaSource', 'init')\n }\n\n destroy() {\n this.stop();\n this.bufferList = [];\n this.mediaSource = null;\n this.mediaSourceOpen = false;\n this.sourceBuffer = null;\n this.hasInit = false;\n this.isInitInfo = false;\n this.sequenceNumber = 0;\n this.cacheTrack = null;\n this.timeInit = false;\n this.off();\n this.player.debug.log('MediaSource', 'destroy')\n }\n\n get state() {\n return this.mediaSource.readyState\n }\n\n get isStateOpen() {\n return this.state === MEDIA_SOURCE_STATE.open;\n }\n\n get isStateClosed() {\n return this.state === MEDIA_SOURCE_STATE.closed;\n }\n\n get isStateEnded() {\n return this.state === MEDIA_SOURCE_STATE.ended;\n }\n\n get duration() {\n return this.mediaSource.duration\n }\n\n set duration(duration) {\n this.mediaSource.duration = duration\n }\n\n decodeVideo(payload, ts, isIframe) {\n const player = this.player;\n\n if (!this.hasInit) {\n if (isIframe && payload[1] === 0) {\n const videoCodec = (payload[0] & 0x0F);\n player.video.updateVideoInfo({\n encTypeCode: videoCodec\n })\n\n // 如果解码出来的是\n if (videoCodec === VIDEO_ENC_CODE.h265) {\n this.emit(EVENTS_ERROR.mediaSourceH265NotSupport)\n return;\n }\n if (!player._times.decodeStart) {\n player._times.decodeStart = now();\n }\n\n this._decodeConfigurationRecord(payload, ts, isIframe, videoCodec)\n this.hasInit = true;\n }\n } else {\n this._decodeVideo(payload, ts, isIframe);\n }\n }\n\n _doDecode() {\n const bufferItem = this.bufferList.shift();\n if (bufferItem) {\n this._decodeVideo(bufferItem.payload, bufferItem.ts, bufferItem.isIframe);\n }\n }\n\n\n _decodeConfigurationRecord(payload, ts, isIframe, videoCodec) {\n let data = payload.slice(5);\n let config = {};\n\n if (videoCodec === VIDEO_ENC_CODE.h264) {\n config = parseAVCDecoderConfigurationRecord(data)\n } else if (videoCodec === VIDEO_ENC_CODE.h265) {\n config = parseHEVCDecoderConfigurationRecord(data);\n }\n const metaData = {\n id: 1, // video tag data\n type: 'video',\n timescale: 1000,\n duration: 0,\n avcc: data,\n codecWidth: config.codecWidth,\n codecHeight: config.codecHeight,\n videoType: config.videoType\n }\n // ftyp\n const metaBox = MP4.generateInitSegment(metaData);\n this.isAvc = true;\n this.appendBuffer(metaBox.buffer);\n this.sequenceNumber = 0;\n this.cacheTrack = null;\n this.timeInit = false;\n }\n\n //\n _decodeVideo(payload, ts, isIframe) {\n const player = this.player;\n let arrayBuffer = payload.slice(5);\n let bytes = arrayBuffer.byteLength;\n let cts = 0;\n let dts = ts;\n // player.debug.log('MediaSource', '_decodeVideo', ts);\n const $video = player.video.$videoElement;\n\n if ($video.buffered.length > 1) {\n this.removeBuffer($video.buffered.start(0), $video.buffered.end(0));\n this.timeInit = false;\n }\n if (this.dropping && dts - this.cacheTrack.dts > 1000) {\n this.dropping = false;\n this.cacheTrack = {};\n } else if (this.cacheTrack && dts > this.cacheTrack.dts) {\n // 需要额外加8个size\n let mdatBytes = 8 + this.cacheTrack.size;\n let mdatbox = new Uint8Array(mdatBytes);\n mdatbox[0] = mdatBytes >>> 24 & 255;\n mdatbox[1] = mdatBytes >>> 16 & 255;\n mdatbox[2] = mdatBytes >>> 8 & 255;\n mdatbox[3] = mdatBytes & 255;\n mdatbox.set(MP4.types.mdat, 4);\n mdatbox.set(this.cacheTrack.data, 8);\n\n this.cacheTrack.duration = dts - this.cacheTrack.dts;\n // moof\n let moofbox = MP4.moof(this.cacheTrack, this.cacheTrack.dts);\n let result = new Uint8Array(moofbox.byteLength + mdatbox.byteLength);\n result.set(moofbox, 0);\n result.set(mdatbox, moofbox.byteLength);\n // appendBuffer\n this.appendBuffer(result.buffer)\n player.handleRender();\n player.updateStats({fps: true, ts: ts, buf: player.demux.delay})\n if (!player._times.videoStart) {\n player._times.videoStart = now();\n player.handlePlayToRenderTimes()\n }\n } else {\n player.debug.log('MediaSource', 'timeInit set false , cacheTrack = {}');\n this.timeInit = false;\n this.cacheTrack = {};\n }\n\n this.cacheTrack.id = 1;\n this.cacheTrack.sequenceNumber = ++this.sequenceNumber;\n this.cacheTrack.size = bytes;\n this.cacheTrack.dts = dts;\n this.cacheTrack.cts = cts;\n this.cacheTrack.isKeyframe = isIframe;\n this.cacheTrack.data = arrayBuffer;\n //\n this.cacheTrack.flags = {\n isLeading: 0,\n dependsOn: isIframe ? 2 : 1,\n isDependedOn: isIframe ? 1 : 0,\n hasRedundancy: 0,\n isNonSync: isIframe ? 0 : 1\n }\n\n //\n if (!this.timeInit && $video.buffered.length === 1) {\n player.debug.log('MediaSource', 'timeInit set true');\n this.timeInit = true;\n $video.currentTime = $video.buffered.end(0);\n }\n\n if (!this.isInitInfo && $video.videoWidth > 0 && $video.videoHeight > 0) {\n player.debug.log('MediaSource', `updateVideoInfo: ${$video.videoWidth},${$video.videoHeight}`);\n player.video.updateVideoInfo({\n width: $video.videoWidth,\n height: $video.videoHeight\n })\n player.video.initCanvasViewSize();\n this.isInitInfo = true;\n }\n }\n\n appendBuffer(buffer) {\n const {\n debug,\n events: {proxy},\n } = this.player;\n\n if (this.sourceBuffer === null) {\n this.sourceBuffer = this.mediaSource.addSourceBuffer(MP4_CODECS.avc);\n proxy(this.sourceBuffer, 'error', (error) => {\n this.player.emit(EVENTS.mseSourceBufferError, error);\n // this.dropSourceBuffer(false)\n })\n }\n\n if (this.sourceBuffer.updating === false && this.isStateOpen) {\n this.sourceBuffer.appendBuffer(buffer);\n return;\n }\n\n if (this.isStateClosed) {\n this.player.emit(EVENTS.mseSourceBufferError, 'mediaSource is not attached to video or mediaSource is closed')\n } else if (this.isStateEnded) {\n this.player.emit(EVENTS.mseSourceBufferError, 'mediaSource is closed')\n } else {\n if (this.sourceBuffer.updating === true) {\n this.player.emit(EVENTS.mseSourceBufferBusy);\n // this.dropSourceBuffer(false);\n }\n }\n }\n\n stop() {\n if (this.isStateOpen) {\n if (this.sourceBuffer) {\n this.sourceBuffer.abort();\n }\n }\n this.endOfStream();\n }\n\n dropSourceBuffer(flag) {\n const video = this.player.video;\n const $video = video.$videoElement;\n this.dropping = flag;\n if ($video.buffered.length > 0) {\n if ($video.buffered.end(0) - $video.currentTime > 1) {\n $video.currentTime = $video.buffered.end(0);\n }\n }\n }\n\n\n removeBuffer(start, end) {\n\n if (this.isStateOpen && this.sourceBuffer.updating === false) {\n try {\n this.sourceBuffer.remove(start, end)\n } catch (e) {\n console.error(e)\n }\n }\n }\n\n endOfStream() {\n if (this.isStateOpen) {\n this.mediaSource.endOfStream();\n }\n }\n}\n","// tks: https://github.com/richtr/NoSleep.js\n\nconst WEBM = \"data:video/webm;base64,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\";\nconst MP4 = \"data:video/mp4;base64,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\";\n\n\n// Detect iOS browsers < version 10\nconst\n oldIOS = () =>\n typeof navigator !== \"undefined\" &&\n parseFloat(\n (\n \"\" +\n (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(\n navigator.userAgent\n ) || [0, \"\"])[1]\n )\n .replace(\"undefined\", \"3_2\")\n .replace(\"_\", \".\")\n .replace(\"_\", \"\")\n ) < 10 &&\n !window.MSStream;\n\n// Detect native Wake Lock API support\nconst nativeWakeLock = () => \"wakeLock\" in navigator;\n\nexport default class NoSleep {\n constructor(player) {\n this.player = player;\n this.enabled = false;\n if (nativeWakeLock()) {\n this._wakeLock = null;\n const handleVisibilityChange = () => {\n if (this._wakeLock !== null && document.visibilityState === \"visible\") {\n this.enable();\n }\n };\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n document.addEventListener(\"fullscreenchange\", handleVisibilityChange);\n } else if (oldIOS()) {\n this.noSleepTimer = null;\n } else {\n // Set up no sleep video element\n this.noSleepVideo = document.createElement(\"video\");\n\n this.noSleepVideo.setAttribute(\"title\", \"No Sleep\");\n this.noSleepVideo.setAttribute(\"playsinline\", \"\");\n\n this._addSourceToVideo(this.noSleepVideo, \"webm\", WEBM);\n this._addSourceToVideo(this.noSleepVideo, \"mp4\", MP4);\n\n this.noSleepVideo.addEventListener(\"loadedmetadata\", () => {\n if (this.noSleepVideo.duration <= 1) {\n // webm source\n this.noSleepVideo.setAttribute(\"loop\", \"\");\n } else {\n // mp4 source\n this.noSleepVideo.addEventListener(\"timeupdate\", () => {\n if (this.noSleepVideo.currentTime > 0.5) {\n this.noSleepVideo.currentTime = Math.random();\n }\n });\n }\n });\n }\n }\n\n _addSourceToVideo(element, type, dataURI) {\n var source = document.createElement(\"source\");\n source.src = dataURI;\n source.type = `video/${type}`;\n element.appendChild(source);\n }\n\n get isEnabled() {\n return this.enabled;\n }\n\n enable() {\n const debug = this.player.debug;\n if (nativeWakeLock()) {\n return navigator.wakeLock\n .request(\"screen\")\n .then((wakeLock) => {\n this._wakeLock = wakeLock;\n this.enabled = true;\n debug.log('wakeLock', 'Wake Lock active.')\n this._wakeLock.addEventListener(\"release\", () => {\n // ToDo: Potentially emit an event for the page to observe since\n // Wake Lock releases happen when page visibility changes.\n // (https://web.dev/wakelock/#wake-lock-lifecycle)\n debug.log('wakeLock', 'Wake Lock released.')\n });\n })\n .catch((err) => {\n this.enabled = false;\n debug.error('wakeLock', `${err.name}, ${err.message}`)\n throw err;\n });\n } else if (oldIOS()) {\n this.disable();\n this.noSleepTimer = window.setInterval(() => {\n if (!document.hidden) {\n window.location.href = window.location.href.split(\"#\")[0];\n window.setTimeout(window.stop, 0);\n }\n }, 15000);\n this.enabled = true;\n return Promise.resolve();\n } else {\n let playPromise = this.noSleepVideo.play();\n return playPromise\n .then((res) => {\n this.enabled = true;\n return res;\n })\n .catch((err) => {\n this.enabled = false;\n throw err;\n });\n }\n }\n\n disable() {\n const debug = this.player.debug;\n if (nativeWakeLock()) {\n if (this._wakeLock) {\n this._wakeLock.release();\n }\n this._wakeLock = null;\n } else if (oldIOS()) {\n if (this.noSleepTimer) {\n debug.warn('wakeLock', 'NoSleep now disabled for older iOS devices.')\n\n window.clearInterval(this.noSleepTimer);\n this.noSleepTimer = null;\n }\n } else {\n this.noSleepVideo.pause();\n }\n this.enabled = false;\n }\n}\n","import {DEFAULT_PLAYER_OPTIONS, EVENTS, EVENTS_ERROR, JESSIBUCA_EVENTS} from \"../constant\";\nimport Debug from \"../utils/debug\";\nimport Events from \"../utils/events\";\nimport property from './property';\nimport events from './events';\nimport {\n fpsStatus,\n initPlayTimes,\n isEmpty,\n isFullScreen, isMobile,\n isNotEmpty,\n now,\n supportMSE,\n supportOffscreenV2,\n supportWCS\n} from \"../utils\";\nimport Video from \"../video\";\nimport Audio from \"../audio\";\nimport Stream from \"../stream\";\nimport Recorder from \"../recorder\";\nimport DecoderWorker from \"../worker/index\";\nimport Emitter from \"../utils/emitter\";\nimport Demux from \"../demux\";\nimport WebcodecsDecoder from \"../decoder/webcodecs\";\nimport Control from \"../control\";\nimport './style.scss'\nimport observer from \"./observer\";\nimport MseDecoder from \"../decoder/mediaSource\";\nimport NoSleep from \"../utils/noSleep\";\n\nexport default class Player extends Emitter {\n constructor(container, options) {\n super()\n this.$container = container;\n this._opt = Object.assign({}, DEFAULT_PLAYER_OPTIONS, options)\n this.debug = new Debug(this);\n\n\n if (this._opt.useWCS) {\n this._opt.useWCS = supportWCS();\n }\n\n if (this._opt.useMSE) {\n this._opt.useMSE = supportMSE();\n }\n\n // 如果使用mse则强制不允许 webcodecs\n if (this._opt.useMSE) {\n if (this._opt.useWCS) {\n this.debug.log('Player', 'useWCS set true->false')\n }\n\n if (!this._opt.forceNoOffscreen) {\n this.debug.log('Player', 'forceNoOffscreen set false->true')\n }\n\n this._opt.useWCS = false;\n this._opt.forceNoOffscreen = true;\n } else if (this._opt.useWCS) {\n\n }\n\n\n if (!this._opt.forceNoOffscreen) {\n if (!supportOffscreenV2()) {\n this._opt.forceNoOffscreen = true;\n this._opt.useOffscreen = false;\n } else {\n this._opt.useOffscreen = true;\n }\n }\n\n if (!this._opt.hasAudio) {\n this._opt.operateBtns.audio = false\n }\n\n this._opt.hasControl = this._hasControl();\n //\n this._loading = false;\n this._playing = false;\n this._hasLoaded = false;\n\n //\n this._checkHeartTimeout = null;\n this._checkLoadingTimeout = null;\n\n //\n this._startBpsTime = null;\n this._isPlayingBeforePageHidden = false;\n this._stats = {\n buf: 0, // 当前缓冲区时长,单位毫秒,\n fps: 0, // 当前视频帧率\n abps: 0, // 当前音频码率,单位bit\n vbps: 0, // 当前视频码率,单位bit\n ts: 0 // 当前视频帧pts,单位毫秒\n }\n\n // 各个步骤的时间统计\n this._times = initPlayTimes();\n\n //\n this._videoTimestamp = 0;\n this._audioTimestamp = 0;\n\n property(this);\n\n this.events = new Events(this);\n this.video = new Video(this);\n\n if (this._opt.hasAudio) {\n this.audio = new Audio(this);\n }\n this.recorder = new Recorder(this);\n\n if (!this._onlyMseOrWcsVideo()) {\n this.decoderWorker = new DecoderWorker(this);\n } else {\n this.loaded = true;\n }\n\n this.stream = null;\n this.demux = null;\n\n if (this._opt.useWCS) {\n this.webcodecsDecoder = new WebcodecsDecoder(this)\n }\n\n if (this._opt.useMSE) {\n this.mseDecoder = new MseDecoder(this);\n }\n\n //\n this.control = new Control(this);\n\n this.keepScreenOn = new NoSleep(this);\n\n\n events(this);\n observer(this);\n\n\n if (this._opt.useWCS) {\n this.debug.log('Player', 'use WCS')\n }\n\n if (this._opt.useMSE) {\n this.debug.log('Player', 'use MSE')\n }\n\n if (this._opt.useOffscreen) {\n this.debug.log('Player', 'use offscreen')\n }\n\n this.debug.log('Player options', this._opt);\n }\n\n\n destroy() {\n this._loading = false;\n this._playing = false;\n this._hasLoaded = false;\n\n this._times = initPlayTimes();\n\n if (this.decoderWorker) {\n this.decoderWorker.destroy();\n this.decoderWorker = null;\n }\n if (this.video) {\n this.video.destroy();\n this.video = null;\n }\n\n if (this.audio) {\n this.audio.destroy();\n this.audio = null;\n }\n\n if (this.stream) {\n this.stream.destroy();\n this.stream = null;\n }\n\n if (this.recorder) {\n this.recorder.destroy();\n this.recorder = null;\n }\n\n if (this.control) {\n this.control.destroy();\n this.control = null;\n }\n\n if (this.webcodecsDecoder) {\n this.webcodecsDecoder.destroy();\n this.webcodecsDecoder = null;\n }\n\n if (this.mseDecoder) {\n this.mseDecoder.destroy();\n this.mseDecoder = null;\n }\n\n if (this.demux) {\n this.demux.destroy();\n this.demux = null;\n }\n\n\n if (this.events) {\n this.events.destroy();\n this.events = null;\n }\n\n this.clearCheckHeartTimeout();\n this.clearCheckLoadingTimeout();\n //\n this.releaseWakeLock();\n this.keepScreenOn = null;\n // reset stats\n this.resetStats();\n this._audioTimestamp = 0;\n this._videoTimestamp = 0;\n\n // 其他没法解耦的,通过 destroy 方式\n this.emit('destroy');\n // 接触所有绑定事件\n this.off();\n\n this.debug.log('play', 'destroy end');\n }\n\n set fullscreen(value) {\n if (isMobile()) {\n this.emit(EVENTS.webFullscreen, value);\n setTimeout(() => {\n this.updateOption({\n rotate: value ? 270 : 0,\n })\n this.resize();\n }, 10)\n } else {\n this.emit(EVENTS.fullscreen, value);\n }\n }\n\n get fullscreen() {\n return isFullScreen() || this.webFullscreen;\n }\n\n set webFullscreen(value) {\n this.emit(EVENTS.webFullscreen, value);\n }\n\n get webFullscreen() {\n return this.$container.classList.contains('jessibuca-fullscreen-web')\n }\n\n set loaded(value) {\n this._hasLoaded = value;\n }\n\n get loaded() {\n return this._hasLoaded;\n }\n\n //\n set playing(value) {\n\n if (value) {\n // 将loading 设置为 false\n this.loading = false;\n }\n\n if (this.playing !== value) {\n this._playing = value;\n this.emit(EVENTS.playing, value);\n this.emit(EVENTS.volumechange, this.volume);\n\n if (value) {\n this.emit(EVENTS.play);\n } else {\n this.emit(EVENTS.pause);\n }\n }\n\n }\n\n get playing() {\n return this._playing;\n }\n\n get volume() {\n return (this.audio && this.audio.volume) || 0;\n }\n\n set volume(value) {\n this.audio && this.audio.setVolume(value);\n }\n\n set loading(value) {\n if (this.loading !== value) {\n this._loading = value;\n this.emit(EVENTS.loading, this._loading);\n }\n }\n\n get loading() {\n return this._loading;\n }\n\n set recording(value) {\n if (value) {\n if (this.playing) {\n this.recorder.startRecord();\n }\n } else {\n this.recorder.stopRecordAndSave();\n }\n }\n\n get recording() {\n return this.recorder && this.recorder.recording;\n }\n\n set audioTimestamp(value) {\n if (value === null) {\n return;\n }\n this._audioTimestamp = value;\n }\n\n //\n get audioTimestamp() {\n return this._audioTimestamp;\n }\n\n //\n set videoTimestamp(value) {\n if (value === null) {\n return;\n }\n this._videoTimestamp = value;\n // just for wasm\n if (!this._opt.useWCS && !this._opt.useMSE) {\n if (this.audioTimestamp && this.videoTimestamp) {\n this.audio && this.audio.emit(EVENTS.videoSyncAudio, {\n audioTimestamp: this.audioTimestamp,\n videoTimestamp: this.videoTimestamp,\n diff: this.audioTimestamp - this.videoTimestamp\n })\n }\n }\n }\n\n //\n get videoTimestamp() {\n return this._videoTimestamp;\n }\n\n\n /**\n *\n * @param options\n */\n updateOption(options) {\n this._opt = Object.assign({}, this._opt, options)\n }\n\n /**\n *\n * @returns {Promise}\n */\n init() {\n return new Promise((resolve, reject) => {\n if (!this.stream) {\n this.stream = new Stream(this);\n }\n\n if (!this.demux) {\n this.demux = new Demux(this);\n }\n\n if (this._opt.useWCS) {\n if (!this.webcodecsDecoder) {\n this.webcodecsDecoder = new WebcodecsDecoder(this)\n }\n }\n\n if (this._opt.useMSE) {\n if (!this.mseDecoder) {\n this.mseDecoder = new MseDecoder(this);\n }\n }\n\n if (!this.decoderWorker && !this._onlyMseOrWcsVideo()) {\n this.decoderWorker = new DecoderWorker(this);\n\n this.once(EVENTS.decoderWorkerInit, () => {\n resolve()\n })\n } else {\n resolve()\n }\n\n })\n }\n\n\n /**\n *\n * @param url\n * @returns {Promise}\n */\n play(url) {\n return new Promise((resolve, reject) => {\n if (!url && !this._opt.url) {\n return reject();\n }\n\n this.loading = true;\n this.playing = false;\n this._times.playInitStart = now();\n if (!url) {\n url = this._opt.url;\n }\n this._opt.url = url;\n\n this.clearCheckHeartTimeout();\n\n this.init().then(() => {\n this._times.playStart = now();\n //\n if (this._opt.isNotMute) {\n this.mute(false);\n }\n\n\n if (this.webcodecsDecoder) {\n this.webcodecsDecoder.once(EVENTS_ERROR.webcodecsH265NotSupport, () => {\n this.emit(EVENTS_ERROR.webcodecsH265NotSupport)\n if (!this._opt.autoWasm) {\n this.emit(EVENTS.error, EVENTS_ERROR.webcodecsH265NotSupport);\n }\n })\n }\n\n if (this.mseDecoder) {\n this.mseDecoder.once(EVENTS_ERROR.mediaSourceH265NotSupport, () => {\n this.emit(EVENTS_ERROR.mediaSourceH265NotSupport)\n if (!this._opt.autoWasm) {\n this.emit(EVENTS.error, EVENTS_ERROR.mediaSourceH265NotSupport);\n }\n })\n }\n\n this.enableWakeLock();\n\n this.stream.fetchStream(url);\n\n //\n this.checkLoadingTimeout();\n // fetch error\n this.stream.once(EVENTS_ERROR.fetchError, (error) => {\n reject(error)\n })\n\n // ws\n this.stream.once(EVENTS_ERROR.websocketError, (error) => {\n reject(error)\n })\n\n // success\n this.stream.once(EVENTS.streamSuccess, () => {\n resolve();\n this._times.streamResponse = now();\n //\n this.video.play();\n })\n\n }).catch((e) => {\n reject(e)\n })\n })\n }\n\n /**\n *\n */\n close() {\n return new Promise((resolve, reject) => {\n this._close().then(() => {\n this.video.clearView();\n resolve()\n })\n })\n }\n\n _close() {\n return new Promise((resolve, reject) => {\n //\n if (this.stream) {\n this.stream.destroy();\n this.stream = null;\n }\n\n if (this.demux) {\n this.demux.destroy();\n this.demux = null;\n }\n\n //\n if (this.decoderWorker) {\n this.decoderWorker.destroy();\n this.decoderWorker = null;\n }\n\n if (this.webcodecsDecoder) {\n this.webcodecsDecoder.destroy();\n this.webcodecsDecoder = null;\n }\n\n if (this.mseDecoder) {\n this.mseDecoder.destroy();\n this.mseDecoder = null;\n }\n\n this.clearCheckHeartTimeout();\n this.clearCheckLoadingTimeout();\n this.playing = false;\n this.loading = false;\n this.recording = false;\n // release audio buffer\n this.audio && this.audio.pause();\n this.video && this.video.pause();\n // release lock\n this.releaseWakeLock();\n // reset stats\n this.resetStats();\n //\n this._audioTimestamp = 0;\n this._videoTimestamp = 0;\n //\n this._times = initPlayTimes();\n //\n setTimeout(() => {\n resolve()\n }, 0)\n })\n }\n\n /**\n *\n * @param flag {boolean} 是否清除画面\n * @returns {Promise}\n */\n pause(flag) {\n if (flag) {\n return this.close();\n } else {\n return this._close();\n }\n }\n\n /**\n *\n * @param flag\n */\n mute(flag) {\n this.audio && this.audio.mute(flag)\n }\n\n /**\n *\n */\n resize() {\n this.video.resize();\n }\n\n /**\n *\n * @param fileName\n * @param fileType\n */\n startRecord(fileName, fileType) {\n if (this.recording) {\n return;\n }\n\n this.recorder.setFileName(fileName, fileType);\n this.recording = true;\n }\n\n /**\n *\n */\n stopRecordAndSave() {\n if (this.recording) {\n this.recording = false;\n }\n }\n\n _hasControl() {\n let result = false;\n\n let hasBtnShow = false;\n Object.keys(this._opt.operateBtns).forEach((key) => {\n if (this._opt.operateBtns[key]) {\n hasBtnShow = true;\n }\n });\n\n if (this._opt.showBandwidth || this._opt.text || hasBtnShow) {\n result = true;\n }\n\n return result;\n }\n\n _onlyMseOrWcsVideo() {\n return this._opt.hasAudio === false && (this._opt.useMSE || (this._opt.useWCS && !this._opt.useOffscreen))\n }\n\n checkHeart() {\n this.clearCheckHeartTimeout();\n this.checkHeartTimeout();\n }\n\n // 心跳检查,如果渲染间隔暂停了多少时间之后,就会抛出异常\n checkHeartTimeout() {\n this._checkHeartTimeout = setTimeout(() => {\n this.pause(false).then(() => {\n this.emit(EVENTS.timeout, EVENTS.delayTimeout);\n this.emit(EVENTS.delayTimeout);\n });\n }, this._opt.heartTimeout * 1000)\n }\n\n //\n clearCheckHeartTimeout() {\n if (this._checkHeartTimeout) {\n clearTimeout(this._checkHeartTimeout);\n this._checkHeartTimeout = null;\n }\n }\n\n // loading 等待时间\n checkLoadingTimeout() {\n this._checkLoadingTimeout = setTimeout(() => {\n this.pause(false).then(() => {\n this.emit(EVENTS.timeout, EVENTS.loadingTimeout);\n this.emit(EVENTS.loadingTimeout);\n });\n }, this._opt.loadingTimeout * 1000)\n }\n\n clearCheckLoadingTimeout() {\n if (this._checkLoadingTimeout) {\n clearTimeout(this._checkLoadingTimeout);\n this._checkLoadingTimeout = null;\n }\n }\n\n handleRender() {\n if (this.loading) {\n this.emit(EVENTS.start);\n this.loading = false;\n this.clearCheckLoadingTimeout();\n }\n if (!this.playing) {\n this.playing = true;\n }\n this.checkHeart();\n }\n\n\n //\n updateStats(options) {\n options = options || {};\n\n if (!this._startBpsTime) {\n this._startBpsTime = now();\n }\n\n if (isNotEmpty(options.ts)) {\n this._stats.ts = options.ts;\n }\n\n if (isNotEmpty(options.buf)) {\n this._stats.buf = options.buf;\n }\n\n if (options.fps) {\n this._stats.fps += 1;\n }\n if (options.abps) {\n this._stats.abps += options.abps;\n }\n if (options.vbps) {\n this._stats.vbps += options.vbps;\n }\n\n const _nowTime = now();\n const timestamp = _nowTime - this._startBpsTime;\n\n if (timestamp < 1 * 1000) {\n return;\n }\n\n this.emit(EVENTS.stats, this._stats);\n this.emit(EVENTS.performance, fpsStatus(this._stats.fps));\n this._stats.fps = 0;\n this._stats.abps = 0;\n this._stats.vbps = 0;\n this._startBpsTime = _nowTime;\n }\n\n resetStats() {\n this._startBpsTime = null;\n this._stats = {\n buf: 0, //ms\n fps: 0,\n abps: 0,\n vbps: 0,\n ts: 0\n }\n }\n\n enableWakeLock() {\n if (this._opt.keepScreenOn) {\n this.keepScreenOn.enable();\n }\n }\n\n releaseWakeLock() {\n if (this._opt.keepScreenOn) {\n this.keepScreenOn.disable();\n }\n }\n\n handlePlayToRenderTimes() {\n const _times = this._times;\n _times.playTimestamp = _times.playStart - _times.playInitStart;\n _times.streamTimestamp = _times.streamStart - _times.playStart;\n _times.streamResponseTimestamp = _times.streamResponse - _times.streamStart;\n _times.demuxTimestamp = _times.demuxStart - _times.streamResponse;\n _times.decodeTimestamp = _times.decodeStart - _times.demuxStart;\n _times.videoTimestamp = _times.videoStart - _times.decodeStart;\n _times.allTimestamp = _times.videoStart - _times.playInitStart;\n this.emit(EVENTS.playToRenderTimes, _times);\n }\n}\n","import Player from './player';\nimport Events from \"./utils/events\";\nimport {DEMUX_TYPE, EVENTS, EVENTS_ERROR, JESSIBUCA_EVENTS, PLAYER_PLAY_PROTOCOL, SCALE_MODE_TYPE} from \"./constant\";\nimport {isEmpty, isNotEmpty, supportWCS, uuid16} from \"./utils\";\nimport Emitter from \"./utils/emitter\";\n\n\nclass Jessibuca extends Emitter {\n static ERROR = EVENTS_ERROR\n\n static TIMEOUT = {\n loadingTimeout: EVENTS.loadingTimeout,\n delayTimeout: EVENTS.delayTimeout,\n }\n\n constructor(options) {\n super()\n let _opt = options;\n let $container = options.container;\n if (typeof options.container === 'string') {\n $container = document.querySelector(options.container);\n }\n if (!$container) {\n throw new Error('Jessibuca need container option');\n return;\n }\n\n $container.classList.add('jessibuca-container');\n\n delete _opt.container;\n\n // s -> ms\n if (isNotEmpty(_opt.videoBuffer)) {\n _opt.videoBuffer = Number(_opt.videoBuffer) * 1000\n }\n\n // setting\n if (isNotEmpty(_opt.timeout)) {\n if (isEmpty(_opt.loadingTimeout)) {\n _opt.loadingTimeout = _opt.timeout;\n }\n\n if (isEmpty(_opt.heartTimeout)) {\n _opt.heartTimeout = _opt.timeout\n }\n }\n\n this._opt = _opt;\n this.$container = $container;\n this._loadingTimeoutReplayTimes = 0;\n this._heartTimeoutReplayTimes = 0;\n this.events = new Events(this);\n this._initPlayer($container, _opt);\n }\n\n /**\n *\n */\n destroy() {\n if (this.events) {\n this.events.destroy();\n this.events = null;\n }\n\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n this.$container = null;\n this._opt = null;\n this._loadingTimeoutReplayTimes = 0;\n this._heartTimeoutReplayTimes = 0;\n this.off();\n }\n\n _initPlayer($container, options) {\n this.player = new Player($container, options);\n this._bindEvents();\n }\n\n _resetPlayer(options = {}) {\n this.player.destroy();\n this.player = null;\n const _options = Object.assign(this._opt, options);\n this._initPlayer(this.$container, _options);\n }\n\n _bindEvents() {\n // 对外的事件\n Object.keys(JESSIBUCA_EVENTS).forEach((key) => {\n this.player.on(JESSIBUCA_EVENTS[key], (value) => {\n this.emit(key, value)\n })\n })\n }\n\n /**\n * 是否开启控制台调试打印\n * @param value {Boolean}\n */\n setDebug(value) {\n this.player.updateOption({\n isDebug: !!value\n })\n }\n\n /**\n *\n */\n mute() {\n this.player.mute(true);\n }\n\n /**\n *\n */\n cancelMute() {\n this.player.mute(false);\n }\n\n /**\n *\n * @param value {number}\n */\n setVolume(value) {\n this.player.volume = value;\n }\n\n /**\n *\n */\n audioResume() {\n this.player.audio && this.player.audio.audioEnabled(true);\n }\n\n /**\n * 设置超时时长, 单位秒 在连接成功之前和播放中途,如果超过设定时长无数据返回,则回调timeout事件\n * @param value {number}\n */\n setTimeout(time) {\n time = Number(time);\n this.player.updateOption({\n timeout: time,\n loadingTimeout: time,\n heartTimeout: time\n })\n }\n\n /**\n *\n * @param type {number}: 0,1,2\n */\n setScaleMode(type) {\n type = Number(type);\n let options = {\n isFullResize: false,\n isResize: false\n }\n switch (type) {\n case SCALE_MODE_TYPE.full:\n options.isFullResize = false;\n options.isResize = false;\n break;\n case SCALE_MODE_TYPE.auto:\n options.isFullResize = false;\n options.isResize = true;\n break;\n case SCALE_MODE_TYPE.fullAuto:\n options.isFullResize = true;\n options.isResize = true;\n break;\n }\n\n this.player.updateOption(options);\n this.resize();\n }\n\n /**\n *\n * @returns {Promise}\n */\n pause() {\n return this.player.pause();\n }\n\n /**\n *\n */\n close() {\n // clear url\n this._opt.url = '';\n return this.player.close();\n }\n\n\n /**\n *\n */\n clearView() {\n this.player.video.clearView()\n }\n\n /**\n *\n * @param url {string}\n * @returns {Promise}\n */\n play(url) {\n return new Promise((resolve, reject) => {\n if (!url && !this._opt.url) {\n this.emit(EVENTS.error, EVENTS_ERROR.playError)\n reject();\n return;\n }\n\n if (url) {\n // url 相等的时候。\n if (this._opt.url) {\n // 存在相同的 url\n if (url === this._opt.url) {\n // 正在播放\n if (this.player.playing) {\n resolve();\n } else {\n // pause -> play\n this.clearView();\n this.player.play(this._opt.url).then(() => {\n resolve();\n }).catch(() => {\n this.player.pause().then(() => {\n reject();\n })\n })\n }\n } else {\n // url 发生改变了\n this.player.pause().then(() => {\n // 清除 画面\n this.clearView();\n return this._play(url);\n }).catch(() => {\n reject();\n })\n }\n } else {\n return this._play(url);\n }\n } else {\n // url 不存在的时候\n // 就是从 play -> pause -> play\n this.player.play(this._opt.url).then(() => {\n resolve();\n }).catch(() => {\n this.player.pause().then(() => {\n reject();\n })\n })\n }\n })\n }\n\n /**\n *\n * @param url {string}\n * @returns {Promise}\n * @private\n */\n _play(url) {\n return new Promise((resolve, reject) => {\n this._opt.url = url;\n // 新的url\n const isHttp = url.indexOf(\"http\") === 0;\n //\n const protocol = isHttp ? PLAYER_PLAY_PROTOCOL.fetch : PLAYER_PLAY_PROTOCOL.websocket\n //\n const demuxType = (isHttp || url.indexOf(\".flv\") !== -1 || this._opt.isFlv) ? DEMUX_TYPE.flv : DEMUX_TYPE.m7s;\n\n this.player.updateOption({\n protocol,\n demuxType\n })\n\n this.player.once(EVENTS_ERROR.mediaSourceH265NotSupport, () => {\n this.close().then(() => {\n if (this.player._opt.autoWasm) {\n this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play')\n this._resetPlayer({useMSE: false})\n this.play(url).then(() => {\n // resolve();\n this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play success')\n }).catch(() => {\n // reject();\n this.player.debug.log('Jessibuca', 'auto wasm [mse-> wasm] reset player and play error')\n });\n }\n });\n })\n\n this.player.once(EVENTS_ERROR.webcodecsH265NotSupport, () => {\n this.close().then(() => {\n if (this.player._opt.autoWasm) {\n this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play')\n this._resetPlayer({useWCS: false})\n this.play(url).then(() => {\n // resolve();\n this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play success')\n }).catch(() => {\n // reject();\n this.player.debug.log('Jessibuca', 'auto wasm [wcs-> wasm] reset player and play error')\n });\n }\n });\n })\n\n // 解码报错。\n this.player.once(EVENTS_ERROR.wasmDecodeError, () => {\n if (this.player._opt.wasmDecodeErrorReplay) {\n this.close().then(() => {\n this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play')\n this._resetPlayer({useWCS: false})\n this.play(url).then(() => {\n // resolve();\n this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play success')\n }).catch(() => {\n // reject();\n this.player.debug.log('Jessibuca', 'wasm decode error and reset player and play error')\n });\n })\n }\n })\n\n // 监听 delay timeout\n this.player.once(EVENTS.delayTimeout, () => {\n if (this.player._opt.heartTimeoutReplay && this._heartTimeoutReplayTimes < this.player._opt.heartTimeoutReplayTimes) {\n this._heartTimeoutReplayTimes += 1;\n this.play(url).then(() => {\n // resolve();\n this._heartTimeoutReplayTimes = 0;\n }).catch(() => {\n // reject();\n });\n }\n })\n\n // 监听 loading timeout\n this.player.once(EVENTS.loadingTimeout, () => {\n if (this.player._opt.loadingTimeoutReplay && this._loadingTimeoutReplayTimes < this.player._opt.loadingTimeoutReplayTimes) {\n this._loadingTimeoutReplayTimes += 1;\n this.play(url).then(() => {\n // resolve();\n this._loadingTimeoutReplayTimes = 0;\n }).catch(() => {\n // reject();\n });\n }\n })\n\n\n if (this.hasLoaded()) {\n this.player.play(url).then(() => {\n resolve();\n }).catch(() => {\n this.player.pause().then(() => {\n reject();\n })\n })\n } else {\n this.player.once(EVENTS.decoderWorkerInit, () => {\n this.player.play(url).then(() => {\n resolve();\n }).catch(() => {\n this.player.pause().then(() => {\n reject();\n })\n })\n })\n }\n })\n }\n\n /**\n *\n */\n resize() {\n this.player.resize();\n }\n\n /**\n *\n * @param time {number} s\n */\n setBufferTime(time) {\n time = Number(time)\n // s -> ms\n this.player.updateOption({\n videoBuffer: time * 1000\n })\n // update worker config\n this.player.decoderWorker && this.player.decoderWorker.updateWorkConfig({\n key: 'videoBuffer',\n value: time * 1000\n })\n }\n\n /**\n *\n * @param deg {number}\n */\n setRotate(deg) {\n deg = parseInt(deg, 10)\n const list = [0, 90, 270];\n if (this._opt.rotate === deg || list.indexOf(deg) === -1) {\n return;\n }\n this.player.updateOption({\n rotate: deg\n })\n this.resize();\n }\n\n /**\n *\n * @returns {boolean}\n */\n hasLoaded() {\n return this.player.loaded;\n }\n\n /**\n *\n */\n setKeepScreenOn() {\n this.player.updateOption({\n keepScreenOn: true\n })\n }\n\n /**\n *\n * @param flag {Boolean}\n */\n setFullscreen(flag) {\n const fullscreen = !!flag;\n if (this.player.fullscreen !== fullscreen) {\n this.player.fullscreen = fullscreen;\n }\n }\n\n /**\n *\n * @param filename {string}\n * @param format {string}\n * @param quality {number}\n * @param type {string} download,base64,blob\n */\n screenshot(filename, format, quality, type) {\n return this.player.video.screenshot(filename, format, quality, type)\n }\n\n /**\n *\n * @param fileName {string}\n * @param fileType {string}\n * @returns {Promise}\n */\n startRecord(fileName, fileType) {\n return new Promise((resolve, reject) => {\n if (this.player.playing) {\n this.player.startRecord(fileName, fileType)\n resolve();\n } else {\n reject();\n }\n })\n }\n\n stopRecordAndSave() {\n if (this.player.recording) {\n this.player.stopRecordAndSave();\n }\n }\n\n /**\n *\n * @returns {Boolean}\n */\n isPlaying() {\n return this.player.playing;\n }\n\n /**\n * 是否静音状态\n * @returns {Boolean}\n */\n isMute() {\n return this.player.audio ? this.player.audio.isMute : true;\n }\n\n /**\n * 是否在录制视频\n * @returns {*}\n */\n isRecording() {\n return this.player.recorder.recording;\n }\n\n\n}\n\n\nwindow.Jessibuca = Jessibuca;\n\nexport default Jessibuca;\n"],"names":["PLAYER_PLAY_PROTOCOL","websocket","fetch","DEMUX_TYPE","flv","m7s","DEFAULT_PLAYER_OPTIONS","videoBuffer","isResize","isFullResize","isFlv","debug","hotKey","loadingTimeout","heartTimeout","timeout","loadingTimeoutReplay","heartTimeoutReplay","loadingTimeoutReplayTimes","heartTimeoutReplayTimes","supportDblclickFullscreen","showBandwidth","keepScreenOn","isNotMute","hasAudio","hasVideo","operateBtns","fullscreen","screenshot","play","audio","record","controlAutoHide","hasControl","loadingText","background","decoder","url","rotate","forceNoOffscreen","hiddenAutoPause","protocol","demuxType","useWCS","wcsUseVideoRender","useMSE","useOffscreen","autoWasm","wasmDecodeErrorReplay","openWebglAlignment","WORKER_CMD_TYPE","init","initVideo","render","playAudio","initAudio","kBps","decode","audioCode","videoCode","wasmError","WASM_ERROR","invalidNalUnitSize","MEDIA_TYPE","video","FLV_MEDIA_TYPE","WORKER_SEND_TYPE","audioDecode","videoDecode","close","updateConfig","EVENTS","webFullscreen","decoderWorkerInit","playing","pause","mute","load","loading","videoInfo","timeUpdate","audioInfo","log","error","delayTimeout","stats","performance","recording","recordingTimestamp","recordStart","recordEnd","recordCreateError","buffer","videoFrame","start","metadata","resize","streamEnd","streamSuccess","streamMessage","streamError","volumechange","destroy","mseSourceOpen","mseSourceClose","mseSourceBufferError","mseSourceBufferBusy","videoWaiting","videoTimeUpdate","videoSyncAudio","playToRenderTimes","JESSIBUCA_EVENTS","EVENTS_ERROR","playError","fetchError","websocketError","webcodecsH265NotSupport","mediaSourceH265NotSupport","wasmDecodeError","WEBSOCKET_STATUS","notConnect","open","SCREENSHOT_TYPE","download","base64","blob","VIDEO_ENC_TYPE","VIDEO_ENC_CODE","h264","h265","AUDIO_ENC_TYPE","H265_NAL_TYPE","vps","sps","pps","CONTROL_HEIGHT","SCALE_MODE_TYPE","full","auto","fullAuto","FILE_SUFFIX","mp4","webm","CANVAS_RENDER_TYPE","webcodecs","webgl","offscreen","ENCODED_VIDEO_TYPE","key","delta","MP4_CODECS","avc","hev","MEDIA_SOURCE_STATE","ended","closed","AUDIO_SYNC_VIDEO_DIFF","HOT_KEY","esc","arrowUp","arrowDown","Debug","constructor","master","name","_opt","args","console","warn","Events","destroys","proxy","bind","target","callback","option","Array","isArray","map","item","addEventListener","removeEventListener","push","forEach","event","player","Object","defineProperty","get","clientRect","$container","getBoundingClientRect","width","Math","max","clientWidth","height","clientHeight","rect","noop","supportOffscreen","$canvas","transferControlToOffscreen","supportOffscreenV2","OffscreenCanvas","createContextGL","gl","validContextNames","nameIndex","length","contextName","contextOptions","preserveDrawingBuffer","getContext","e","getParameter","dataURLToFile","dataURL","arr","split","bstr","atob","type","replace","n","u8arr","Uint8Array","charCodeAt","File","downloadImg","content","fileName","aLink","document","createElement","href","URL","createObjectURL","click","setTimeout","revokeObjectURL","isIOS","now","Date","getTime","WebAssembly","instantiate","module","Module","of","Instance","clamp","num","a","b","min","setStyle","element","value","keys","style","getStyle","numberType","getComputedStyle","getPropertyValue","parseFloat","getNowTime","calculationRate","totalSize","lastTime","size","thisTime","diffTime","downloadRecord","suffix","window","isMobile","test","navigator","userAgent","toLowerCase","UA","supportWCS","formatVideoDecoderConfigure","avcC","codecArray","subarray","codecString","j","h","toString","codec","description","isFullScreen","mozIsFullScreen","webkitIsFullScreen","bpsSize","toFixed","fpsStatus","fps","result","createEmptyImageBitmap","$canvasElement","createImageBitmap","supportMSE","MediaSource","isTypeSupported","isEmpty","undefined","isBoolean","isNotEmpty","initPlayTimes","playInitStart","playStart","streamStart","streamResponse","demuxStart","decodeStart","videoStart","playTimestamp","streamTimestamp","streamResponseTimestamp","demuxTimestamp","decodeTimestamp","videoTimestamp","allTimestamp","screenfullChange","emit","screenfull","on","events","off","loaded","request","then","catch","exit","classList","add","remove","ignoreList","includes","Emitter","fn","ctx","once","self","listener","apply","_","evtArr","slice","data","i","evts","liveEvents","len","vertexShaderScript","join","fragmentShaderScript","pixelStorei","UNPACK_ALIGNMENT","vertexShader","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","FRAGMENT_SHADER","program","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","useProgram","vertexPosBuffer","createBuffer","bindBuffer","ARRAY_BUFFER","bufferData","Float32Array","STATIC_DRAW","vertexPosRef","getAttribLocation","enableVertexAttribArray","vertexAttribPointer","FLOAT","texturePosBuffer","texturePosRef","_initTexture","index","textureRef","createTexture","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","uniform1i","getUniformLocation","yTextureRef","uTextureRef","vTextureRef","w","y","u","v","viewport","activeTexture","TEXTURE0","texImage2D","LUMINANCE","UNSIGNED_BYTE","TEXTURE1","TEXTURE2","drawArrays","TRIANGLE_STRIP","deleteProgram","deleteBuffer","deleteTexture","CommonLoader","updateVideoInfo","encTypeCode","encType","CanvasVideoLoader","position","top","left","$videoElement","appendChild","context2D","contextGl","contextGlRender","contextGlDestroy","bitmaprenderer","renderType","_initCanvasRender","removeChild","_initContextGl","createWebGL","_initContext2D","_supportOffscreen","_bindOffscreen","initCanvasViewSize","msg","ts","transferFromImageBitmap","output","drawImage","filename","format","quality","formatType","png","jpeg","webp","encoderOptions","Number","toDataURL","file","clearView","imageBitMap","clear","COLOR_BUFFER_BIT","clearRect","resizeWidth","resizeHeight","wScale","hScale","scale","transform","VideoLoader","muted","trackGenerator","MediaStreamTrackGenerator","kind","srcObject","MediaStream","vwriter","writable","getWriter","src","$video","canvas","videoWidth","videoHeight","context","write","objectFill","objectFit","Video","Loader","getLoaderFactory","opt","AudioContextLoader","bufferList","scriptNode","hasInitScriptNode","audioContextChannel","audioContext","AudioContext","webkitAudioContext","gainNode","createGain","source","createBufferSource","connect","destination","noteOn","audioBufferSourceNode","mediaStreamAudioDestinationNode","createMediaStreamDestination","audioEnabled","gain","audioSyncVideoOption","diff","channels","sampleRate","options","closeAudio","onaudioprocess","updateAudioInfo","isPlaying","isMute","isStateSuspended","volume","bufferSize","initScriptNode","createScriptProcessor","audioProcessingEvent","outputBuffer","bufferItem","shift","audioTimestamp","channel","nowBuffering","getChannelData","flag","setVolume","isNaN","setValueAtTime","currentTime","disconnect","state","resume","suspend","isStateRunning","Audio","FetchLoader","abortController","AbortController","streamRate","rate","abort","fetchStream","demux","_times","signal","res","reader","body","getReader","fetchNext","read","done","byteLength","dispatch","WebsocketLoader","socket","socketStatus","wsUrl","_createWebSocket","WebSocket","binaryType","_handleMessage","message","Stream","global","RecordRTCLoader","fileType","isRecording","recordingInterval","_reset","setFileName","recordTime","startRecord","mimeType","onTimeStamp","timestamp","disableLogs","stream","captureStream","audioStream","getAudioTracks","audioTrack","enabled","addTrack","recorder","RecordRTC","startRecording","setInterval","stopRecordAndSave","stopRecording","getBlob","clearInterval","Recorder","DecoderWorker","decoderWorker","Worker","_initDecoderWorker","postMessage","cmd","terminate","onmessage","_initWork","code","handleRender","updateStats","buf","delay","handlePlayToRenderTimes","indexOf","JSON","stringify","decodeVideo","arrayBuffer","isIFrame","decodeAudio","_decodeAudioNoDelay","_decodeAudio","updateWorkConfig","config","stopId","firstTimestamp","startTimestamp","dropping","initInterval","getDelay","resetDelay","_loop","payload","_doDecoderDecode","_doDecode","pushBuffer","webcodecsDecoder","mseDecoder","FlvLoader","input","_inputFlv","flvDemux","dispatchFlvData","tmp","ArrayBuffer","tmp8","tmp32","Uint32Array","t","abps","vbps","need","next","combine","set","remain","return","M7sLoader","dv","DataView","getUint8","getUint32","isIframe","Demux","WebcodecsDecoder","hasInit","isInitInfo","initDecoder","_this","VideoDecoder","handleDecode","handleError","codedWidth","codedHeight","videoCodec","configure","chunk","EncodedVideoChunk","iconsMap","fullscreenExit","recordStop","reduce","icons","control","insertAdjacentHTML","querySelector","object","setAttribute","display","overflow","pointerEvents","zIndex","playerWidth","playerHeight","contentDocument","defaultView","setVolumeHandle","percentage","$volumeOn","$volumeOff","$volumeHandle","$volumePanel","panelHeight","handleHeight","$volumePanelText","innerHTML","parseInt","$loading","$poster","$playBig","$fullscreenExit","$fullscreen","$record","$recordStop","$play","$pause","$screenshot","$speed","bps","$controls","volumeChangeFromEvent","bottom","panelBottom","moveLen","composedPath","isFocus","stopPropagation","$volume","$volumePanelWrap","lastVolume","isVolumeDroging","addHotkey","tag","activeElement","tagName","toUpperCase","editable","getAttribute","keyCode","preventDefault","Control","template","observer","property","hotkey","autoSize","padding","playerRatio","canvasWidth","canvasHeight","canvasRatio","visibilityState","_isPlayingBeforePageHidden","enableWakeLock","MP4","types","avc1","hvc1","hvcC","btrt","dinf","dref","esds","ftyp","hdlr","mdat","mdhd","mdia","mfhd","minf","moof","moov","mp4a","mvex","mvhd","sdtp","stbl","stco","stsc","stsd","stsz","stts","tfdt","tfhd","traf","trak","trun","trex","tkhd","vmhd","smhd","hasOwnProperty","constants","FTYP","STSD_PREFIX","STTS","STSC","STCO","STSZ","HDLR_VIDEO","HDLR_AUDIO","DREF","SMHD","VMHD","box","datas","prototype","call","arguments","arrayCount","offset","generateInitSegment","meta","timescale","duration","trackId","id","presentWidth","presentHeight","xmhd","videoType","channelCount","audioSampleRate","configSize","concat","avcc","codecWidth","codecHeight","track","baseMediaDecodeTime","sequenceNumber","flags","isLeading","dependsOn","isDependedOn","hasRedundancy","dataSize","cts","isNonSync","ExpGolomb","uint8array","TAG","_buffer","_buffer_index","_total_bytes","_total_bits","_current_word","_current_word_bits_left","_fillCurrentWord","buffer_bytes_left","bytes_read","word","readBits","bits","bits_need_left","bits_read_next","result2","readBool","readByte","_skipLeadingZero","zero_count","readUEG","leading_zeros","readSEG","SPSParser","_ebsp2rbsp","src_length","dst","dst_idx","parseSPS","rbsp","gb","profile_idc","level_idc","profile_string","getProfileString","level_string","getLevelString","chroma_format_idc","chroma_format","chroma_format_table","bit_depth","scaling_list_count","_skipScalingList","pic_order_cnt_type","num_ref_frames_in_pic_order_cnt_cycle","ref_frames","pic_width_in_mbs_minus1","pic_height_in_map_units_minus1","frame_mbs_only_flag","frame_crop_left_offset","frame_crop_right_offset","frame_crop_top_offset","frame_crop_bottom_offset","frame_cropping_flag","sar_width","sar_height","fps_fixed","fps_num","fps_den","vui_parameters_present_flag","aspect_ratio_idc","sar_w_table","sar_h_table","num_units_in_tick","time_scale","sarScale","crop_unit_x","crop_unit_y","sub_wc","sub_hc","codec_width","codec_height","present_width","ceil","chroma_format_string","getChromaFormatString","frame_rate","fixed","sar_ratio","codec_size","present_size","count","last_scale","next_scale","delta_scale","chroma","parseAVCDecoderConfigurationRecord","version","avcProfile","_naluLengthSize","spsCount","getUint16","profile","level","bitDepth","chromaFormat","sarRatio","frameRate","refSampleDuration","ppsCount","parseHEVCDecoderConfigurationRecord","vpsTag","vpsLength","vpsData","from","spsTag","spsLength","spsData","ppsTag","ppsLength","ppsData","MseDecoder","isAvc","mediaSource","sourceBuffer","cacheTrack","timeInit","mediaSourceOpen","stop","readyState","isStateOpen","isStateClosed","isStateEnded","_decodeConfigurationRecord","_decodeVideo","metaData","metaBox","appendBuffer","bytes","dts","buffered","removeBuffer","end","mdatBytes","mdatbox","moofbox","isKeyframe","addSourceBuffer","updating","endOfStream","dropSourceBuffer","WEBM","oldIOS","exec","MSStream","nativeWakeLock","NoSleep","_wakeLock","handleVisibilityChange","enable","noSleepTimer","noSleepVideo","_addSourceToVideo","random","dataURI","isEnabled","wakeLock","err","disable","hidden","location","Promise","resolve","playPromise","release","Player","container","assign","_hasControl","_loading","_playing","_hasLoaded","_checkHeartTimeout","_checkLoadingTimeout","_startBpsTime","_stats","_videoTimestamp","_audioTimestamp","_onlyMseOrWcsVideo","clearCheckHeartTimeout","clearCheckLoadingTimeout","releaseWakeLock","resetStats","updateOption","contains","reject","checkLoadingTimeout","_close","hasBtnShow","text","checkHeart","checkHeartTimeout","clearTimeout","_nowTime","Jessibuca","Error","_loadingTimeoutReplayTimes","_heartTimeoutReplayTimes","_initPlayer","_bindEvents","_resetPlayer","_options","setDebug","isDebug","cancelMute","audioResume","time","setScaleMode","_play","isHttp","hasLoaded","setBufferTime","setRotate","deg","list","setKeepScreenOn","setFullscreen"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/jessibuca.js b/dist/jessibuca.js
index 202ee303..10c75376 100644
--- a/dist/jessibuca.js
+++ b/dist/jessibuca.js
@@ -1 +1 @@
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).jessibuca=t()}(this,(function(){"use strict";const e=0,t=1,i="flv",o="m7s",r={videoBuffer:1e3,isResize:!0,isFullResize:!1,isFlv:!1,debug:!1,hotKey:!1,loadingTimeout:10,heartTimeout:5,timeout:10,loadingTimeoutReplay:!1,heartTimeoutReplay:!1,loadingTimeoutReplayTimes:3,heartTimeoutReplayTimes:3,supportDblclickFullscreen:!1,showBandwidth:!1,keepScreenOn:!1,isNotMute:!1,hasAudio:!0,hasVideo:!0,operateBtns:{fullscreen:!1,screenshot:!1,play:!1,audio:!1,record:!1},controlAutoHide:!1,hasControl:!1,loadingText:"",background:"",decoder:"decoder.js",url:"",rotate:0,forceNoOffscreen:!0,hiddenAutoPause:!1,protocol:t,demuxType:i,useWCS:!1,wcsUseVideoRender:!1,useMSE:!1,useOffscreen:!1,autoWasm:!0,wasmDecodeErrorReplay:!0,openWebglAlignment:!1},A="init",s="initVideo",n="render",a="playAudio",d="initAudio",c="audioCode",l="videoCode",u="wasmError",h="Invalid NAL unit size",p=1,m=2,g=8,f=9,b="init",y="decode",v="audioDecode",w="close",S="updateConfig",E={fullscreen:"fullscreen$2",webFullscreen:"webFullscreen",decoderWorkerInit:"decoderWorkerInit",play:"play",playing:"playing",pause:"pause",mute:"mute",load:"load",loading:"loading",videoInfo:"videoInfo",timeUpdate:"timeUpdate",audioInfo:"audioInfo",log:"log",error:"error",kBps:"kBps",timeout:"timeout",delayTimeout:"delayTimeout",loadingTimeout:"loadingTimeout",stats:"stats",performance:"performance",record:"record",recording:"recording",recordingTimestamp:"recordingTimestamp",recordStart:"recordStart",recordEnd:"recordEnd",recordCreateError:"recordCreateError",buffer:"buffer",videoFrame:"videoFrame",start:"start",metadata:"metadata",resize:"resize",streamEnd:"streamEnd",streamSuccess:"streamSuccess",streamMessage:"streamMessage",streamError:"streamError",volumechange:"volumechange",destroy:"destroy",mseSourceOpen:"mseSourceOpen",mseSourceClose:"mseSourceClose",mseSourceBufferError:"mseSourceBufferError",mseSourceBufferBusy:"mseSourceBufferBusy",videoWaiting:"videoWaiting",videoTimeUpdate:"videoTimeUpdate",videoSyncAudio:"videoSyncAudio",playToRenderTimes:"playToRenderTimes"},B={load:E.load,timeUpdate:E.timeUpdate,videoInfo:E.videoInfo,audioInfo:E.audioInfo,error:E.error,kBps:E.kBps,log:E.log,start:E.start,timeout:E.timeout,loadingTimeout:E.loadingTimeout,delayTimeout:E.delayTimeout,fullscreen:"fullscreen",play:E.play,pause:E.pause,mute:E.mute,stats:E.stats,performance:E.performance,recordingTimestamp:E.recordingTimestamp,recordStart:E.recordStart,recordEnd:E.recordEnd,playToRenderTimes:E.playToRenderTimes},C={playError:"playIsNotPauseOrUrlIsNull",fetchError:"fetchError",websocketError:"websocketError",webcodecsH265NotSupport:"webcodecsH265NotSupport",mediaSourceH265NotSupport:"mediaSourceH265NotSupport",wasmDecodeError:"wasmDecodeError"},R="notConnect",k="open",T="close",I="error",D={download:"download",base64:"base64",blob:"blob"},x={7:"H264(AVC)",12:"H265(HEVC)"},j=7,L=12,U={10:"AAC",7:"ALAW",8:"MULAW"},F=32,V=33,O=34,M=0,Q=1,W=2,G="mp4",J="webm",N="webcodecs",P="webgl",z="offscreen",Y="key",H="delta",X='video/mp4; codecs="avc1.64002A"',Z="ended",q="open",K="closed",_=1e3,$=27,ee=38,te=40;class ie{constructor(e){this.log=function(t){if(e._opt.debug){for(var i=arguments.length,o=new Array(i>1?i-1:0),r=1;r1?i-1:0),r=1;r1?i-1:0),r=1;r3&&void 0!==arguments[3]?arguments[3]:{};if(!e)return;if(Array.isArray(t))return t.map((t=>this.proxy(e,t,i,o)));e.addEventListener(t,i,o);const r=()=>e.removeEventListener(t,i,o);return this.destroys.push(r),r}destroy(){this.master.debug&&this.master.debug.log("Events","destroy"),this.destroys.forEach((e=>e()))}}var re="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Ae(e,t){return e(t={exports:{}},t.exports),t.exports}var se=Ae((function(e){!function(){var t="undefined"!=typeof window&&void 0!==window.document?window.document:{},i=e.exports,o=function(){for(var e,i=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],o=0,r=i.length,A={};o0&&void 0!==arguments[0]?arguments[0]:"";const t=e.split(","),i=atob(t[1]),o=t[0].replace("data:","").replace(";base64","");let r=i.length,A=new Uint8Array(r);for(;r--;)A[r]=i.charCodeAt(r);return new File([A],"file",{type:o})}function de(e,t){const i=document.createElement("a");i.download=t,i.href=URL.createObjectURL(e),i.click(),setTimeout((()=>{URL.revokeObjectURL(e)}),fe()?1e3:0)}function ce(){return(new Date).getTime()}function le(e,t,i){return Math.max(Math.min(e,Math.max(t,i)),Math.min(t,i))}function ue(e,t,i){if(e)return"object"==typeof t&&Object.keys(t).forEach((i=>{ue(e,i,t[i])})),e.style[t]=i,e}function he(e,t){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(!e)return 0;const o=getComputedStyle(e,null).getPropertyValue(t);return i?parseFloat(o):o}function pe(){return performance&&"function"==typeof performance.now?performance.now():Date.now()}function me(e){let t=0,i=pe();return o=>{t+=o;const r=pe(),A=r-i;A>=1e3&&(e(t/A*1e3),i=r,t=0)}}function ge(){return/iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(window.navigator.userAgent.toLowerCase())}function fe(){const e=window.navigator.userAgent.toLowerCase();return e&&/iphone|ipad|ipod|ios/.test(e)}function be(e){if(null==e||""===e)return"0 KB/S";let t=parseFloat(e);return t=t.toFixed(2),t+"KB/S"}function ye(e){return null==e}function ve(e){return!ye(e)}se.isEnabled,(()=>{try{if("object"==typeof WebAssembly&&"function"==typeof WebAssembly.instantiate){const e=new WebAssembly.Module(Uint8Array.of(0,97,115,109,1,0,0,0));if(e instanceof WebAssembly.Module)return new WebAssembly.Instance(e)instanceof WebAssembly.Instance}}catch(e){}})();class we{on(e,t,i){const o=this.e||(this.e={});return(o[e]||(o[e]=[])).push({fn:t,ctx:i}),this}once(e,t,i){const o=this;function r(){o.off(e,r);for(var A=arguments.length,s=new Array(A),n=0;n1?i-1:0),r=1;r{delete i[e]})),void delete this.e;const o=i[e],r=[];if(o&&t)for(let e=0,i=o.length;e{var i=["attribute vec4 vertexPos;","attribute vec4 texturePos;","varying vec2 textureCoord;","void main()","{","gl_Position = vertexPos;","textureCoord = texturePos.xy;","}"].join("\n"),o=["precision highp float;","varying highp vec2 textureCoord;","uniform sampler2D ySampler;","uniform sampler2D uSampler;","uniform sampler2D vSampler;","const mat4 YUV2RGB = mat4","(","1.1643828125, 0, 1.59602734375, -.87078515625,","1.1643828125, -.39176171875, -.81296875, .52959375,","1.1643828125, 2.017234375, 0, -1.081390625,","0, 0, 0, 1",");","void main(void) {","highp float y = texture2D(ySampler, textureCoord).r;","highp float u = texture2D(uSampler, textureCoord).r;","highp float v = texture2D(vSampler, textureCoord).r;","gl_FragColor = vec4(y, u, v, 1) * YUV2RGB;","}"].join("\n");t&&e.pixelStorei(e.UNPACK_ALIGNMENT,1);var r=e.createShader(e.VERTEX_SHADER);e.shaderSource(r,i),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)||console.log("Vertex shader failed to compile: "+e.getShaderInfoLog(r));var A=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(A,o),e.compileShader(A),e.getShaderParameter(A,e.COMPILE_STATUS)||console.log("Fragment shader failed to compile: "+e.getShaderInfoLog(A));var s=e.createProgram();e.attachShader(s,r),e.attachShader(s,A),e.linkProgram(s),e.getProgramParameter(s,e.LINK_STATUS)||console.log("Program failed to compile: "+e.getProgramInfoLog(s)),e.useProgram(s);var n=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,n),e.bufferData(e.ARRAY_BUFFER,new Float32Array([1,1,-1,1,1,-1,-1,-1]),e.STATIC_DRAW);var a=e.getAttribLocation(s,"vertexPos");e.enableVertexAttribArray(a),e.vertexAttribPointer(a,2,e.FLOAT,!1,0,0);var d=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,d),e.bufferData(e.ARRAY_BUFFER,new Float32Array([1,0,0,0,1,1,0,1]),e.STATIC_DRAW);var c=e.getAttribLocation(s,"texturePos");function l(t,i){var o=e.createTexture();return e.bindTexture(e.TEXTURE_2D,o),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),e.uniform1i(e.getUniformLocation(s,t),i),o}e.enableVertexAttribArray(c),e.vertexAttribPointer(c,2,e.FLOAT,!1,0,0);var u=l("ySampler",0),h=l("uSampler",1),p=l("vSampler",2);return{render:function(t,i,o,r,A){e.viewport(0,0,t,i),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,u),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,t,i,0,e.LUMINANCE,e.UNSIGNED_BYTE,o),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,h),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,t/2,i/2,0,e.LUMINANCE,e.UNSIGNED_BYTE,r),e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,p),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,t/2,i/2,0,e.LUMINANCE,e.UNSIGNED_BYTE,A),e.drawArrays(e.TRIANGLE_STRIP,0,4)},destroy:function(){try{e.deleteProgram(s),e.deleteBuffer(n),e.deleteBuffer(d),e.deleteTexture(u),e.deleteTexture(h),e.deleteBuffer(p)}catch(e){}}}})(this.contextGl,this.player._opt.openWebglAlignment);this.contextGlRender=e.render,this.contextGlDestroy=e.destroy}_initContext2D(){this.context2D=this.$videoElement.getContext("2d")}_initCanvasRender(){this.player._opt.useWCS&&!this._supportOffscreen()?(this.renderType=N,this._initContext2D()):this._supportOffscreen()?(this.renderType=z,this._bindOffscreen()):(this.renderType=P,this._initContextGl())}_supportOffscreen(){return"function"==typeof this.$videoElement.transferControlToOffscreen&&this.player._opt.useOffscreen}_bindOffscreen(){this.bitmaprenderer=this.$videoElement.getContext("bitmaprenderer")}initCanvasViewSize(){this.$videoElement.width=this.videoInfo.width,this.$videoElement.height=this.videoInfo.height,this.resize()}render(e){switch(this.player.videoTimestamp=e.ts,this.renderType){case z:this.bitmaprenderer.transferFromImageBitmap(e.buffer);break;case P:this.contextGlRender(this.$videoElement.width,this.$videoElement.height,e.output[0],e.output[1],e.output[2]);break;case N:this.context2D.drawImage(e.videoFrame,0,0,this.$videoElement.width,this.$videoElement.height)}}screenshot(e,t,i,o){e=e||ce(),o=o||D.download;const r={png:"image/png",jpeg:"image/jpeg",webp:"image/webp"};let A=.92;!r[t]&&D[t]&&(o=t,t="png",i=void 0),"string"==typeof i&&(o=i,i=void 0),void 0!==i&&(A=Number(i));const s=this.$videoElement.toDataURL(r[t]||r.png,A),n=ae(s);return o===D.base64?s:o===D.blob?n:void(o===D.download&&de(n,e))}clearView(){switch(this.renderType){case z:(function(e,t){const i=document.createElement("canvas");return i.width=e,i.height=t,createImageBitmap(i,0,0,e,t)})(this.$videoElement.width,this.$videoElement.height).then((e=>{this.bitmaprenderer.transferFromImageBitmap(e)}));break;case P:this.contextGl.clear(this.contextGl.COLOR_BUFFER_BIT);break;case N:this.context2D.clearRect(0,0,this.$videoElement.width,this.$videoElement.height)}}resize(){this.player.debug.log("canvasVideo","resize");const e=this.player._opt;let t=this.player.width,i=this.player.height;e.hasControl&&!e.controlAutoHide&&(ge()&&this.player.fullscreen?t-=38:i-=38);let o=this.$videoElement.width,r=this.$videoElement.height;const A=e.rotate;let s=(t-o)/2,n=(i-r)/2;270!==A&&90!==A||(o=this.$videoElement.height,r=this.$videoElement.width);const a=t/o,d=i/r;let c=a>d?d:a;e.isResize||a!==d&&(c=a+","+d),e.isFullResize&&(c=a>d?a:d);let l="scale("+c+")";A&&(l+=" rotate("+A+"deg)"),this.$videoElement.style.transform=l,this.$videoElement.style.left=s+"px",this.$videoElement.style.top=n+"px"}}class Be extends Se{constructor(e){super(),this.player=e;const t=document.createElement("video");t.muted=!0,t.style.position="absolute",t.style.top=0,t.style.left=0,e.$container.appendChild(t),this.$videoElement=t,this.videoInfo={width:"",height:"",encType:""};const i=this.player._opt;i.useWCS&&i.wcsUseVideoRender&&(this.trackGenerator=new MediaStreamTrackGenerator({kind:"video"}),t.srcObject=new MediaStream([this.trackGenerator]),this.vwriter=this.trackGenerator.writable.getWriter()),this.resize();const{proxy:o}=this.player.events;o(this.$videoElement,"canplay",(()=>{this.player.debug.log("Video","canplay")})),o(this.$videoElement,"waiting",(()=>{this.player.emit(E.videoWaiting)})),o(this.$videoElement,"timeupdate",(e=>{})),this.player.debug.log("Video","init")}destroy(){this.player.$container.removeChild(this.$videoElement),this.$videoElement&&(this.$videoElement.src="",this.$videoElement=null),this.trackGenerator&&(this.trackGenerator=null),this.vwriter&&(this.trackGenerator=null),this.init=!1,this.off(),this.player.debug.log("Video","destroy")}play(){this.$videoElement.play()}clearView(){}screenshot(e,t,i,o){e=e||ce(),o=o||D.download;let r=.92;!{png:"image/png",jpeg:"image/jpeg",webp:"image/webp"}[t]&&D[t]&&(o=t,t="png",i=void 0),"string"==typeof i&&(o=i,i=void 0),void 0!==i&&(r=Number(i));const A=this.$videoElement;let s=document.createElement("canvas");s.width=A.videoWidth,s.height=A.videoHeight;s.getContext("2d").drawImage(A,0,0,s.width,s.height);const n=s.toDataURL(D[t]||D.png,r),a=ae(n);return o===D.base64?n:o===D.blob?a:void(o===D.download&&de(a,e))}initCanvasViewSize(){this.resize()}render(e){this.vwriter&&this.vwriter.write(e.videoFrame)}resize(){let e=this.player.width,t=this.player.height;const i=this.player._opt,o=i.rotate;i.hasControl&&!i.controlAutoHide&&(ge()&&this.player.fullscreen?e-=38:t-=38),this.$videoElement.width=e,this.$videoElement.height=t,270!==o&&90!==o||(this.$videoElement.width=t,this.$videoElement.height=e);let r=(e-this.$videoElement.width)/2,A=(t-this.$videoElement.height)/2,s="contain";i.isResize||(s="fill"),i.isFullResize&&(s="none"),this.$videoElement.style.objectFit=s,this.$videoElement.style.transform="rotate("+o+"deg)",this.$videoElement.style.left=r+"px",this.$videoElement.style.top=A+"px"}}class Ce{constructor(e){return new(Ce.getLoaderFactory(e._opt))(e)}static getLoaderFactory(e){return e.useMSE||e.useWCS&&e.wcsUseVideoRender?Be:Ee}}class Re extends we{constructor(e){super(),this.bufferList=[],this.player=e,this.scriptNode=null,this.hasInitScriptNode=!1,this.audioContextChannel=null,this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.gainNode=this.audioContext.createGain();const t=this.audioContext.createBufferSource();t.buffer=this.audioContext.createBuffer(1,1,22050),t.connect(this.audioContext.destination),t.noteOn?t.noteOn(0):t.start(0),this.audioBufferSourceNode=t,this.mediaStreamAudioDestinationNode=this.audioContext.createMediaStreamDestination(),this.audioEnabled(!0),this.gainNode.gain.value=0,this.playing=!1,this.audioSyncVideoOption={diff:null},this.audioInfo={encType:"",channels:"",sampleRate:""},this.init=!1,this.hasAudio=!1,this.on(E.videoSyncAudio,(e=>{this.audioSyncVideoOption=e})),this.player.debug.log("AudioContext","init")}destroy(){this.closeAudio(),this.audioContext.close(),this.audioContext=null,this.gainNode=null,this.init=!1,this.hasAudio=!1,this.playing=!1,this.scriptNode&&(this.scriptNode.onaudioprocess=ne,this.scriptNode=null),this.audioBufferSourceNode=null,this.mediaStreamAudioDestinationNode=null,this.hasInitScriptNode=!1,this.audioSyncVideoOption={diff:null},this.audioInfo={encType:"",channels:"",sampleRate:""},this.off(),this.player.debug.log("AudioContext","destroy")}updateAudioInfo(e){e.encTypeCode&&(this.audioInfo.encType=U[e.encTypeCode]),e.channels&&(this.audioInfo.channels=e.channels),e.sampleRate&&(this.audioInfo.sampleRate=e.sampleRate),this.audioInfo.sampleRate&&this.audioInfo.channels&&this.audioInfo.encType&&!this.init&&(this.player.emit(E.audioInfo,this.audioInfo),this.init=!0)}get isPlaying(){return this.playing}get isMute(){return 0===this.gainNode.gain.value||this.isStateSuspended()}get volume(){return this.gainNode.gain.value}get bufferSize(){return this.bufferList.length}initScriptNode(){if(this.playing=!0,this.hasInitScriptNode)return;const e=this.audioInfo.channels,t=this.audioContext.createScriptProcessor(1024,0,e);t.onaudioprocess=t=>{const i=t.outputBuffer;if(this.bufferList.length&&this.playing){if(!this.player._opt.useWCS&&!this.player._opt.useMSE){if(this.audioSyncVideoOption.diff>_)return void this.player.debug.warn("AudioContext",`audioSyncVideoOption more than diff :${this.audioSyncVideoOption.diff}, waiting`);if(this.audioSyncVideoOption.diff<-1e3){this.player.debug.warn("AudioContext",`audioSyncVideoOption less than diff :${this.audioSyncVideoOption.diff}, dropping`);let e=this.bufferList.shift();for(;e.ts-this.player.videoTimestamp<-1e3&&this.bufferList.length>0;)e=this.bufferList.shift();if(0===this.bufferList.length)return}}if(0===this.bufferList.length)return;const t=this.bufferList.shift();t&&t.ts&&(this.player.audioTimestamp=t.ts);for(let o=0;o20&&(this.player.debug.warn("AudioContext",`bufferList is large: ${this.bufferList.length}`),this.bufferList.length>50&&this.bufferList.shift()))}pause(){this.audioSyncVideoOption={diff:null},this.playing=!1,this.clear()}resume(){this.playing=!0}}class ke{constructor(e){return new(ke.getLoaderFactory())(e)}static getLoaderFactory(){return Re}}class Te extends we{constructor(e){super(),this.player=e,this.playing=!1,this.abortController=new AbortController,this.streamRate=me((t=>{e.emit(E.kBps,(t/1024).toFixed(2))})),e.debug.log("FetchStream","init")}destroy(){this.abort(),this.off(),this.streamRate=null,this.player.debug.log("FetchStream","destroy")}fetchStream(e){const{demux:t}=this.player;this.player._times.streamStart=ce(),fetch(e,{signal:this.abortController.signal}).then((e=>{const i=e.body.getReader();this.emit(E.streamSuccess);const o=()=>{i.read().then((e=>{let{done:i,value:r}=e;i?t.close():(this.streamRate&&this.streamRate(r.byteLength),t.dispatch(r),o())})).catch((e=>{t.close(),this.emit(C.fetchError,e),this.player.emit(E.error,C.fetchError),this.abort()}))};o()})).catch((e=>{this.abort(),this.emit(C.fetchError,e),this.player.emit(E.error,C.fetchError)}))}abort(){this.abortController&&(this.abortController.abort(),this.abortController=null)}}class Ie extends we{constructor(e){super(),this.player=e,this.socket=null,this.socketStatus=R,this.wsUrl=null,this.streamRate=me((t=>{e.emit(E.kBps,(t/1024).toFixed(2))}))}destroy(){this.socket&&(this.socket.close(),this.socket=null),this.socketStatus=R,this.streamRate=null,this.wsUrl=null,this.off(),this.player.debug.log("websocketLoader","destroy")}_createWebSocket(){const e=this.player,{debug:t,events:{proxy:i},demux:o}=e;this.socket=new WebSocket(this.wsUrl),this.socket.binaryType="arraybuffer",i(this.socket,"open",(()=>{this.emit(E.streamSuccess),t.log("websocketLoader","socket open"),this.socketStatus=k})),i(this.socket,"message",(e=>{this.streamRate&&this.streamRate(e.data.byteLength),this._handleMessage(e.data)})),i(this.socket,"close",(()=>{t.log("websocketLoader","socket close"),this.emit(E.streamEnd),this.socketStatus=T})),i(this.socket,"error",(e=>{t.log("websocketLoader","socket error"),this.emit(C.websocketError,e),this.player.emit(E.error,C.websocketError),this.socketStatus=I,o.close(),t.log("websocketLoader","socket error:",e)}))}_handleMessage(e){const{demux:t}=this.player;t?t.dispatch(e):this.player.debug.warn("websocketLoader","websocket handle message demux is null")}fetchStream(e){this.player._times.streamStart=ce(),this.wsUrl=e,this._createWebSocket()}}class De{constructor(e){return new(De.getLoaderFactory(e._opt.protocol))(e)}static getLoaderFactory(i){return i===t?Te:i===e?Ie:void 0}}var xe=Ae((function(e){function t(e,r){if(!e)throw"First parameter is required.";r=new i(e,r=r||{type:"video"});var A=this;function s(t){t&&(r.initCallback=function(){t(),t=r.initCallback=null});var i=new o(e,r);(h=new i(e,r)).record(),u("recording"),r.disableLogs||console.log("Initialized recorderType:",h.constructor.name,"for output-type:",r.type)}function n(e){if(e=e||function(){},h){if("paused"===A.state)return A.resumeRecording(),void setTimeout((function(){n(e)}),1);"recording"===A.state||r.disableLogs||console.warn('Recording state should be: "recording", however current state is: ',A.state),r.disableLogs||console.log("Stopped recording "+r.type+" stream."),"gif"!==r.type?h.stop(t):(h.stop(),t()),u("stopped")}else m();function t(t){if(h){Object.keys(h).forEach((function(e){"function"!=typeof h[e]&&(A[e]=h[e])}));var i=h.blob;if(!i){if(!t)throw"Recording failed.";h.blob=i=t}if(i&&!r.disableLogs&&console.log(i.type,"->",f(i.size)),e){var o;try{o=c.createObjectURL(i)}catch(e){}"function"==typeof e.call?e.call(A,o):e(o)}r.autoWriteToDisk&&d((function(e){var t={};t[r.type+"Blob"]=e,I.Store(t)}))}else"function"==typeof e.call?e.call(A,""):e("")}}function a(e){postMessage((new FileReaderSync).readAsDataURL(e))}function d(e,t){if(!e)throw"Pass a callback function over getDataURL.";var i=t?t.blob:(h||{}).blob;if(!i)return r.disableLogs||console.warn("Blob encoder did not finish its job yet."),void setTimeout((function(){d(e,t)}),1e3);if("undefined"==typeof Worker||navigator.mozGetUserMedia){var o=new FileReader;o.readAsDataURL(i),o.onload=function(t){e(t.target.result)}}else{var A=function(e){try{var t=c.createObjectURL(new Blob([e.toString(),"this.onmessage = function (eee) {"+e.name+"(eee.data);}"],{type:"application/javascript"})),i=new Worker(t);return c.revokeObjectURL(t),i}catch(e){}}(a);A.onmessage=function(t){e(t.data)},A.postMessage(i)}}function l(e){e=e||0,"paused"!==A.state?"stopped"!==A.state&&(e>=A.recordingDuration?n(A.onRecordingStopped):(e+=1e3,setTimeout((function(){l(e)}),1e3))):setTimeout((function(){l(e)}),1e3)}function u(e){A&&(A.state=e,"function"==typeof A.onStateChanged.call?A.onStateChanged.call(A,e):A.onStateChanged(e))}var h,p='It seems that recorder is destroyed or "startRecording" is not invoked for '+r.type+" recorder.";function m(){!0!==r.disableLogs&&console.warn(p)}var g={startRecording:function(t){return r.disableLogs||console.log("RecordRTC version: ",A.version),t&&(r=new i(e,t)),r.disableLogs||console.log("started recording "+r.type+" stream."),h?(h.clearRecordedData(),h.record(),u("recording"),A.recordingDuration&&l(),A):(s((function(){A.recordingDuration&&l()})),A)},stopRecording:n,pauseRecording:function(){h?"recording"===A.state?(u("paused"),h.pause(),r.disableLogs||console.log("Paused recording.")):r.disableLogs||console.warn("Unable to pause the recording. Recording state: ",A.state):m()},resumeRecording:function(){h?"paused"===A.state?(u("recording"),h.resume(),r.disableLogs||console.log("Resumed recording.")):r.disableLogs||console.warn("Unable to resume the recording. Recording state: ",A.state):m()},initRecorder:s,setRecordingDuration:function(e,t){if(void 0===e)throw"recordingDuration is required.";if("number"!=typeof e)throw"recordingDuration must be a number.";return A.recordingDuration=e,A.onRecordingStopped=t||function(){},{onRecordingStopped:function(e){A.onRecordingStopped=e}}},clearRecordedData:function(){h?(h.clearRecordedData(),r.disableLogs||console.log("Cleared old recorded data.")):m()},getBlob:function(){if(h)return h.blob;m()},getDataURL:d,toURL:function(){if(h)return c.createObjectURL(h.blob);m()},getInternalRecorder:function(){return h},save:function(e){h?b(h.blob,e):m()},getFromDisk:function(e){h?t.getFromDisk(r.type,e):m()},setAdvertisementArray:function(e){r.advertisement=[];for(var t=e.length,i=0;i-1&&"netscape"in window&&/ rv:/.test(navigator.userAgent),p=!u&&!l&&!!navigator.webkitGetUserMedia||y()||-1!==navigator.userAgent.toLowerCase().indexOf("chrome/"),m=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);m&&!p&&-1!==navigator.userAgent.indexOf("CriOS")&&(m=!1,p=!0);var g=window.MediaStream;function f(e){if(0===e)return"0 Bytes";var t=parseInt(Math.floor(Math.log(e)/Math.log(1e3)),10);return(e/Math.pow(1e3,t)).toPrecision(3)+" "+["Bytes","KB","MB","GB","TB"][t]}function b(e,t){if(!e)throw"Blob object is required.";if(!e.type)try{e.type="video/webm"}catch(e){}var i=(e.type||"video/webm").split("/")[1];if(-1!==i.indexOf(";")&&(i=i.split(";")[0]),t&&-1!==t.indexOf(".")){var o=t.split(".");t=o[0],i=o[1]}var r=(t||Math.round(9999999999*Math.random())+888888888)+"."+i;if(void 0!==navigator.msSaveOrOpenBlob)return navigator.msSaveOrOpenBlob(e,r);if(void 0!==navigator.msSaveBlob)return navigator.msSaveBlob(e,r);var A=document.createElement("a");A.href=c.createObjectURL(e),A.download=r,A.style="display:none;opacity:0;color:transparent;",(document.body||document.documentElement).appendChild(A),"function"==typeof A.click?A.click():(A.target="_blank",A.dispatchEvent(new MouseEvent("click",{view:window,bubbles:!0,cancelable:!0}))),c.revokeObjectURL(A.href)}function y(){return"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0)}function v(e,t){return e&&e.getTracks?e.getTracks().filter((function(e){return e.kind===(t||"audio")})):[]}function w(e,t){"srcObject"in t?t.srcObject=e:"mozSrcObject"in t?t.mozSrcObject=e:t.srcObject=e}void 0===g&&"undefined"!=typeof webkitMediaStream&&(g=webkitMediaStream),void 0!==g&&void 0===g.prototype.stop&&(g.prototype.stop=function(){this.getTracks().forEach((function(e){e.stop()}))}),t.invokeSaveAsDialog=b,t.getTracks=v,t.getSeekableBlob=function(e,t){if("undefined"==typeof EBML)throw new Error("Please link: https://www.webrtc-experiment.com/EBML.js");var i=new EBML.Reader,o=new EBML.Decoder,r=EBML.tools,A=new FileReader;A.onload=function(e){o.decode(this.result).forEach((function(e){i.read(e)})),i.stop();var A=r.makeMetadataSeekable(i.metadatas,i.duration,i.cues),s=this.result.slice(i.metadataSize),n=new Blob([A,s],{type:"video/webm"});t(n)},A.readAsArrayBuffer(e)},t.bytesToSize=f,t.isElectron=y;var S={};function E(){if(h||m||l)return!0;var e,t,i=navigator.userAgent,o=""+parseFloat(navigator.appVersion),r=parseInt(navigator.appVersion,10);return(p||u)&&(e=i.indexOf("Chrome"),o=i.substring(e+7)),-1!==(t=o.indexOf(";"))&&(o=o.substring(0,t)),-1!==(t=o.indexOf(" "))&&(o=o.substring(0,t)),r=parseInt(""+o,10),isNaN(r)&&(o=""+parseFloat(navigator.appVersion),r=parseInt(navigator.appVersion,10)),r>=49}function B(e,t){var i=this;if(void 0===e)throw'First argument "MediaStream" is required.';if("undefined"==typeof MediaRecorder)throw"Your browser does not support the Media Recorder API. Please try other modules e.g. WhammyRecorder or StereoAudioRecorder.";if("audio"===(t=t||{mimeType:"video/webm"}).type){var o;if(v(e,"video").length&&v(e,"audio").length)navigator.mozGetUserMedia?(o=new g).addTrack(v(e,"audio")[0]):o=new g(v(e,"audio")),e=o;t.mimeType&&-1!==t.mimeType.toString().toLowerCase().indexOf("audio")||(t.mimeType=p?"audio/webm":"audio/ogg"),t.mimeType&&"audio/ogg"!==t.mimeType.toString().toLowerCase()&&navigator.mozGetUserMedia&&(t.mimeType="audio/ogg")}var r,A=[];function s(){i.timestamps.push((new Date).getTime()),"function"==typeof t.onTimeStamp&&t.onTimeStamp(i.timestamps[i.timestamps.length-1],i.timestamps)}function n(e){return r&&r.mimeType?r.mimeType:e.mimeType||"video/webm"}function a(){A=[],r=null,i.timestamps=[]}this.getArrayOfBlobs=function(){return A},this.record=function(){i.blob=null,i.clearRecordedData(),i.timestamps=[],d=[],A=[];var o=t;t.disableLogs||console.log("Passing following config over MediaRecorder API.",o),r&&(r=null),p&&!E()&&(o="video/vp8"),"function"==typeof MediaRecorder.isTypeSupported&&o.mimeType&&(MediaRecorder.isTypeSupported(o.mimeType)||(t.disableLogs||console.warn("MediaRecorder API seems unable to record mimeType:",o.mimeType),o.mimeType="audio"===t.type?"audio/webm":"video/webm"));try{r=new MediaRecorder(e,o),t.mimeType=o.mimeType}catch(t){r=new MediaRecorder(e)}o.mimeType&&!MediaRecorder.isTypeSupported&&"canRecordMimeType"in r&&!1===r.canRecordMimeType(o.mimeType)&&(t.disableLogs||console.warn("MediaRecorder API seems unable to record mimeType:",o.mimeType)),r.ondataavailable=function(e){if(e.data&&d.push("ondataavailable: "+f(e.data.size)),"number"!=typeof t.timeSlice)!e.data||!e.data.size||e.data.size<100||i.blob?i.recordingCallback&&(i.recordingCallback(new Blob([],{type:n(o)})),i.recordingCallback=null):(i.blob=t.getNativeBlob?e.data:new Blob([e.data],{type:n(o)}),i.recordingCallback&&(i.recordingCallback(i.blob),i.recordingCallback=null));else if(e.data&&e.data.size&&(A.push(e.data),s(),"function"==typeof t.ondataavailable)){var r=t.getNativeBlob?e.data:new Blob([e.data],{type:n(o)});t.ondataavailable(r)}},r.onstart=function(){d.push("started")},r.onpause=function(){d.push("paused")},r.onresume=function(){d.push("resumed")},r.onstop=function(){d.push("stopped")},r.onerror=function(e){e&&(e.name||(e.name="UnknownError"),d.push("error: "+e),t.disableLogs||(-1!==e.name.toString().toLowerCase().indexOf("invalidstate")?console.error("The MediaRecorder is not in a state in which the proposed operation is allowed to be executed.",e):-1!==e.name.toString().toLowerCase().indexOf("notsupported")?console.error("MIME type (",o.mimeType,") is not supported.",e):-1!==e.name.toString().toLowerCase().indexOf("security")?console.error("MediaRecorder security error",e):"OutOfMemory"===e.name?console.error("The UA has exhaused the available memory. User agents SHOULD provide as much additional information as possible in the message attribute.",e):"IllegalStreamModification"===e.name?console.error("A modification to the stream has occurred that makes it impossible to continue recording. An example would be the addition of a Track while recording is occurring. User agents SHOULD provide as much additional information as possible in the message attribute.",e):"OtherRecordingError"===e.name?console.error("Used for an fatal error other than those listed above. User agents SHOULD provide as much additional information as possible in the message attribute.",e):"GenericError"===e.name?console.error("The UA cannot provide the codec or recording option that has been requested.",e):console.error("MediaRecorder Error",e)),function(e){if(!i.manuallyStopped&&r&&"inactive"===r.state)return delete t.timeslice,void r.start(6e5);setTimeout(void 0,1e3)}(),"inactive"!==r.state&&"stopped"!==r.state&&r.stop())},"number"==typeof t.timeSlice?(s(),r.start(t.timeSlice)):r.start(36e5),t.initCallback&&t.initCallback()},this.timestamps=[],this.stop=function(e){e=e||function(){},i.manuallyStopped=!0,r&&(this.recordingCallback=e,"recording"===r.state&&r.stop(),"number"==typeof t.timeSlice&&setTimeout((function(){i.blob=new Blob(A,{type:n(t)}),i.recordingCallback(i.blob)}),100))},this.pause=function(){r&&"recording"===r.state&&r.pause()},this.resume=function(){r&&"paused"===r.state&&r.resume()},this.clearRecordedData=function(){r&&"recording"===r.state&&i.stop(a),a()},this.getInternalRecorder=function(){return r},this.blob=null,this.getState=function(){return r&&r.state||"inactive"};var d=[];this.getAllStates=function(){return d},void 0===t.checkForInactiveTracks&&(t.checkForInactiveTracks=!1);i=this;!function o(){if(r&&!1!==t.checkForInactiveTracks)return!1===function(){if("active"in e){if(!e.active)return!1}else if("ended"in e&&e.ended)return!1;return!0}()?(t.disableLogs||console.log("MediaStream seems stopped."),void i.stop()):void setTimeout(o,1e3)}(),this.name="MediaStreamRecorder",this.toString=function(){return this.name}}function C(e,i){if(!v(e,"audio").length)throw"Your stream has no audio tracks.";var o,r=this,A=[],s=[],n=!1,a=0,d=2,l=(i=i||{}).desiredSampRate;function u(){if(!1===i.checkForInactiveTracks)return!0;if("active"in e){if(!e.active)return!1}else if("ended"in e&&e.ended)return!1;return!0}function h(e,t){function i(e,t){var i,o=e.numberOfAudioChannels,r=e.leftBuffers.slice(0),A=e.rightBuffers.slice(0),s=e.sampleRate,n=e.internalInterleavedLength,a=e.desiredSampRate;function d(e,t,i){var o=Math.round(e.length*(t/i)),r=[],A=Number((e.length-1)/(o-1));r[0]=e[0];for(var s=1;s96e3)&&(i.disableLogs||console.log("sample-rate must be under range 22050 and 96000.")),i.disableLogs||i.desiredSampRate&&console.log("Desired sample-rate: "+i.desiredSampRate);var y=!1;function w(){A=[],s=[],a=0,E=!1,n=!1,y=!1,p=null,r.leftchannel=A,r.rightchannel=s,r.numberOfAudioChannels=d,r.desiredSampRate=l,r.sampleRate=b,r.recordingLength=a,B={left:[],right:[],recordingLength:0}}function S(){o&&(o.onaudioprocess=null,o.disconnect(),o=null),m&&(m.disconnect(),m=null),w()}this.pause=function(){y=!0},this.resume=function(){if(!1===u())throw"Please make sure MediaStream is active.";if(!n)return i.disableLogs||console.log("Seems recording has been restarted."),void this.record();y=!1},this.clearRecordedData=function(){i.checkForInactiveTracks=!1,n&&this.stop(S),S()},this.name="StereoAudioRecorder",this.toString=function(){return this.name};var E=!1;o.onaudioprocess=function(e){if(!y)if(!1===u()&&(i.disableLogs||console.log("MediaStream seems stopped."),o.disconnect(),n=!1),n){E||(E=!0,i.onAudioProcessStarted&&i.onAudioProcessStarted(),i.initCallback&&i.initCallback());var t=e.inputBuffer.getChannelData(0),c=new Float32Array(t);if(A.push(c),2===d){var l=e.inputBuffer.getChannelData(1),h=new Float32Array(l);s.push(h)}a+=f,r.recordingLength=a,void 0!==i.timeSlice&&(B.recordingLength+=f,B.left.push(c),2===d&&B.right.push(h))}else m&&(m.disconnect(),m=null)},p.createMediaStreamDestination?o.connect(p.createMediaStreamDestination()):o.connect(p.destination),this.leftchannel=A,this.rightchannel=s,this.numberOfAudioChannels=d,this.desiredSampRate=l,this.sampleRate=b,r.recordingLength=a;var B={left:[],right:[],recordingLength:0};function C(){n&&"function"==typeof i.ondataavailable&&void 0!==i.timeSlice&&(B.left.length?(h({desiredSampRate:l,sampleRate:b,numberOfAudioChannels:d,internalInterleavedLength:B.recordingLength,leftBuffers:B.left,rightBuffers:1===d?[]:B.right},(function(e,t){var o=new Blob([t],{type:"audio/wav"});i.ondataavailable(o),setTimeout(C,i.timeSlice)})),B={left:[],right:[],recordingLength:0}):setTimeout(C,i.timeSlice))}}function R(e,t){if("undefined"==typeof html2canvas)throw"Please link: https://www.webrtc-experiment.com/screenshot.js";(t=t||{}).frameInterval||(t.frameInterval=10);var i=!1;["captureStream","mozCaptureStream","webkitCaptureStream"].forEach((function(e){e in document.createElement("canvas")&&(i=!0)}));var o,r,A,s=!(!window.webkitRTCPeerConnection&&!window.webkitGetUserMedia||!window.chrome),n=50,a=navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);if(s&&a&&a[2]&&(n=parseInt(a[2],10)),s&&n<52&&(i=!1),t.useWhammyRecorder&&(i=!1),i)if(t.disableLogs||console.log("Your browser supports both MediRecorder API and canvas.captureStream!"),e instanceof HTMLCanvasElement)o=e;else{if(!(e instanceof CanvasRenderingContext2D))throw"Please pass either HTMLCanvasElement or CanvasRenderingContext2D.";o=e.canvas}else navigator.mozGetUserMedia&&(t.disableLogs||console.error("Canvas recording is NOT supported in Firefox."));this.record=function(){if(A=!0,i&&!t.useWhammyRecorder){var e;"captureStream"in o?e=o.captureStream(25):"mozCaptureStream"in o?e=o.mozCaptureStream(25):"webkitCaptureStream"in o&&(e=o.webkitCaptureStream(25));try{var s=new g;s.addTrack(v(e,"video")[0]),e=s}catch(e){}if(!e)throw"captureStream API are NOT available.";(r=new B(e,{mimeType:t.mimeType||"video/webm"})).record()}else h.frames=[],u=(new Date).getTime(),l();t.initCallback&&t.initCallback()},this.getWebPImages=function(i){if("canvas"===e.nodeName.toLowerCase()){var o=h.frames.length;h.frames.forEach((function(e,i){var r=o-i;t.disableLogs||console.log(r+"/"+o+" frames remaining"),t.onEncodingCallback&&t.onEncodingCallback(r,o);var A=e.image.toDataURL("image/webp",1);h.frames[i].image=A})),t.disableLogs||console.log("Generating WebM"),i()}else i()},this.stop=function(e){A=!1;var o=this;i&&r?r.stop(e):this.getWebPImages((function(){h.compile((function(i){t.disableLogs||console.log("Recording finished!"),o.blob=i,o.blob.forEach&&(o.blob=new Blob([],{type:"video/webm"})),e&&e(o.blob),h.frames=[]}))}))};var d=!1;function c(){h.frames=[],A=!1,d=!1}function l(){if(d)return u=(new Date).getTime(),setTimeout(l,500);if("canvas"===e.nodeName.toLowerCase()){var i=(new Date).getTime()-u;return u=(new Date).getTime(),h.frames.push({image:(o=document.createElement("canvas"),r=o.getContext("2d"),o.width=e.width,o.height=e.height,r.drawImage(e,0,0),o),duration:i}),void(A&&setTimeout(l,t.frameInterval))}var o,r;html2canvas(e,{grabMouse:void 0===t.showMousePointer||t.showMousePointer,onrendered:function(e){var i=(new Date).getTime()-u;if(!i)return setTimeout(l,t.frameInterval);u=(new Date).getTime(),h.frames.push({image:e.toDataURL("image/webp",1),duration:i}),A&&setTimeout(l,t.frameInterval)}})}this.pause=function(){d=!0,r instanceof B&&r.pause()},this.resume=function(){d=!1,r instanceof B?r.resume():A||this.record()},this.clearRecordedData=function(){A&&this.stop(c),c()},this.name="CanvasRecorder",this.toString=function(){return this.name};var u=(new Date).getTime(),h=new T.Video(100)}function k(e,t){function i(e){e=void 0!==e?e:10;var t=(new Date).getTime()-a;return t?A?(a=(new Date).getTime(),setTimeout(i,100)):(a=(new Date).getTime(),n.paused&&n.play(),l.drawImage(n,0,0,c.width,c.height),d.frames.push({duration:t,image:c.toDataURL("image/webp")}),void(r||setTimeout(i,e,e))):setTimeout(i,e,e)}function o(e,t,i,o,r){var A=document.createElement("canvas");A.width=c.width,A.height=c.height;var s,n,a,d=A.getContext("2d"),l=[],u=-1===t,h=t&&t>0&&t<=e.length?t:e.length,p=0,m=0,g=0,f=Math.sqrt(Math.pow(255,2)+Math.pow(255,2)+Math.pow(255,2)),b=i&&i>=0&&i<=1?i:0,y=o&&o>=0&&o<=1?o:0,v=!1;n=-1,a=(s={length:h,functionToLoop:function(t,i){var o,r,A,s=function(){!v&&A-o<=A*y||(u&&(v=!0),l.push(e[i])),t()};if(v)s();else{var n=new Image;n.onload=function(){d.drawImage(n,0,0,c.width,c.height);var e=d.getImageData(0,0,c.width,c.height);o=0,r=e.data.length,A=e.data.length/4;for(var t=0;t127)throw"TrackNumber > 127 not supported";return[128|e.trackNum,e.timecode>>8,255&e.timecode,t].map((function(e){return String.fromCharCode(e)})).join("")+e.frame}({discardable:0,frame:e.data.slice(4),invisible:0,keyframe:1,lacing:0,trackNum:1,timecode:Math.round(t)});return t+=e.duration,{data:i,id:163}})))}function i(e){for(var t=[];e>0;)t.push(255&e),e>>=8;return new Uint8Array(t.reverse())}function o(e){var t=[];e=(e.length%8?new Array(9-e.length%8).join("0"):"")+e;for(var i=0;i1?2*A[0].width:A[0].width;var n=1;3!==e&&4!==e||(n=2),5!==e&&6!==e||(n=3),7!==e&&8!==e||(n=4),9!==e&&10!==e||(n=5),r.height=A[0].height*n}else r.width=s.width||360,r.height=s.height||240;t&&t instanceof HTMLVideoElement&&u(t),A.forEach((function(e,t){u(e,t)})),setTimeout(l,s.frameInterval)}}function u(e,t){if(!o){var i=0,r=0,s=e.width,n=e.height;1===t&&(i=e.width),2===t&&(r=e.height),3===t&&(i=e.width,r=e.height),4===t&&(r=2*e.height),5===t&&(i=e.width,r=2*e.height),6===t&&(r=3*e.height),7===t&&(i=e.width,r=3*e.height),void 0!==e.stream.left&&(i=e.stream.left),void 0!==e.stream.top&&(r=e.stream.top),void 0!==e.stream.width&&(s=e.stream.width),void 0!==e.stream.height&&(n=e.stream.height),A.drawImage(e,i,r,s,n),"function"==typeof e.stream.onRender&&e.stream.onRender(A,i,r,s,n,t)}}function h(e){var i=document.createElement("video");return function(e,t){"srcObject"in t?t.srcObject=e:"mozSrcObject"in t?t.mozSrcObject=e:t.srcObject=e}(e,i),i.className=t,i.muted=!0,i.volume=0,i.width=e.width||s.width||360,i.height=e.height||s.height||240,i.play(),i}function p(t){i=[],(t=t||e).forEach((function(e){if(e.getTracks().filter((function(e){return"video"===e.kind})).length){var t=h(e);t.stream=e,i.push(t)}}))}void 0!==n?c.AudioContext=n:"undefined"!=typeof webkitAudioContext&&(c.AudioContext=webkitAudioContext),this.startDrawingFrames=function(){l()},this.appendStreams=function(t){if(!t)throw"First parameter is required.";t instanceof Array||(t=[t]),t.forEach((function(t){var o=new d;if(t.getTracks().filter((function(e){return"video"===e.kind})).length){var r=h(t);r.stream=t,i.push(r),o.addTrack(t.getTracks().filter((function(e){return"video"===e.kind}))[0])}if(t.getTracks().filter((function(e){return"audio"===e.kind})).length){var A=s.audioContext.createMediaStreamSource(t);s.audioDestination=s.audioContext.createMediaStreamDestination(),A.connect(s.audioDestination),o.addTrack(s.audioDestination.stream.getTracks().filter((function(e){return"audio"===e.kind}))[0])}e.push(o)}))},this.releaseStreams=function(){i=[],o=!0,s.gainNode&&(s.gainNode.disconnect(),s.gainNode=null),s.audioSources.length&&(s.audioSources.forEach((function(e){e.disconnect()})),s.audioSources=[]),s.audioDestination&&(s.audioDestination.disconnect(),s.audioDestination=null),s.audioContext&&s.audioContext.close(),s.audioContext=null,A.clearRect(0,0,r.width,r.height),r.stream&&(r.stream.stop(),r.stream=null)},this.resetVideoStreams=function(e){!e||e instanceof Array||(e=[e]),p(e)},this.name="MultiStreamsMixer",this.toString=function(){return this.name},this.getMixedStream=function(){o=!1;var t=function(){var e;p(),"captureStream"in r?e=r.captureStream():"mozCaptureStream"in r?e=r.mozCaptureStream():s.disableLogs||console.error("Upgrade to latest Chrome or otherwise enable this flag: chrome://flags/#enable-experimental-web-platform-features");var t=new d;return e.getTracks().filter((function(e){return"video"===e.kind})).forEach((function(e){t.addTrack(e)})),r.stream=t,t}(),i=function(){c.AudioContextConstructor||(c.AudioContextConstructor=new c.AudioContext);s.audioContext=c.AudioContextConstructor,s.audioSources=[],!0===s.useGainNode&&(s.gainNode=s.audioContext.createGain(),s.gainNode.connect(s.audioContext.destination),s.gainNode.gain.value=0);var t=0;if(e.forEach((function(e){if(e.getTracks().filter((function(e){return"audio"===e.kind})).length){t++;var i=s.audioContext.createMediaStreamSource(e);!0===s.useGainNode&&i.connect(s.gainNode),s.audioSources.push(i)}})),!t)return;return s.audioDestination=s.audioContext.createMediaStreamDestination(),s.audioSources.forEach((function(e){e.connect(s.audioDestination)})),s.audioDestination.stream}();return i&&i.getTracks().filter((function(e){return"audio"===e.kind})).forEach((function(e){t.addTrack(e)})),e.forEach((function(e){e.fullcanvas})),t}}function j(e,t){e=e||[];var i,o,r=this;(t=t||{elementClass:"multi-streams-mixer",mimeType:"video/webm",video:{width:360,height:240}}).frameInterval||(t.frameInterval=10),t.video||(t.video={}),t.video.width||(t.video.width=360),t.video.height||(t.video.height=240),this.record=function(){var r;i=new x(e,t.elementClass||"multi-streams-mixer"),(r=[],e.forEach((function(e){v(e,"video").forEach((function(e){r.push(e)}))})),r).length&&(i.frameInterval=t.frameInterval||10,i.width=t.video.width||360,i.height=t.video.height||240,i.startDrawingFrames()),t.previewStream&&"function"==typeof t.previewStream&&t.previewStream(i.getMixedStream()),(o=new B(i.getMixedStream(),t)).record()},this.stop=function(e){o&&o.stop((function(t){r.blob=t,e(t),r.clearRecordedData()}))},this.pause=function(){o&&o.pause()},this.resume=function(){o&&o.resume()},this.clearRecordedData=function(){o&&(o.clearRecordedData(),o=null),i&&(i.releaseStreams(),i=null)},this.addStreams=function(r){if(!r)throw"First parameter is required.";r instanceof Array||(r=[r]),e.concat(r),o&&i&&(i.appendStreams(r),t.previewStream&&"function"==typeof t.previewStream&&t.previewStream(i.getMixedStream()))},this.resetVideoStreams=function(e){i&&(!e||e instanceof Array||(e=[e]),i.resetVideoStreams(e))},this.getMixer=function(){return i},this.name="MultiStreamRecorder",this.toString=function(){return this.name}}function L(e,t){var i,o,r;function A(){return new ReadableStream({start:function(o){var r=document.createElement("canvas"),A=document.createElement("video"),s=!0;A.srcObject=e,A.muted=!0,A.height=t.height,A.width=t.width,A.volume=0,A.onplaying=function(){r.width=t.width,r.height=t.height;var e=r.getContext("2d"),n=1e3/t.frameRate,a=setInterval((function(){if(i&&(clearInterval(a),o.close()),s&&(s=!1,t.onVideoProcessStarted&&t.onVideoProcessStarted()),e.drawImage(A,0,0),"closed"!==o._controlledReadableStream.state)try{o.enqueue(e.getImageData(0,0,t.width,t.height))}catch(e){}}),n)},A.play()}})}function s(e,a){if(!t.workerPath&&!a)return i=!1,void fetch("https://unpkg.com/webm-wasm@latest/dist/webm-worker.js").then((function(t){t.arrayBuffer().then((function(t){s(e,t)}))}));if(!t.workerPath&&a instanceof ArrayBuffer){var d=new Blob([a],{type:"text/javascript"});t.workerPath=c.createObjectURL(d)}t.workerPath||console.error("workerPath parameter is missing."),(o=new Worker(t.workerPath)).postMessage(t.webAssemblyPath||"https://unpkg.com/webm-wasm@latest/dist/webm-wasm.wasm"),o.addEventListener("message",(function(e){"READY"===e.data?(o.postMessage({width:t.width,height:t.height,bitrate:t.bitrate||1200,timebaseDen:t.frameRate||30,realtime:t.realtime}),A().pipeTo(new WritableStream({write:function(e){i?console.error("Got image, but recorder is finished!"):o.postMessage(e.data.buffer,[e.data.buffer])}}))):e.data&&(r||n.push(e.data))}))}"undefined"!=typeof ReadableStream&&"undefined"!=typeof WritableStream||console.error("Following polyfill is strongly recommended: https://unpkg.com/@mattiasbuelens/web-streams-polyfill/dist/polyfill.min.js"),(t=t||{}).width=t.width||640,t.height=t.height||480,t.frameRate=t.frameRate||30,t.bitrate=t.bitrate||1200,t.realtime=t.realtime||!0,this.record=function(){n=[],r=!1,this.blob=null,s(e),"function"==typeof t.initCallback&&t.initCallback()},this.pause=function(){r=!0},this.resume=function(){r=!1};var n=[];this.stop=function(e){i=!0;var t=this;!function(e){o?(o.addEventListener("message",(function(t){null===t.data&&(o.terminate(),o=null,e&&e())})),o.postMessage(null)):e&&e()}((function(){t.blob=new Blob(n,{type:"video/webm"}),e(t.blob)}))},this.name="WebAssemblyRecorder",this.toString=function(){return this.name},this.clearRecordedData=function(){n=[],r=!1,this.blob=null},this.blob=null}t.DiskStorage=I,t.GifRecorder=D,t.MultiStreamRecorder=j,t.RecordRTCPromisesHandler=function(e,i){if(!this)throw'Use "new RecordRTCPromisesHandler()"';if(void 0===e)throw'First argument "MediaStream" is required.';var o=this;o.recordRTC=new t(e,i),this.startRecording=function(){return new Promise((function(e,t){try{o.recordRTC.startRecording(),e()}catch(e){t(e)}}))},this.stopRecording=function(){return new Promise((function(e,t){try{o.recordRTC.stopRecording((function(i){o.blob=o.recordRTC.getBlob(),o.blob&&o.blob.size?e(i):t("Empty blob.",o.blob)}))}catch(e){t(e)}}))},this.pauseRecording=function(){return new Promise((function(e,t){try{o.recordRTC.pauseRecording(),e()}catch(e){t(e)}}))},this.resumeRecording=function(){return new Promise((function(e,t){try{o.recordRTC.resumeRecording(),e()}catch(e){t(e)}}))},this.getDataURL=function(e){return new Promise((function(e,t){try{o.recordRTC.getDataURL((function(t){e(t)}))}catch(e){t(e)}}))},this.getBlob=function(){return new Promise((function(e,t){try{e(o.recordRTC.getBlob())}catch(e){t(e)}}))},this.getInternalRecorder=function(){return new Promise((function(e,t){try{e(o.recordRTC.getInternalRecorder())}catch(e){t(e)}}))},this.reset=function(){return new Promise((function(e,t){try{e(o.recordRTC.reset())}catch(e){t(e)}}))},this.destroy=function(){return new Promise((function(e,t){try{e(o.recordRTC.destroy())}catch(e){t(e)}}))},this.getState=function(){return new Promise((function(e,t){try{e(o.recordRTC.getState())}catch(e){t(e)}}))},this.blob=null,this.version="5.6.2"},t.WebAssemblyRecorder=L}));class je extends we{constructor(e){super(),this.player=e,this.fileName="",this.fileType=J,this.isRecording=!1,this.recordingTimestamp=0,this.recordingInterval=null,e.debug.log("Recorder","init")}destroy(){this._reset(),this.player.debug.log("Recorder","destroy")}setFileName(e,t){this.fileName=e,G!==t&&J!==t||(this.fileType=t)}get recording(){return this.isRecording}get recordTime(){return this.recordingTimestamp}startRecord(){const e=this.player.debug,t={type:"video",mimeType:"video/webm;codecs=h264",onTimeStamp:t=>{e.log("Recorder","record timestamp :"+t)},disableLogs:!this.player._opt.debug};try{const e=this.player.video.$videoElement.captureStream(25);if(this.player.audio&&this.player.audio.mediaStreamAudioDestinationNode&&this.player.audio.mediaStreamAudioDestinationNode.stream&&!this.player.audio.isStateSuspended()&&this.player.audio.hasAudio&&this.player._opt.hasAudio){const t=this.player.audio.mediaStreamAudioDestinationNode.stream;if(t.getAudioTracks().length>0){const i=t.getAudioTracks()[0];i&&i.enabled&&e.addTrack(i)}}this.recorder=xe(e,t)}catch(t){e.error("Recorder",t),this.emit(E.recordCreateError)}this.recorder&&(this.isRecording=!0,this.emit(E.recording,!0),this.recorder.startRecording(),e.log("Recorder","start recording"),this.player.emit(E.recordStart),this.recordingInterval=window.setInterval((()=>{this.recordingTimestamp+=1,this.player.emit(E.recordingTimestamp,this.recordingTimestamp)}),1e3))}stopRecordAndSave(){this.recorder&&this.isRecording&&this.recorder.stopRecording((()=>{this.player.debug.log("Recorder","stop recording"),this.player.emit(E.recordEnd),function(e,t,i){const o=window.URL.createObjectURL(e),r=document.createElement("a");r.href=o,r.download=(t||ce())+"."+(i||J),r.click(),setTimeout((()=>{window.URL.revokeObjectURL(o)}),fe()?1e3:0)}(this.recorder.getBlob(),this.fileName,this.fileType),this._reset(),this.emit(E.recording,!1)}))}_reset(){this.isRecording=!1,this.recordingTimestamp=0,this.recorder&&(this.recorder.destroy(),this.recorder=null),this.fileName=null,this.recordingInterval&&clearInterval(this.recordingInterval),this.recordingInterval=null}}class Le{constructor(e){return new(Le.getLoaderFactory())(e)}static getLoaderFactory(){return je}}class Ue{constructor(e){this.player=e,this.decoderWorker=new Worker(e._opt.decoder),this._initDecoderWorker(),e.debug.log("decoderWorker","init")}destroy(){this.decoderWorker.postMessage({cmd:w}),this.decoderWorker.terminate(),this.decoderWorker=null,this.player.debug.log("decoderWorker","destroy")}_initDecoderWorker(){const{debug:e,events:{proxy:t}}=this.player;this.decoderWorker.onmessage=t=>{const i=t.data;switch(i.cmd){case A:e.log("decoderWorker","onmessage:",A),this.player.loaded||this.player.emit(E.load),this.player.emit(E.decoderWorkerInit),this._initWork();break;case l:e.log("decoderWorker","onmessage:",l,i.code),this.player._times.decodeStart||(this.player._times.decodeStart=ce()),this.player.video.updateVideoInfo({encTypeCode:i.code});break;case c:e.log("decoderWorker","onmessage:",c,i.code),this.player.audio&&this.player.audio.updateAudioInfo({encTypeCode:i.code});break;case s:e.log("decoderWorker","onmessage:",s,`width:${i.w},height:${i.h}`),this.player.video.updateVideoInfo({width:i.w,height:i.h}),this.player.video.initCanvasViewSize();break;case d:e.log("decoderWorker","onmessage:",d,`channels:${i.channels},sampleRate:${i.sampleRate}`),this.player.audio&&(this.player.audio.updateAudioInfo(i),this.player.audio.initScriptNode(i));break;case n:this.player.handleRender(),this.player.video.render(i),this.player.emit(E.timeUpdate,i.ts),this.player.updateStats({fps:!0,ts:i.ts,buf:i.delay}),this.player._times.videoStart||(this.player._times.videoStart=ce(),this.player.handlePlayToRenderTimes());break;case a:this.player.playing&&this.player.audio&&this.player.audio.play(i.buffer,i.ts);break;case u:i.message&&-1!==i.message.indexOf(h)&&(this.player.emit(E.error,C.wasmDecodeError),this.player.emit(C.wasmDecodeError));break;default:this.player[i.cmd]&&this.player[i.cmd](i)}}}_initWork(){const e={debug:this.player._opt.debug,forceNoOffscreen:this.player._opt.forceNoOffscreen,useWCS:this.player._opt.useWCS,videoBuffer:this.player._opt.videoBuffer,openWebglAlignment:this.player._opt.openWebglAlignment};this.decoderWorker.postMessage({cmd:b,opt:JSON.stringify(e),sampleRate:this.player.audio&&this.player.audio.audioContext.sampleRate||0})}decodeVideo(e,t,i){const o={type:m,ts:Math.max(t,0),isIFrame:i};this.decoderWorker.postMessage({cmd:y,buffer:e,options:o},[e.buffer])}decodeAudio(e,t){this.player._opt.useWCS&&!this.player._opt.useOffscreen||this.player._opt.useMSE?this._decodeAudioNoDelay(e,t):this._decodeAudio(e,t)}_decodeAudio(e,t){const i={type:p,ts:Math.max(t,0)};this.decoderWorker.postMessage({cmd:y,buffer:e,options:i},[e.buffer])}_decodeAudioNoDelay(e,t){this.decoderWorker.postMessage({cmd:v,buffer:e,ts:Math.max(t,0)},[e.buffer])}updateWorkConfig(e){this.decoderWorker.postMessage({cmd:S,key:e.key,value:e.value})}}class Fe extends we{constructor(e){super(),this.player=e,this.stopId=null,this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1,this.bufferList=[],this.dropping=!1,this.initInterval()}destroy(){this.stopId&&(clearInterval(this.stopId),this.stopId=null),this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1,this.bufferList=[],this.dropping=!1,this.off()}getDelay(e){return e?(this.firstTimestamp?e&&(this.delay=Date.now()-this.startTimestamp-(e-this.firstTimestamp)):(this.firstTimestamp=e,this.startTimestamp=Date.now(),this.delay=-1),this.delay):-1}resetDelay(){this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1,this.dropping=!1}initInterval(){this.player.debug.log("common dumex","init Interval");let e=()=>{let e;const t=this.player._opt.videoBuffer;if(this.bufferList.length)if(this.dropping){for(e=this.bufferList.shift(),e.type===p&&0===e.payload[1]&&this._doDecoderDecode(e);!e.isIFrame&&this.bufferList.length;)e=this.bufferList.shift(),e.type===p&&0===e.payload[1]&&this._doDecoderDecode(e);e.isIFrame&&(this.dropping=!1,this._doDecoderDecode(e))}else if(e=this.bufferList[0],-1===this.getDelay(e.ts))this.bufferList.shift(),this._doDecoderDecode(e);else if(this.delay>t+1e3)this.resetDelay(),this.dropping=!0;else for(;this.bufferList.length&&(e=this.bufferList[0],this.getDelay(e.ts)>t);)this.bufferList.shift(),this._doDecoderDecode(e)};e(),this.stopId=setInterval(e,10)}_doDecode(e,t,i,o){const r=this.player;let A={ts:i,type:t,isIFrame:!1};r._opt.useWCS&&!r._opt.useOffscreen||r._opt.useMSE?(t===m&&(A.isIFrame=o),this.pushBuffer(e,A)):t===m?r.decoderWorker&&r.decoderWorker.decodeVideo(e,i,o):t===p&&r._opt.hasAudio&&r.decoderWorker&&r.decoderWorker.decodeAudio(e,i)}_doDecoderDecode(e){const t=this.player,{webcodecsDecoder:i,mseDecoder:o}=t;e.type===p?t._opt.hasAudio&&t.decoderWorker&&t.decoderWorker.decodeAudio(e.payload,e.ts):e.type===m&&(t._opt.useWCS&&!t._opt.useOffscreen?i.decodeVideo(e.payload,e.ts,e.isIFrame):t._opt.useMSE&&o.decodeVideo(e.payload,e.ts,e.isIFrame))}pushBuffer(e,t){t.type===p?this.bufferList.push({ts:t.ts,payload:e,type:p}):t.type===m&&this.bufferList.push({ts:t.ts,payload:e,type:m,isIFrame:t.isIFrame})}close(){}}class Ve extends Fe{constructor(e){super(e),this.input=this._inputFlv(),this.flvDemux=this.dispatchFlvData(this.input),e.debug.log("FlvDemux","init")}destroy(){super.destroy(),this.input=null,this.flvDemux=null,this.player.debug.log("FlvDemux","destroy")}dispatch(e){this.flvDemux(e)}*_inputFlv(){yield 9;const e=new ArrayBuffer(4),t=new Uint8Array(e),i=new Uint32Array(e),o=this.player;for(;;){t[3]=0;const e=yield 15,r=e[4];t[0]=e[7],t[1]=e[6],t[2]=e[5];const A=i[0];t[0]=e[10],t[1]=e[9],t[2]=e[8];let s=i[0];16777215===s&&(t[3]=e[11],s=i[0]);const n=yield A;switch(r){case g:o._opt.hasAudio&&(o.updateStats({abps:n.byteLength}),n.byteLength>0&&this._doDecode(n,p,s));break;case f:if(o._times.demuxStart||(o._times.demuxStart=ce()),o._opt.hasVideo){o.updateStats({vbps:n.byteLength});const e=n[0]>>4==1;n.byteLength>0&&this._doDecode(n,m,s,e)}}}}dispatchFlvData(e){let t=e.next(),i=null;return o=>{let r=new Uint8Array(o);if(i){let e=new Uint8Array(i.length+r.length);e.set(i),e.set(r,i.length),r=e,i=null}for(;r.length>=t.value;){let i=r.slice(t.value);t=e.next(r.slice(0,t.value)),r=i}r.length>0&&(i=r)}}close(){this.input&&this.input.return(null)}}class Oe extends Fe{constructor(e){super(e),e.debug.log("M7sDemux","init")}destroy(){super.destroy(),this.player.debug.log("M7sDemux","destroy")}dispatch(e){const t=this.player,i=new DataView(e),o=i.getUint8(0),r=i.getUint32(1,!1);switch(o){case p:if(t._opt.hasAudio){const i=new Uint8Array(e,5);t.updateStats({abps:i.byteLength}),i.byteLength>0&&this._doDecode(i,o,r)}break;case m:if(t._opt.hasVideo&&(t._times.demuxStart||(t._times.demuxStart=ce()),i.byteLength>5)){const A=new Uint8Array(e,5),s=i.getUint8(5)>>4==1;t.updateStats({vbps:A.byteLength}),A.byteLength>0&&this._doDecode(A,o,r,s)}}}}class Me{constructor(e){return new(Me.getLoaderFactory(e._opt.demuxType))(e)}static getLoaderFactory(e){return e===o?Oe:e===i?Ve:void 0}}class Qe extends we{constructor(e){super(),this.player=e,this.hasInit=!1,this.isInitInfo=!1,this.decoder=null,this.initDecoder(),e.debug.log("Webcodecs","init")}destroy(){this.decoder&&(this.decoder.close(),this.decoder=null),this.hasInit=!1,this.isInitInfo=!1,this.off(),this.player.debug.log("Webcodecs","destroy")}initDecoder(){const e=this;this.decoder=new VideoDecoder({output(t){e.handleDecode(t)},error(t){e.handleError(t)}})}handleDecode(e){this.isInitInfo||(this.player.video.updateVideoInfo({width:e.codedWidth,height:e.codedHeight}),this.player.video.initCanvasViewSize(),this.isInitInfo=!0),this.player._times.videoStart||(this.player._times.videoStart=ce(),this.player.handlePlayToRenderTimes()),this.player.handleRender(),this.player.video.render({videoFrame:e}),this.player.updateStats({fps:!0,ts:0,buf:this.player.demux.delay}),setTimeout((function(){e.close?e.close():e.destroy()}),100)}handleError(e){this.player.debug.log("Webcodecs","VideoDecoder handleError",e)}decodeVideo(e,t,i){if(this.hasInit){const o=new EncodedVideoChunk({data:e.slice(5),timestamp:t,type:i?Y:H});this.decoder.decode(o)}else if(i&&0===e[1]){const t=15&e[0];if(this.player.video.updateVideoInfo({encTypeCode:t}),t===L)return void this.emit(C.webcodecsH265NotSupport);this.player._times.decodeStart||(this.player._times.decodeStart=ce());const i=function(e){let t=e.subarray(1,4),i="avc1.";for(let e=0;e<3;e++){let o=t[e].toString(16);o.length<2&&(o="0"+o),i+=o}return{codec:i,description:e}}(e.slice(5));this.decoder.configure(i),this.hasInit=!0}}}const We={play:"播放",pause:"暂停",audio:"",mute:"",screenshot:"截图",loading:"加载",fullscreen:"全屏",fullscreenExit:"退出全屏",record:"录制",recordStop:"停止录制"};var Ge=Object.keys(We).reduce(((e,t)=>(e[t]=`\n \n ${We[t]?`${We[t]}`:""}\n`,e)),{}),Je=(e,t)=>{const{events:{proxy:i}}=e,o=document.createElement("object");o.setAttribute("aria-hidden","true"),o.setAttribute("tabindex",-1),o.type="text/html",o.data="about:blank",ue(o,{display:"block",position:"absolute",top:"0",left:"0",height:"100%",width:"100%",overflow:"hidden",pointerEvents:"none",zIndex:"-1"});let r=e.width,A=e.height;i(o,"load",(()=>{i(o.contentDocument.defaultView,"resize",(()=>{e.width===r&&e.height===A||(r=e.width,A=e.height,e.emit(E.resize))}))})),e.$container.appendChild(o),e.on(E.destroy,(()=>{e.$container.removeChild(o)})),e.on(E.volumechange,(()=>{!function(e){if(0===e)ue(t.$volumeOn,"display","none"),ue(t.$volumeOff,"display","flex"),ue(t.$volumeHandle,"top","48px");else if(t.$volumeHandle&&t.$volumePanel){const i=he(t.$volumePanel,"height")||60,o=he(t.$volumeHandle,"height"),r=i-(i-o)*e-o;ue(t.$volumeHandle,"top",`${r}px`),ue(t.$volumeOn,"display","flex"),ue(t.$volumeOff,"display","none")}t.$volumePanelText&&(t.$volumePanelText.innerHTML=parseInt(100*e))}(e.volume)})),e.on(E.loading,(e=>{ue(t.$loading,"display",e?"flex":"none"),ue(t.$poster,"display","none"),e&&ue(t.$playBig,"display","none")}));const s=i=>{let o=!0===(r=i)||!1===r?i:e.fullscreen;var r;ue(t.$fullscreenExit,"display",o?"flex":"none"),ue(t.$fullscreen,"display",o?"none":"flex")};try{se.on("change",s),e.events.destroys.push((()=>{se.off("change",s)}))}catch(e){}e.on(E.webFullscreen,(e=>{s(e)})),e.on(E.recording,(()=>{ue(t.$record,"display",e.recording?"none":"flex"),ue(t.$recordStop,"display",e.recording?"flex":"none")})),e.on(E.recordingTimestamp,(e=>{})),e.on(E.playing,(e=>{ue(t.$play,"display",e?"none":"flex"),ue(t.$playBig,"display",e?"none":"block"),ue(t.$pause,"display",e?"flex":"none"),ue(t.$screenshot,"display",e?"flex":"none"),ue(t.$record,"display",e?"flex":"none"),ue(t.$fullscreen,"display",e?"flex":"none"),e||t.$speed&&(t.$speed.innerHTML=be(""))})),e.on(E.kBps,(e=>{const i=be(e);t.$speed&&(t.$speed.innerHTML=i)}))};function Ne(e,t){void 0===t&&(t={});var i=t.insertAt;if(e&&"undefined"!=typeof document){var o=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===i&&o.firstChild?o.insertBefore(r,o.firstChild):o.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}Ne('@keyframes rotation{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}.jessibuca-container .jessibuca-icon{cursor:pointer;width:16px;height:16px}.jessibuca-container .jessibuca-poster{position:absolute;z-index:10;left:0;top:0;right:0;bottom:0;height:100%;width:100%;background-position:50%;background-repeat:no-repeat;background-size:contain;pointer-events:none}.jessibuca-container .jessibuca-play-big{position:absolute;display:none;height:100%;width:100%;background:rgba(0,0,0,.4)}.jessibuca-container .jessibuca-play-big:after{cursor:pointer;content:"";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:block;width:48px;height:48px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACgklEQVRoQ+3ZPYsTQRjA8eeZZCFlWttAwCIkZOaZJt8hlvkeHrlccuAFT6wEG0FQOeQQLCIWih6chQgKgkkKIyqKCVYip54IWmiQkTmyYhFvd3Zn3yDb7szu/7cv7GaDkPEFM94PK0DSZ9DzDAyHw7uI2HRDlVJX5/N5r9FoHCYdr/fvCRiNRmpJ6AEidoUQ15NG+AH8BgD2n9AHANAmohdJQfwAfgGA4xF4bjabnW21Whob62ILoKNfAsAGEd2PU2ATcNSNiDf0/cE5/xAHxDpgEf0NADaJ6HLUiKgAbvcjpdSGlPJZVJCoAUfdSqkLxWLxTLlc/mkbEgtgET1TSnWklLdtIuIEuN23crlcp16vv7cBSQKgu38AwBYRXQyLSArg3hsjRDxNRE+CQhIF/BN9qVAobFYqle+mkLQAdLd+8K0T0U0TRJoAbvc9fVkJId75gaQRoLv1C2STiPTb7rFLWgE6+g0RncwyYEJEtawCvjDGmpzzp5kD6NfxfD7frtVqB17xen2a7oG3ALBm+oMoFQBEPD+dTvtBfpImDXjIGFvjnD/3c7ksG5MU4HDxWeZa0HB3XhKAXcdxOn5vUi9gnIDXSqm2lHLPK8pkfVyAbSLqm4T5HRs1YB8RO0KIid8g03FRAT4rpbpSyh3TINPxUQB2GGM9zvkn05gg420CJovLZT9ISNA5tgB9ItoOGhFmnh/AcZ/X9xhj65zzV2Eiwsz1A1j2B8dHAOgS0W6YnduY6wkYj8d3lFKn/j66Ea84jtOrVqtfbQSE3YYnYDAY5Eql0hYAnNDv6kKIx2F3anO+J8DmzqLY1goQxVE12ebqDJgcrSjGrs5AFEfVZJt/AF0m+jHzUTtnAAAAAElFTkSuQmCC");background-repeat:no-repeat;background-position:50%}.jessibuca-container .jessibuca-play-big:hover:after{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACEElEQVRoQ+2ZXStEQRjH/3/yIXwDdz7J+i7kvdisXCk3SiFJW27kglBcSFFKbqwQSa4krykuKB09Naf2Yndn5jgzc06d53Znd36/mWfeniVyHsw5PwqB0DOonYEoijYBlOpAFwCMkHwLDS/9mwhEDUCfAAyTXA4tYSLwC6CtCegegH6S56FETAR+AHRoACcBTJAUWa+RloBAXwAYIrnt0yBNgZi7qtbHgw8RFwLC/QFglOScawlXAjH3gUqrE1cirgVi7mkAYyS/0xbxJSDcdwAGSa6nKeFTIOZeUyL3aYiEEBDuLwDjJGf+KxFKIOY+BdBL8iipSGiBmHtWbbuftiJZERBuOfgGSK7aSGRJIObeUml1ayKSRQHhlgtkiaTcdltGVgUE+ppkV54FaiS78yrwqlLoOI8Cch2XV548W7WRpTVwA6DP9kGUFYEpAOUkT9LQAvtq1M+0udKkQSgBqSlJWWYxKXj8vRACK+o6bbRIdYI+Ba7U7rKjg7L53JdAhWTZBsy0rWuBXZUuNVMg23auBF7UIl2yBbJt70JAoKV6/WwLk6R9mgKSJlJ1kLTxFmkJyCla8UZd15GJQKvyumyJ8gy8DAEvfZoINPqD41EtUjmUgoaJwAaAnjrKebVI34OSq85NBNqlCAWgE0CV5GEWwI3vQlmCbcSinYFCwPEIFDPgeIC1P1/MgHaIHDf4Aydx2TF7wnKeAAAAAElFTkSuQmCC")}.jessibuca-container .jessibuca-loading{display:none;flex-direction:column;justify-content:center;align-items:center;position:absolute;z-index:20;left:0;top:0;right:0;bottom:0;width:100%;height:100%;pointer-events:none}.jessibuca-container .jessibuca-loading-text{line-height:20px;font-size:13px;color:#fff;margin-top:10px}.jessibuca-container .jessibuca-controls{background-color:#161616;box-sizing:border-box;display:flex;flex-direction:column;justify-content:flex-end;position:absolute;z-index:40;left:0;right:0;bottom:0;height:38px;padding-left:13px;padding-right:13px;font-size:14px;color:#fff;opacity:0;visibility:hidden;transition:all .2s ease-in-out;-webkit-user-select:none;user-select:none;transition:width .5s ease-in}.jessibuca-container .jessibuca-controls .jessibuca-controls-item{position:relative;display:flex;justify-content:center;padding:0 8px}.jessibuca-container .jessibuca-controls .jessibuca-controls-item:hover .icon-title-tips{visibility:visible;opacity:1}.jessibuca-container .jessibuca-controls .jessibuca-fullscreen,.jessibuca-container .jessibuca-controls .jessibuca-fullscreen-exit,.jessibuca-container .jessibuca-controls .jessibuca-icon-audio,.jessibuca-container .jessibuca-controls .jessibuca-microphone-close,.jessibuca-container .jessibuca-controls .jessibuca-pause,.jessibuca-container .jessibuca-controls .jessibuca-play,.jessibuca-container .jessibuca-controls .jessibuca-record,.jessibuca-container .jessibuca-controls .jessibuca-record-stop,.jessibuca-container .jessibuca-controls .jessibuca-screenshot{display:none}.jessibuca-container .jessibuca-controls .jessibuca-icon-audio,.jessibuca-container .jessibuca-controls .jessibuca-icon-mute{z-index:1}.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom{display:flex;justify-content:space-between;height:100%}.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom .jessibuca-controls-left,.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom .jessibuca-controls-right{display:flex;align-items:center}.jessibuca-container.jessibuca-controls-show .jessibuca-controls{opacity:1;visibility:visible}.jessibuca-container.jessibuca-controls-show-auto-hide .jessibuca-controls{opacity:.8;visibility:visible;display:none}.jessibuca-container.jessibuca-hide-cursor *{cursor:none!important}.jessibuca-container .jessibuca-icon-loading{width:50px;height:50px;background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%;animation:rotation 1s linear infinite}.jessibuca-container .jessibuca-icon-screenshot{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAE5UlEQVRoQ+1YW2sdVRT+1s7JxbsoVkEUrIIX0ouz15zYNA+N1RdtQfCltlUfvLbqL/BCwZ8grbHtizQqPojgBSr0JkiMmT2nxgapqBURtPVCq7HxJCeZJVPmxDlzZubMmXOSEsnAvOy917fXt9e39tp7E5b4R0vcfywTuNgRbBgBx3HuJqLVzPzmYjprjHkcwAlmLqXNm4XAISLaSESPaq2HF4OE67rbRGRYRA7btn1fbgLGmKsA/Azg0gBkGzO/vZAkHMd5hIiqc5wHcCMz/5k0Z2oExsfHV1QqldPAf8lORNu11m8tBAljzFYAYWxRSl1vWdZvuQj4RsYYF4AVBlgIOVVlE55HRIxt23ZuCfmGjuOsJ6LPoiAistW27XfaEYmIbOYhPc9bXywWR1oiEJDYQkR1zrYjEjGyqfqbKd8a7kJVtLgQ+30i8pht2wfyRKIdmJkJBPkQTbILfudJ7CTZNBvVpggEcgpvc/ML38zESbLJsxBNE/A9biX0rdjGyTQXgbxyapdsarb0PMlXtWnGoXbKpm0Essqp3bJpK4E0OXmed3+hUBDP8w5FI91M0rdcyLLILElOCbaZilSWeXMncRx4klTCY1spfG3dhZJWx3GcDUR0EEB3ZMw0ET2gtT6SZWWzjmlrBIJCl0hAKfWgZVmHszqXZVxbCSxpCS2JJA6umIhe8ZKKVLPbaBJ+S9toqVRa53nedgAbAKwIwH4FcAzAa0R0l4i8F7PPz189k6RFRA+LyNcAXojDV0oNW5b1eW4Cxpg9AHZkSaaa6hhzb065uDSCH2LmRB8Sk9gY4293g43Qo/1pV80m8yQMfZSZ781cB1zXHRKRZ2IMpgD8A+DamL4ZItqitX4/jbQx5iEA7wLoihn3V/ACckWMJN/QWj9b1x5tGBsbW6uUOh5pPy0iL3Z2dn6ilJqanp5ep5TaJSLhF4NppdRNaU8gPmapVLrO87yfIoXuWyJ6uVKp+HmFjo6OQSJ6FcBtYT+UUmstyxqvkWuUgDFmP4AnQu2/e563qlgs+u9DNZ8xZhRAX7VRRPbath0XuXk7Y8xeAE+FgL6fnJzsHRwcLIfBR0ZGLunq6poAsDLUvp+Zw7b1r9PGmJMAbg8Z7WDmoThZuK67WkS+DD18fcPMdzSQUBR/EzN/nIC/SUQ+DPXV4dclsTHmHAD/SfHCNzc3t7Kvr++HJKeMMacA3BL0nyuXyzcPDAxMxo0fHR29slAo/Ajg6qD/fE9Pzw29vb1/x42fmJi4vFwu+5G/LOg/y8zXNJLQ2dAES5JANMQ7mfn1jBI6ycx3NiMhItqstf4oAX+ziHwQ6qvDj5NQNIn/ALCKmX+JSeIvABRD7fuY+ekGBPYBeDI05tTMzExvf3+/vz2Hk91/ET8RSeI6/DoCpVJpjed5fmKGvzMAXpqdnT3oed5Ud3d3v4jsAqBr9Ei0Rmv9VRqBBPzvROQVETnq2xJRdRu9tRF+bCVOKWT+Kvl/TSIFk6SW/LAjKfjV5K8rZABi8dOOEv7FI7Z8x6zwEWbemLbyMfJr5qiSiJ96oclymBOR3bZtP9+M89WxxpjdAHY2sN3DzM8ljWl4I3Nd9x7/OE1ENcdpETnmH3e11n41zv0l4J8RkU+J6AAz+xtF4teQQG7PFslwmcAiLfSyhC72Qv9/I/Avns2OT7QJskoAAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-screenshot:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAED0lEQVRoQ+2ZycsdRRTFf2ejqHFAMQqiYBTUoElUHLNx3GgCgpuYRF2o0UT9CxwQ/BMkMSbZSKLiQgQHUDCJgjiAxiEiESdEcJbEedgcKaj3UV+/6q7u/jovPPkK3qbr1ql76p5bt6qemPKmKfefeQKHOoLFCNg+H1gi6fFJOmv7VmCvpD1N87Yh8ApwNXCzpB2TIGF7DRDm2inpmt4EbB8LfAMcGUHWSHryYJKwfRMwmuMP4BRJv9TN2RgB2wuB72BWsq+V9MTBIGF7NZBiGzhJ0o+9CIRBtt8FLqgADC6nRDbpVO9Iuqi3hCKB5cDrGZDVkp4aIhIV2aSQyyW9MScCkcQqIOfsnCORkc3I31b5VtyFRmg1IQ7dt0ja3icSQ2C2JhAjUU2ykd+dE7tBNp2i2olAJJFuc+nCt564QTadF6IzgUhiVGiqyinKaQjZpJP2ItBXTkPJZhACXeU0pGwGI9BWTkPLZlACBTldG4o5EA6E1dY66edcyNrs8Q36zg1vVaTazNs7iXPgDVJJzYs7VRvHRzaDEohyugJ4CTi84sg/wHWSdnVxsGQ7aQLXS9pZcqpL/6AEplpCU5HE8YpJ9YrXUKQ6baN1+HPaRm1fBqwFQnKGK2ZoPwCvAo8Ai4FnMpPMHMwapHUj8DFwbw3+Dklv9iZgexOwvktSRduxU2VDlErwmyXV+lCbxLbDdndlCT3TX3vV7JgnKfRuSVflfMkSsL0ZuDMz4E/gL+CETN+/wCpJzzaRtn0D8DRwWMbu1/gCcnSm7zFJd1W/jxGwvQx4r2IYnlbuA14GAomQFw8B6YtBKFSnNj2BxEJ3IvB1pdB9CjwQ8yqYhcg/DJxZ8WOZpA/SbzkC24DbEqOfgPMkBRKzmu23gEuSj1sk5SI3Y2J7C3BHMuZz4FxJf6fgto8APgIWJd+3SUrHjr9O294HnJUMWi8pSGqs2V4CvJ88fH0i6eyChKr4KyS9WIO/Ang+6RvDz0XgABCeFEdtkaQv65yy/QVweuwPY0+T9FuNQ8cAXwHHxf7wdHiypN9r7BfEl8GjYv9+SceXJLQ/mSDYTh2Baog3SHq0pYT2STqno4RWSnqhBn8l8FzSN4bfJol/jkn8bXUS228DFyfft0paVyCwFbg9sQkSDEkctueZZju8iO+tJPEYfo7A0piYKd73wP3xnB+20cvjNnphxdmlkj4sEMjhfwY8COyOY0fb6Bkl/K6FLKxS+M1KpDhJY8mvrG5doRwlf66QZfGbjhLh4pEt35kV3iUp/IvTunU8qtTil/7gaHOY2yjpntaez9b5RmBDYewmSXfX2RRvZLYvbThOh+NuqMa9Ww1+yLnXgO2SwkZR24oEens2oYHzBCa00PMSOtQL/f+NwH+Hg8hAnbrYgQAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-play{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACgklEQVRoQ+3ZPYsTQRjA8eeZZCFlWttAwCIkZOaZJt8hlvkeHrlccuAFT6wEG0FQOeQQLCIWih6chQgKgkkKIyqKCVYip54IWmiQkTmyYhFvd3Zn3yDb7szu/7cv7GaDkPEFM94PK0DSZ9DzDAyHw7uI2HRDlVJX5/N5r9FoHCYdr/fvCRiNRmpJ6AEidoUQ15NG+AH8BgD2n9AHANAmohdJQfwAfgGA4xF4bjabnW21Whob62ILoKNfAsAGEd2PU2ATcNSNiDf0/cE5/xAHxDpgEf0NADaJ6HLUiKgAbvcjpdSGlPJZVJCoAUfdSqkLxWLxTLlc/mkbEgtgET1TSnWklLdtIuIEuN23crlcp16vv7cBSQKgu38AwBYRXQyLSArg3hsjRDxNRE+CQhIF/BN9qVAobFYqle+mkLQAdLd+8K0T0U0TRJoAbvc9fVkJId75gaQRoLv1C2STiPTb7rFLWgE6+g0RncwyYEJEtawCvjDGmpzzp5kD6NfxfD7frtVqB17xen2a7oG3ALBm+oMoFQBEPD+dTvtBfpImDXjIGFvjnD/3c7ksG5MU4HDxWeZa0HB3XhKAXcdxOn5vUi9gnIDXSqm2lHLPK8pkfVyAbSLqm4T5HRs1YB8RO0KIid8g03FRAT4rpbpSyh3TINPxUQB2GGM9zvkn05gg420CJovLZT9ISNA5tgB9ItoOGhFmnh/AcZ/X9xhj65zzV2Eiwsz1A1j2B8dHAOgS0W6YnduY6wkYj8d3lFKn/j66Ea84jtOrVqtfbQSE3YYnYDAY5Eql0hYAnNDv6kKIx2F3anO+J8DmzqLY1goQxVE12ebqDJgcrSjGrs5AFEfVZJt/AF0m+jHzUTtnAAAAAElFTkSuQmCC") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-play:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACEElEQVRoQ+2ZXStEQRjH/3/yIXwDdz7J+i7kvdisXCk3SiFJW27kglBcSFFKbqwQSa4krykuKB09Naf2Yndn5jgzc06d53Znd36/mWfeniVyHsw5PwqB0DOonYEoijYBlOpAFwCMkHwLDS/9mwhEDUCfAAyTXA4tYSLwC6CtCegegH6S56FETAR+AHRoACcBTJAUWa+RloBAXwAYIrnt0yBNgZi7qtbHgw8RFwLC/QFglOScawlXAjH3gUqrE1cirgVi7mkAYyS/0xbxJSDcdwAGSa6nKeFTIOZeUyL3aYiEEBDuLwDjJGf+KxFKIOY+BdBL8iipSGiBmHtWbbuftiJZERBuOfgGSK7aSGRJIObeUml1ayKSRQHhlgtkiaTcdltGVgUE+ppkV54FaiS78yrwqlLoOI8Cch2XV548W7WRpTVwA6DP9kGUFYEpAOUkT9LQAvtq1M+0udKkQSgBqSlJWWYxKXj8vRACK+o6bbRIdYI+Ba7U7rKjg7L53JdAhWTZBsy0rWuBXZUuNVMg23auBF7UIl2yBbJt70JAoKV6/WwLk6R9mgKSJlJ1kLTxFmkJyCla8UZd15GJQKvyumyJ8gy8DAEvfZoINPqD41EtUjmUgoaJwAaAnjrKebVI34OSq85NBNqlCAWgE0CV5GEWwI3vQlmCbcSinYFCwPEIFDPgeIC1P1/MgHaIHDf4Aydx2TF7wnKeAAAAAElFTkSuQmCC") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-pause{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABA0lEQVRoQ+1YwQqCUBAcfWXXsLr2AXWTPXno8yVB8AP6Aa3oHI+kCDqYaawJljSe133uzO44bx0M/HEG/v1gAd9mkAyQgY4I/F8LJUlyrQFtD2AtIkcNoFEU+Z7n7QD4DfFHEVlocrVmgAUAIAOl3mILPcDgEFcUhyrUKMGUUcroc3NQRimj9XJBGaWMvvPydKN0o6/9QTdKN6rZANxj6EbpRulGuZnjYqs8BbyR8Ub2Izeys+u6yyAIDpo/ehzHM2NMDsA0xFsRmWhyfTIDWSXxCEBmrd2EYXjSHJqm6bQoii2AOYBL5Z0xgFxEVppcrQvQJO0zhgX0iXbdWWSADHRE4AZQ731AhEUeNwAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-pause:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAA7klEQVRoQ+2YSwrCQBBEX6HiVvxsPYDewfN7By/gD9ciQkvERQwJdBSiYs0mEDo96aruombEjy/9+P/jAj7NoBkwA28i8H8tFBFRA9oeWEo6ZgCNiDGwAYpn3TpKmmVytWbABQBmoNRbbqEHGB7iiuJYhRol2DJqGX1uDsuoZdRmLuNZSzGWUcuoZdRHSp/IylNgK2ErYSthK3FHwLcSvpXIjoLt9Jfa6TMwl3TIMBkRE2AH9BriL5KGmVyvWIltJXEfKN6tJJ0ym0bECFgDU+Ba+WZQFCdpkcnVuoBM0i5jXECXaNftZQbMwJsI3AAPN3dAQflHegAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-record{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC+UlEQVRoQ+1ZS2sTURT+zlDJYE3XSq219QHVuEjnJDT+Bff9Abqw2voAEfGxqygUqWhVFHGl/yMLu9BwByxk5SNI66ML6U7axjhHbmhgWiftncxoOiV3FcI53z3f/e65594zhIQPSnj86BBot4IdBToKRFyBnbeFlFIScVEiuYvIWC6Xe2YK8pcC7SYA4CMzH4mDQBXAqilQBDsLQLfPf9FxnF4i8kwwmypARI+Wl5dvmIBEsUmlUkNE9NaHsVCpVAZGR0d/m+A2JSAid3K53E0TkCg2pVKpz7KseR/GfKVSGYxMAMA0M1+JEpyJb6lUOm5ZVnkrAsVisaunp+esiByr1Wp3R0ZGvmifzZK4XQQWHMc52MgBpdQuAOcAXABwuB400ZTjONdaIjA7O5u2bVsnWU1EujzP+5nP5xdMVjvIJkCBD8x8VCm1G8AYgAkAAxt8Z5j5YmgCSqlTAJ4D2OcD/AXgATNfbYVEAIFPIvKKiE4D6GuCea8xX6gtpJT6DmBvECgRFRzHeROWRAABE4iWCbwHEFhkPM/L5vP5dyaz+23+KwHXdR3P854S0YG1ILSCuthNMfNM2OC1/RYENLY+ygcBnPfht6ZAA6BYLNr6dyqVokKhsGpaNQ2TWJstreXaE2aed133sojcj41AKyvdzCdAgSXLsk4MDw9/a/i4rntbRPxFNZoC/5jAV2be759DKTUJ4FZSFFi0bbs/k8noy2R9dAjEuWU2YgXkQOK3kD6BMsysi2Z9JC2Jdcw/ALzwPO+xvmcl7Rj177JVEbkO4BARjSflFDJJuW1dBxJPoCIiL4noDIB1BS0pW6j+oJmbm+uuVqvjRKQfLr0bZHnIzJf0f6HeAybahrUJqAPruhLlcnnPysqKfpXp11n/Gv62zoHAroS+AafT6QkiGrIsazKbzX7eVIHEt1US39gCkOzWYthkjNE+tuZujDGZQ8XRXn8N4KT5lLFZ6uaYPt+nwyDuvC80YdhvB9uOAu1WoaNAR4GIK/AHvdr+QAexB7EAAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-record:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACfUlEQVRoQ+2ZSYsUQRCFvycK4nJXXEbHBdwO4kn/gv9CD467ICIutxEFkREdFUU86T/xojcPntyQcT2INw+uISFVkD1Wd2dWlU7nUHlqisiX+fJFZGREi8yHMt8/HYG5VrBToFOg4QnMPxcyM2t4KE2nT0i6EwvylwIjQOCFpE1tEPgGfI0FamC3AFgazP8IrJL0KwZzkAI3gLMxIA1ttgCPA4w3wHpJP2NwBxG4KOlcDEgTGzNbA8wEGP57vA0CU5JONtlczFwz2wY8HUbAzBYCB4CtwCVJb33OIAXmioC70LoyBsxsEXAQOApsLIhelnS6FgEzW+5BBvwA/FS+SPJFa40KBZ5L2mxmS4AJ4IjHxCzwaUnHkgmY2V7gLrAyAPwOXJN0qg6DCgIvgQfAPsDjo2pcKddLciEz+wCs6AO6W9KjVBIVBGIgahN4BvRLMjslPYlZPbT53wR2AbeBtcUmXEFPdh5U06mbd/shBBzbr/Jx4FCAX0+BEsDMFocEYrNmFcE+BD4XsXZL0oyZnQCutkagzkn3m1NBwDe/Q9L74MAuFEqUn5op8I8JvJO0elacTALnc1HAH3Njkvwx+WeYWUegTa/pwaqIgexdyIN4uyRPmqULZRXEvulPwD3gpr+zcrtGQxfzRHYG2AAczuUWiom3kc4D2RN4BdwH9gM9CS0XFyoLGu9UuN974eIFVDiuSzruH5LqgRhtU20q8kBPV8LMlhVVmVdnYwX+SMdAZVeieAF7eeltmElJr4cpkH1bJfvGVvatxdR4bMu+teZuWxtKxWncXn8I7EldtQV7vz79fp9KwZp//9CksB8F206BuVahU6BToOEJ/Ab7+KdABdTt8AAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-recordStop{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-recordStop:hover{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreen{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAHTElEQVRoQ+1Zb4xcVRX/nZl5u2/LrrO0EFKoBYpVaRu3u/e+3WlDZJdIRLQhNLIiEggxqURIjGmqTTAmWiRpjH4wghq+KIQYupYQEvEDmEVdyu7OfbPbzQaEYqtSwTb4Z3aV7s6b9445mzvm7XRm3oy7oanZ82ny5txzz++ec8+/S7jIiS5y/bEG4EJbcJkFpqenryqXy6cbKBUB+AeANIBuAG8AuAzAn06ePOkNDw+H9dZOTU11h2H4EwB7ALwL4FIA7wFw7O9aSxkAE9H9SqnHazGc50LGGFFQlGuW/pbNZq/aunXrYtICY8xmAD8C8HEAnUn8sf9/oLX+SiKAQqFweRRFvwewvgbzmwA+BOAkgEsAZAG85rpubseOHaVmlTHGfBTAYwA6gKU7WCaiOWaWPT9mv1eLO6S1/mYiAGPMddYtUtXMRPRVx3F+FkXRup07d/7FGDMEYExrHTSrfIVvfHx8Uy6XO22MWae1fu/IkSPpbdu2pRcWFmpakYgeVEo92gyAdQCKADI1HZL581rrp4lIfHPV6Pjx45cEQfCvBgL3a62/nwhgZmbm0lKp9OeYf56rMqmc9v4oikb6+/v/uhoIGigvAUGChdBBrfXhRAD5fL6XiCZsZDhHRAeY+VBVlIiYeTQMw725XG5uJSDqKc/M9xDR1wFsF/lEdKdS6ulEABMTExvS6fQMgCsBhPPz825nZ+dnieinANrjApj5mSAI7t61a9fC/+JSDZS/t62t7WgQBH+0IVoA7GsqjDIz+b4vCyXcnSuXy9fmcrkz+Xz+TgB3ENHeqlN43HXdB7dv3x60AqKR8p7nPXHixIn2YrEo7itRipn5057n/SrRAhbA320eEAGbtdbvyvfJycn16XR6BIBEnzg9PD8//63BwcGwGRBJylcEG2MkbEtUFAS3NgVAmI0xkl23Wt/bppR6rSK0UChcGUXRcwBUFYjDWuuDSffBHpBk82XEzPfKyVc+Wlf+HQDJGQLgDs/zjiZawJrudQBXAzirlNpIRMs2nJiY+HA6nRYQH4kJ7NZaS/htSBLlgiB4jJnFJZeoWnn7jYwxDxCRJK/LmXnI87yXEgHEzHs2m81urlce5PP5fiL6BYAPAmhrJZmNjo5murq6ngdwcy3lK0rKYc7Nze1n5gNE9Cml1HgiAGviguu6A0nlge/7N83Nzf12aGionHTy1f+Pjo5KdBuOu00tGZKpmfmHAJ5oygJjY2Nd3d3di0nKt6rwSvjFK6Iocnp7e/+ZaIGVbHSh1q51ZBfq5Cv7rllgzQIrPIGLwoUkqdVLqssASCKbnp6+ure3VyrSRGLmVHWpkbioRYbx8fErHMcZbKofsGMVKRHu01pLc1+XJMGUSqXPEdGTrZQSIlAycVdX1+FSqXRw9+7dUvXWJFE+k8lI53e71vrZphKZMeYPMvvJZDK3SfNea1GsZpoH8EWl1NFmLTE7O9u2sLDwNoANAA65rvtwrcw/NTV1TRiGp2w/8AXP836eCMAWWicAXENEvymXy/sGBgakvP4v1ajnzzDzl7TWzyX1A1KquK4r7hkf2xxQSn2vem2sHwijKLqlv7//xUQAtpyW6YBMJUJm3hNvJBo0I3XL3fim1kVfAHB9/Dsz3+95nkztlsgClYr1BgBRKpW6oa+v75VEAMJgjDkrNbj8jndCzXZSSXfU930l/bRtWyvsC+KKAEYq98kYIzy3W4abtNajiQCsBQTAByzzsNZ6ZLWUrygwOTl5YyqVEgXjriQjzVcdx9nb09Nz1vf9F5j5EzK5Y+ZBz/NeTgRw7Nixjra2NpkLycBW5jK3OY7zUq2hU6NmJMkK8r/v+3uYWXrsZdMOAM86jnN3EAS/BjAgjgDgy1rrHycCsBNkCZ9X2DtwIxGNVS9cqfLWPalQKNzFzN8GcK2dQCxtRUTSxPQx827L+13P876WCMA27W8BOG82Wlm8GsrHZNHIyEhqy5YtvwTwyXqWI6KHlFKPJAKwYVSiULVZl9aupvJxZexIU+J8TRBE9B2l1DcSAdjLKneg1nh9fzabfbRYLG4qlUpvd3R0bCqXy7tOnTr1VKOHjVqb2jC5j4gmwzAM0+l0OgzDVCqVkvGhuO8yYuZHPM97KBGA7/vXM/O0TBpqMMvo+x17waWGkhLgMrGK1vrJpCRWkRcrD+STvCvIXiJLhgNdddzoAa21vCmcR8uKOWPMRgBSPrRSpcpY8T6l1FNJ0UfeBTKZjNyxlqg60cUXL1PUupBsIO9XMkqX96v4mFvcS0Z+Mg86TUTtzCxvCh1E9BmllPxXk+zrzxQRzTBzJxG5zCzuIjJ32DG+WCOuk1hFqoKlfNSMBWSU5zDzFnEPInqLmSWpbZANARzRWr8jQHt6ev4tAuX34uLi+iiKiknjdskzlepzdna2s729PSgWi24YhuszmYxn99sYRdHSGx0RnUmlUqf7+vqO1zuYVlylJbO/X8xrAN6vk15zoQt90v+3FvgPXUePXrKTg9MAAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreen:hover{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreenExit{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAADd0lEQVRoQ+2Zz2sdVRTHv+fJBDW6anDVXen6wZszYxYBiYgtFGst3VSDunKjpS0GpUlqfjVpsVVs6aaL0or4YxMVFCJZ2ZLdPUP+gq5bQnTxtNAkfTnlhnnlkmQy9yV9780rudt77tzv5/y4v4bQ4Y06XD/2ANodwec/AiJygJnvtdvTWfPnRkBEJAiCN8rl8kMfiPn5+Ve7u7v3rays0Orq6lJfX99/PuN2auMDoAD+BvA2M6/mTWSMOUtE48D6AjHGzN/kjdlNvy+AnWOOmQ/lTSYiEwDOWzsimgrDcCRvzG76GwGw8/zJzO9sN6GInAMwbW1UdSSKoqndCMwb6wNwGsB39Q+p6h/M/C4R2dTa1AoHYBWKyCkA1+pqiWi2Wq0e7e/vf7yRoJAAKcQggMtuJKIoOtoxACnE0/xOi/SXMAxPuhCFjUBdpIjYVWXSEf0TM3/g9BeriDMKdSPEz8z8vrU1xgwT0YXCrEJZy1iSJKOqOub0/8jMA0mSfKKqNwoPkHp7ioiGHIhRIvpHVa93BEBa2JcAfOlALAHo6RgAKzRJkk9V1S6xL7kpV4idOM31taxaIKJHqmpPnMMA9hcOQES2PDJkAT1XAAC+ZebPfWB3auNzmLObVsNRUNUXVHUujuM7OxXnMy4XwOcj29mIyOuq+lapVGrYCelKpkEQ3CyXy4tbzdN0AGPMxr2iYZ+sra3FcRybtgCIiK2BKw2rdgaUSqWoUqlIkQAepFDdAF7cBq5ERI9rtdr1OI7tmE2t6SmUEYFHAEaexYW/1QC2EF+ru5GIvg7D0D2GNJxprQY4o6qv1I/b6SpzOYqiLxpWng5oOQAzXxWRWwA+dkRfYOb1p5hGW6sBJpn5KytSRG4D+KguWFXHoyhy7xdeLC0F2ChSRL4H8OFuINoKYIUbY34gogHH3eeZef1K6tPaDpCm068A3nMEDzHzxY4BUNWSiPxORO6z5aDPPlGICNQ9bYyZIaLjjudzIQoFkKbTbwCO+UI0HcB9J/LdeY0xs0R02IGYYObRrWqiFQCfEZEtSHsfmGZm+4qxbbM/hQD8BeBNa0hEM2EYnmgLgP3lFARBT1dXly4vL//b29tbzQNIU+llAHeJaLFSqRzJes5vegR8xGbZLCwsHKzVav8z8/0sm0ID+MDvAfh4qZk2exFopnd9vv0ELrXBQO7fD10AAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreenExit:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC/ElEQVRoQ+2Zy49NQRCHvx+ReK6IlZ34E7CUiCAR4xEbTLCyQRATYswwb2IQZDYWgojHZpCQECts+ResiQwLj0RClNSkb9Lu3HtPz7mZc8+V6eXt6tP1VVV3VdcVbT7U5vozC9BqD/7/HjCzlZLet9rS9fbP9ICZvQPWSfqRAmFmS4ClMHm+JiR9S1mXVyYFwIBXwEZJv7I2MrPjQH8A6JN0OWtNM/OpAL7HS0mbsjYzswGgN8gNS+rJWtPM/HQAfJ9nkrY22tDMTgMjQaZH0nAzCmatTQE4ClyNPvQU2CbJQ2vKKB2Aa2hmR4DrkbbPgQ5Jv6sJSgkQILqA0dgTkjraBiBAxPHtPz2UtDuGKK0HKkqamd8qg5HS9yXtjebLdYjrHNRqiAeS9gQvnQGGSnML1bvGzOwc0BfN35PUaWYHgRulBwjW9ju+O4JwqM/AWFsABIgLwKkIYgJY1jYAAeJQuGIXVIVcKTKxh8WfBin9J+AVpx/eFWUEqFkyNACKp0rhgWYArkg6kQibSyylmPOklQdibijBX+fSLHFRJkDid+qKmdlaYENOI0zeEcBNSZ9qbVIEQHWuyGOTNZLetgrAz8ClPFpHa1ZL8rf5lFGEB2oBfAxQi4D5DeDmAP7mGJPka0oD4LnDr9imH/xFe8AP4vLIjBclxWXItCOtaIBjwOKo3HaFRyWdnLbmYUHhAJKumdkt4ECk9JCkSitmWixFAwxKOjt5uZvdBvZH2vZLit8XSSBFA/yjpJndAfY1A9FSgOCJu0BnBNErqfIkzfRCywECxCNgR6Rtt6TzmdqHBmyKXG4ZM4sTWc04NzNPWE+AuG3ZlZInSuGBinXMbBzYGVkrE6JUACGcHgPbUyGKAIj7REmZ18y897o5ghiQ5E/bltRChwE/kF7Xj0jyLkbDYWbzgBfA+iA4LmlXqwD8LydvszjAF0lfswBCKC0E3gBeP22p186f8RBKUbaejJmtAr5L+lBPptQAKfCzAClWmkmZWQ/MpHVTvv0X9iFAQGQyevIAAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-audio{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACrUlEQVRoQ+2ZPYgTURCAZzbBXJnCeL2Cnb87b9MEtPBUrrMQFAtrtT5/ClGs9LBWWz0RtbBUFCF4oJDsbO68wsLA2YqQSmLlvpEHu7IuMdlLcus+yUKKhJfZ+ebnvZl5CJY/aLn+MAP41x7M1QPMfFtr/crzvHfTAs8FoNPp1LTWzwHgqIg0lFLvrQHwfX8BER8DwC6jNCIecF13wwoA3/dvIuKNpLJa60Oe560XGoCZd4rICiKeTCtaeABmPg4AJmRqg6xcaABmvg4At4aFRyEBhoVM4UMoCplHADCfJTEL5YEsIVNID5iQAYCHALCYxeq5b6PMfF5EBAAEESthGK7W6/XPRpFWq7W3VCqtZg2ZcT3g+/6i4zjzIlLSWn/yPO/DIGMNLCWY2Sj/+xGRK0qpZfNDEASnROTFVi0fr8+aA8z8Ld6KEfGt67oLYwMAwEUium8EREn7OgeAjwCwPyo/nrque3YSgAtE9GDaAM1mc65arc4Zuf1+P2w0Gt9jJZl5DQAORt+fENG5wgEw8zUAMB/zbBBRwyqAIAjuiMjlSOlNItpjFUCqWl0josMzgChR/9hGAWBbknjmAdPhDdqa0gfZzAMJKyVP4v8hhJYRcSni+0JEu63ahZj5anyQici6UuqIVQDdbrfS6/UqRulyufyTiH5sF8AlIro37VpoWEHIzGZ2tM+sEZFnSqkzk9RCS0R01wjIsZz+mug53hDRia0AnI4bGgDYISItz/M2jYC8Gpp2u30MEWuO4zha665Sqp0ZYFStX/iWchRAItFGzoHSsrJ2ZFl1mHg6bfVYJeGJv85CC++BpIJZ5kSFC6G0ha0e7mYJqcJ7IOkRay84UhD2XjHFIFZf8iW9YcYoYRi+tO6aNeupOs66iU/icV46zf/MAKZpzXFk/QL+JG1PUPhRiQAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-audio:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACSElEQVRoQ+2Zu4sUQRCHf5+C+gf4yBXMfMYHGvjCzEBQDIzV+HwEohipGKupD0QNDE8UEwUFTe68wEDhTMVUMFJ+0tArzbjs9u3Ojt0wBR0M9MzUV1XdXVWNKhcq1189wP/2YKcesH1d0nPgdVvgnQDY3iTpqaT9kuaAt9UA2D4o6aGkzVHpXcByFQC2r0q60lB2D7BUNIDtjZIeSDoyRNGyAWwfiiET4n6YlAtg+7Kka2PCozyAMSHT5CkLIIbMfUlbMhdmOQCZIVOeB2LI3JN0NNPq6bTZe8D2aUmOY72kN8DnoIXt7eF5FSEzkQdsB+OEsFwr6RPwbpixhqYStoPyqVwAbkaAY5KeTWD5wStZHrD9XdJgK34FhBP9H8kFOAvciQBhn3/RAcBHSTvjfx4DJ6cBOAPcbRvA9gZJYQT5DfwYKGl7UdLu+PwIOFUiwCVJYQRZBuZqA7gh6XxUegXYVhtAmq0uAnt7gLhQm9vorBZx74Hcc6D3QLKH/z2JGyVnlYs4pCfzEe4rsLW2XehicpAtAftqAwiZbhhBfgE/ZwVwDrjddi40KiG0HXpHO+KcJ8CJaXKheeBWBOgqnf6W1BwvgcOrATieFDTrJL0HViJAVwXNgVgPrJH0BfiQDTDKtREiNK7KLSnHASQLLacP1PxcVkWWq8PU3emq2yqJJ0b1Qsv2QKpdZp+orBBqmrfq5m5mSJXtgUZI1XnB0YCo94opCal6L/ka3ghtlIXqrllzT9VJ5k19Ek/y0zbf6QHatOYk3/oDujC8QMWgjf4AAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-mute{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-mute:hover{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-text{font-size:14px;width:30px}.jessibuca-container .jessibuca-speed{font-size:14px;color:#fff}.jessibuca-container .jessibuca-quality-menu-list{position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%);transition:visibility .3s,opacity .3s;background-color:rgba(0,0,0,.5);border-radius:4px}.jessibuca-container .jessibuca-quality-menu-list.jessibuca-quality-menu-shown{visibility:visible;opacity:1}.jessibuca-container .icon-title-tips{pointer-events:none;position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%);transition:visibility .3s ease 0s,opacity .3s ease 0s;background-color:rgba(0,0,0,.5);border-radius:4px}.jessibuca-container .icon-title{display:inline-block;padding:5px 10px;font-size:12px;white-space:nowrap;color:#fff}.jessibuca-container .jessibuca-quality-menu{padding:8px 0}.jessibuca-container .jessibuca-quality-menu-item{display:block;height:25px;margin:0;padding:0 10px;cursor:pointer;font-size:14px;text-align:center;width:50px;color:hsla(0,0%,100%,.5);transition:color .3s,background-color .3s}.jessibuca-container .jessibuca-quality-menu-item:hover{background-color:hsla(0,0%,100%,.2)}.jessibuca-container .jessibuca-quality-menu-item:focus{outline:none}.jessibuca-container .jessibuca-quality-menu-item.jessibuca-quality-menu-item-active{color:#2298fc}.jessibuca-container .jessibuca-volume-panel-wrap{position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%) translateY(22%);transition:visibility .3s,opacity .3s;background-color:rgba(0,0,0,.5);border-radius:4px;height:120px;width:50px;overflow:hidden}.jessibuca-container .jessibuca-volume-panel-wrap.jessibuca-volume-panel-wrap-show{visibility:visible;opacity:1}.jessibuca-container .jessibuca-volume-panel{cursor:pointer;position:absolute;top:21px;height:60px;width:50px;overflow:hidden}.jessibuca-container .jessibuca-volume-panel-text{position:absolute;left:0;top:0;width:50px;height:20px;line-height:20px;text-align:center;color:#fff;font-size:12px}.jessibuca-container .jessibuca-volume-panel-handle{position:absolute;top:48px;left:50%;width:12px;height:12px;border-radius:12px;margin-left:-6px;background:#fff}.jessibuca-container .jessibuca-volume-panel-handle:before{bottom:-54px;background:#fff}.jessibuca-container .jessibuca-volume-panel-handle:after{bottom:6px;background:hsla(0,0%,100%,.2)}.jessibuca-container .jessibuca-volume-panel-handle:after,.jessibuca-container .jessibuca-volume-panel-handle:before{content:"";position:absolute;display:block;left:50%;width:3px;margin-left:-1px;height:60px}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-controls{width:100vh;transform:translateX(-13vw) translateY(-47.8vh) rotate(270deg);transition:width .5s ease-in}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-play-big:after{transform:rotate(270deg)}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-loading{flex-direction:row}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-loading-text{transform:rotate(270deg)}');class Pe{constructor(e){var t;this.player=e,((e,t)=>{e._opt.hasControl&&e._opt.controlAutoHide?e.$container.classList.add("jessibuca-controls-show-auto-hide"):e.$container.classList.add("jessibuca-controls-show");const i=e._opt,o=i.operateBtns;e.$container.insertAdjacentHTML("beforeend",`\n ${i.background?``:""}\n \n ${Ge.loading}\n ${i.loadingText?`
${i.loadingText}
`:""}\n
\n ${i.hasControl&&o.play?'':""}\n ${i.hasControl?`\n \n
\n
\n ${i.showBandwidth?'
':""}\n
\n
\n ${o.audio?`\n
\n ${Ge.audio}\n ${Ge.mute}\n
\n
\n `:""}\n ${o.play?`
${Ge.play}
${Ge.pause}
`:""}\n ${o.screenshot?`
${Ge.screenshot}
`:""}\n ${o.record?`
${Ge.record}
${Ge.recordStop}
`:""}\n ${o.fullscreen?`
${Ge.fullscreen}
${Ge.fullscreenExit}
`:""}\n
\n
\n
\n `:""}\n\n `),Object.defineProperty(t,"$poster",{value:e.$container.querySelector(".jessibuca-poster")}),Object.defineProperty(t,"$loading",{value:e.$container.querySelector(".jessibuca-loading")}),Object.defineProperty(t,"$play",{value:e.$container.querySelector(".jessibuca-play")}),Object.defineProperty(t,"$playBig",{value:e.$container.querySelector(".jessibuca-play-big")}),Object.defineProperty(t,"$pause",{value:e.$container.querySelector(".jessibuca-pause")}),Object.defineProperty(t,"$controls",{value:e.$container.querySelector(".jessibuca-controls")}),Object.defineProperty(t,"$fullscreen",{value:e.$container.querySelector(".jessibuca-fullscreen")}),Object.defineProperty(t,"$fullscreen",{value:e.$container.querySelector(".jessibuca-fullscreen")}),Object.defineProperty(t,"$volume",{value:e.$container.querySelector(".jessibuca-volume")}),Object.defineProperty(t,"$volumePanelWrap",{value:e.$container.querySelector(".jessibuca-volume-panel-wrap")}),Object.defineProperty(t,"$volumePanelText",{value:e.$container.querySelector(".jessibuca-volume-panel-text")}),Object.defineProperty(t,"$volumePanel",{value:e.$container.querySelector(".jessibuca-volume-panel")}),Object.defineProperty(t,"$volumeHandle",{value:e.$container.querySelector(".jessibuca-volume-panel-handle")}),Object.defineProperty(t,"$volumeOn",{value:e.$container.querySelector(".jessibuca-icon-audio")}),Object.defineProperty(t,"$volumeOff",{value:e.$container.querySelector(".jessibuca-icon-mute")}),Object.defineProperty(t,"$fullscreen",{value:e.$container.querySelector(".jessibuca-fullscreen")}),Object.defineProperty(t,"$fullscreenExit",{value:e.$container.querySelector(".jessibuca-fullscreen-exit")}),Object.defineProperty(t,"$record",{value:e.$container.querySelector(".jessibuca-record")}),Object.defineProperty(t,"$recordStop",{value:e.$container.querySelector(".jessibuca-record-stop")}),Object.defineProperty(t,"$screenshot",{value:e.$container.querySelector(".jessibuca-screenshot")}),Object.defineProperty(t,"$speed",{value:e.$container.querySelector(".jessibuca-speed")})})(e,this),Je(e,this),t=this,Object.defineProperty(t,"controlsRect",{get:()=>t.$controls.getBoundingClientRect()}),((e,t)=>{const{events:{proxy:i},debug:o}=e;function r(e){const{bottom:i,height:o}=t.$volumePanel.getBoundingClientRect(),{height:r}=t.$volumeHandle.getBoundingClientRect();return le(i-e.y-r/2,0,o-r/2)/(o-r)}i(window,["click","contextmenu"],(i=>{i.composedPath().indexOf(e.$container)>-1?t.isFocus=!0:t.isFocus=!1})),i(window,"orientationchange",(()=>{setTimeout((()=>{e.resize()}),300)})),i(t.$controls,"click",(e=>{e.stopPropagation()})),i(t.$pause,"click",(t=>{e.pause()})),i(t.$play,"click",(t=>{e.play()})),i(t.$playBig,"click",(t=>{e.play()})),i(t.$volume,"mouseover",(()=>{t.$volumePanelWrap.classList.add("jessibuca-volume-panel-wrap-show")})),i(t.$volume,"mouseout",(()=>{t.$volumePanelWrap.classList.remove("jessibuca-volume-panel-wrap-show")})),i(t.$volumeOn,"click",(i=>{i.stopPropagation(),ue(t.$volumeOn,"display","none"),ue(t.$volumeOff,"display","block"),e.lastVolume=e.volume,e.volume=0})),i(t.$volumeOff,"click",(i=>{i.stopPropagation(),ue(t.$volumeOn,"display","block"),ue(t.$volumeOff,"display","none"),e.volume=e.lastVolume||.5})),i(t.$screenshot,"click",(t=>{t.stopPropagation(),e.video.screenshot()})),i(t.$volumePanel,"click",(t=>{t.stopPropagation(),e.volume=r(t)})),i(t.$volumeHandle,"mousedown",(()=>{t.isVolumeDroging=!0})),i(t.$volumeHandle,"mousemove",(i=>{t.isVolumeDroging&&(e.volume=r(i))})),i(document,"mouseup",(()=>{t.isVolumeDroging&&(t.isVolumeDroging=!1)})),i(t.$record,"click",(t=>{t.stopPropagation(),e.recording=!0})),i(t.$recordStop,"click",(t=>{t.stopPropagation(),e.recording=!1})),i(t.$fullscreen,"click",(t=>{t.stopPropagation(),e.fullscreen=!0})),i(t.$fullscreenExit,"click",(t=>{t.stopPropagation(),e.fullscreen=!1})),e._opt.hasControl&&e._opt.controlAutoHide&&(i(e.$container,"mouseover",(()=>{e.fullscreen||ue(t.$controls,"display","block")})),i(e.$container,"mouseout",(()=>{ue(t.$controls,"display","none")})))})(e,this),e._opt.hotKey&&((e,t)=>{const{events:{proxy:i}}=e,o={};function r(e,t){o[e]?o[e].push(t):o[e]=[t]}r($,(()=>{e.fullscreen&&(e.fullscreen=!1)})),r(ee,(()=>{e.volume+=.05})),r(te,(()=>{e.volume-=.05})),i(window,"keydown",(e=>{if(t.isFocus){const t=document.activeElement.tagName.toUpperCase(),i=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==i&&"true"!==i){const t=o[e.keyCode];t&&(e.preventDefault(),t.forEach((e=>e())))}}}))})(e,this),this.player.debug.log("Control","init")}destroy(){this.$poster&&this.player.$container.removeChild(this.$poster),this.$loading&&this.player.$container.removeChild(this.$loading),this.$controls&&this.player.$container.removeChild(this.$controls),this.$playBig&&this.player.$container.removeChild(this.$playBig),this.player.debug.log("control","destroy")}autoSize(){const e=this.player;e.$container.style.padding="0 0";const t=e.width,i=e.height,o=t/i,r=e.video.$videoElement.width/e.video.$videoElement.height;if(o>r){const o=(t-i*r)/2;e.$container.style.padding=`0 ${o}px`}else{const o=(i-t/r)/2;e.$container.style.padding=`${o}px 0`}}}Ne(".jessibuca-container{position:relative;width:100%;height:100%;overflow:hidden}.jessibuca-container.jessibuca-fullscreen-web{position:fixed;z-index:9999;left:0;top:0;right:0;bottom:0;width:100vw!important;height:100vh!important;background:#000}");class ze{static init(){ze.types={avc1:[],avcC:[],hvc1:[],hvcC:[],btrt:[],dinf:[],dref:[],esds:[],ftyp:[],hdlr:[],mdat:[],mdhd:[],mdia:[],mfhd:[],minf:[],moof:[],moov:[],mp4a:[],mvex:[],mvhd:[],sdtp:[],stbl:[],stco:[],stsc:[],stsd:[],stsz:[],stts:[],tfdt:[],tfhd:[],traf:[],trak:[],trun:[],trex:[],tkhd:[],vmhd:[],smhd:[]};for(let e in ze.types)ze.types.hasOwnProperty(e)&&(ze.types[e]=[e.charCodeAt(0),e.charCodeAt(1),e.charCodeAt(2),e.charCodeAt(3)]);let e=ze.constants={};e.FTYP=new Uint8Array([105,115,111,109,0,0,0,1,105,115,111,109,97,118,99,49]),e.STSD_PREFIX=new Uint8Array([0,0,0,0,0,0,0,1]),e.STTS=new Uint8Array([0,0,0,0,0,0,0,0]),e.STSC=e.STCO=e.STTS,e.STSZ=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0]),e.HDLR_VIDEO=new Uint8Array([0,0,0,0,0,0,0,0,118,105,100,101,0,0,0,0,0,0,0,0,0,0,0,0,86,105,100,101,111,72,97,110,100,108,101,114,0]),e.HDLR_AUDIO=new Uint8Array([0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0,83,111,117,110,100,72,97,110,100,108,101,114,0]),e.DREF=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,12,117,114,108,32,0,0,0,1]),e.SMHD=new Uint8Array([0,0,0,0,0,0,0,0]),e.VMHD=new Uint8Array([0,0,0,1,0,0,0,0,0,0,0,0])}static box(e){let t=8,i=null,o=Array.prototype.slice.call(arguments,1),r=o.length;for(let e=0;e>>24&255,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i.set(e,4);let A=8;for(let e=0;e>>24&255,e>>>16&255,e>>>8&255,255&e,t>>>24&255,t>>>16&255,t>>>8&255,255&t,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]))}static trak(e){return ze.box(ze.types.trak,ze.tkhd(e),ze.mdia(e))}static tkhd(e){let t=e.id,i=e.duration,o=e.presentWidth,r=e.presentHeight;return ze.box(ze.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,o>>>8&255,255&o,0,0,r>>>8&255,255&r,0,0]))}static mdia(e){return ze.box(ze.types.mdia,ze.mdhd(e),ze.hdlr(e),ze.minf(e))}static mdhd(e){let t=e.timescale,i=e.duration;return ze.box(ze.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,i>>>24&255,i>>>16&255,i>>>8&255,255&i,85,196,0,0]))}static hdlr(e){let t=null;return t="audio"===e.type?ze.constants.HDLR_AUDIO:ze.constants.HDLR_VIDEO,ze.box(ze.types.hdlr,t)}static minf(e){let t=null;return t="audio"===e.type?ze.box(ze.types.smhd,ze.constants.SMHD):ze.box(ze.types.vmhd,ze.constants.VMHD),ze.box(ze.types.minf,t,ze.dinf(),ze.stbl(e))}static dinf(){return ze.box(ze.types.dinf,ze.box(ze.types.dref,ze.constants.DREF))}static stbl(e){return ze.box(ze.types.stbl,ze.stsd(e),ze.box(ze.types.stts,ze.constants.STTS),ze.box(ze.types.stsc,ze.constants.STSC),ze.box(ze.types.stsz,ze.constants.STSZ),ze.box(ze.types.stco,ze.constants.STCO))}static stsd(e){return"audio"===e.type?ze.box(ze.types.stsd,ze.constants.STSD_PREFIX,ze.mp4a(e)):"avc"===e.videoType?ze.box(ze.types.stsd,ze.constants.STSD_PREFIX,ze.avc1(e)):ze.box(ze.types.stsd,ze.constants.STSD_PREFIX,ze.hvc1(e))}static mp4a(e){let t=e.channelCount,i=e.audioSampleRate,o=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t,0,16,0,0,0,0,i>>>8&255,255&i,0,0]);return ze.box(ze.types.mp4a,o,ze.esds(e))}static esds(e){let t=e.config||[],i=t.length,o=new Uint8Array([0,0,0,0,3,23+i,0,1,0,4,15+i,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([i]).concat(t).concat([6,1,2]));return ze.box(ze.types.esds,o)}static avc1(e){let t=e.avcc;const i=e.codecWidth,o=e.codecHeight;let r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,i>>>8&255,255&i,o>>>8&255,255&o,0,72,0,0,0,72,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return ze.box(ze.types.avc1,r,ze.box(ze.types.avcC,t))}static hvc1(e){let t=e.avcc;const i=e.codecWidth,o=e.codecHeight;let r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,i>>>8&255,255&i,o>>>8&255,255&o,0,72,0,0,0,72,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return ze.box(ze.types.hvc1,r,ze.box(ze.types.hvcC,t))}static mvex(e){return ze.box(ze.types.mvex,ze.trex(e))}static trex(e){let t=e.id,i=new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return ze.box(ze.types.trex,i)}static moof(e,t){return ze.box(ze.types.moof,ze.mfhd(e.sequenceNumber),ze.traf(e,t))}static mfhd(e){let t=new Uint8Array([0,0,0,0,e>>>24&255,e>>>16&255,e>>>8&255,255&e]);return ze.box(ze.types.mfhd,t)}static traf(e,t){let i=e.id,o=ze.box(ze.types.tfhd,new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i])),r=ze.box(ze.types.tfdt,new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t])),A=ze.sdtp(e),s=ze.trun(e,A.byteLength+16+16+8+16+8+8);return ze.box(ze.types.traf,o,r,s,A)}static sdtp(e){let t=new Uint8Array(5),i=e.flags;return t[4]=i.isLeading<<6|i.dependsOn<<4|i.isDependedOn<<2|i.hasRedundancy,ze.box(ze.types.sdtp,t)}static trun(e,t){let i=new Uint8Array(28);t+=36,i.set([0,0,15,1,0,0,0,1,t>>>24&255,t>>>16&255,t>>>8&255,255&t],0);let o=e.duration,r=e.size,A=e.flags,s=e.cts;return i.set([o>>>24&255,o>>>16&255,o>>>8&255,255&o,r>>>24&255,r>>>16&255,r>>>8&255,255&r,A.isLeading<<2|A.dependsOn,A.isDependedOn<<6|A.hasRedundancy<<4|A.isNonSync,0,0,s>>>24&255,s>>>16&255,s>>>8&255,255&s],12),ze.box(ze.types.trun,i)}static mdat(e){return ze.box(ze.types.mdat,e)}}ze.init();class Ye{constructor(e){this.TAG="ExpGolomb",this._buffer=e,this._buffer_index=0,this._total_bytes=e.byteLength,this._total_bits=8*e.byteLength,this._current_word=0,this._current_word_bits_left=0}destroy(){this._buffer=null}_fillCurrentWord(){let e=this._total_bytes-this._buffer_index,t=Math.min(4,e),i=new Uint8Array(4);i.set(this._buffer.subarray(this._buffer_index,this._buffer_index+t)),this._current_word=new DataView(i.buffer).getUint32(0,!1),this._buffer_index+=t,this._current_word_bits_left=8*t}readBits(e){if(e<=this._current_word_bits_left){let t=this._current_word>>>32-e;return this._current_word<<=e,this._current_word_bits_left-=e,t}let t=this._current_word_bits_left?this._current_word:0;t>>>=32-this._current_word_bits_left;let i=e-this._current_word_bits_left;this._fillCurrentWord();let o=Math.min(i,this._current_word_bits_left),r=this._current_word>>>32-o;return this._current_word<<=o,this._current_word_bits_left-=o,t=t<>>e))return this._current_word<<=e,this._current_word_bits_left-=e,e;return this._fillCurrentWord(),e+this._skipLeadingZero()}readUEG(){let e=this._skipLeadingZero();return this.readBits(e+1)-1}readSEG(){let e=this.readUEG();return 1&e?e+1>>>1:-1*(e>>>1)}}class He{static _ebsp2rbsp(e){let t=e,i=t.byteLength,o=new Uint8Array(i),r=0;for(let e=0;e=2&&3===t[e]&&0===t[e-1]&&0===t[e-2]||(o[r]=t[e],r++);return new Uint8Array(o.buffer,0,r)}static parseSPS(e){let t=He._ebsp2rbsp(e),i=new Ye(t);i.readByte();let o=i.readByte();i.readByte();let r=i.readByte();i.readUEG();let A=He.getProfileString(o),s=He.getLevelString(r),n=1,a=420,d=[0,420,422,444],c=8;if((100===o||110===o||122===o||244===o||44===o||83===o||86===o||118===o||128===o||138===o||144===o)&&(n=i.readUEG(),3===n&&i.readBits(1),n<=3&&(a=d[n]),c=i.readUEG()+8,i.readUEG(),i.readBits(1),i.readBool())){let e=3!==n?8:12;for(let t=0;t0&&e<16?(v=t[e-1],w=o[e-1]):255===e&&(v=i.readByte()<<8|i.readByte(),w=i.readByte()<<8|i.readByte())}if(i.readBool()&&i.readBool(),i.readBool()&&(i.readBits(4),i.readBool()&&i.readBits(24)),i.readBool()&&(i.readUEG(),i.readUEG()),i.readBool()){let e=i.readBits(32),t=i.readBits(32);E=i.readBool(),B=t,C=2*e,S=B/C}}let R=1;1===v&&1===w||(R=v/w);let k=0,T=0;if(0===n)k=1,T=2-m;else{k=3===n?1:2,T=(1===n?2:1)*(2-m)}let I=16*(h+1),D=16*(p+1)*(2-m);I-=(g+f)*k,D-=(b+y)*T;let x=Math.ceil(I*R);return i.destroy(),i=null,{profile_string:A,level_string:s,bit_depth:c,ref_frames:u,chroma_format:a,chroma_format_string:He.getChromaFormatString(a),frame_rate:{fixed:E,fps:S,fps_den:C,fps_num:B},sar_ratio:{width:v,height:w},codec_size:{width:I,height:D},present_size:{width:x,height:D}}}static _skipScalingList(e,t){let i=8,o=8,r=0;for(let A=0;A{this.mediaSourceOpen=!0,this.player.emit(E.mseSourceOpen)})),i(this.mediaSource,"sourceclose",(()=>{this.player.emit(E.mseSourceClose)})),e.debug.log("MediaSource","init")}destroy(){this.stop(),this.bufferList=[],this.mediaSource=null,this.mediaSourceOpen=!1,this.sourceBuffer=null,this.hasInit=!1,this.isInitInfo=!1,this.sequenceNumber=0,this.cacheTrack=null,this.timeInit=!1,this.off(),this.player.debug.log("MediaSource","destroy")}get state(){return this.mediaSource.readyState}get isStateOpen(){return this.state===q}get isStateClosed(){return this.state===K}get isStateEnded(){return this.state===Z}get duration(){return this.mediaSource.duration}set duration(e){this.mediaSource.duration=e}decodeVideo(e,t,i){const o=this.player;if(this.hasInit)this._decodeVideo(e,t,i);else if(i&&0===e[1]){const r=15&e[0];if(o.video.updateVideoInfo({encTypeCode:r}),r===L)return void this.emit(C.mediaSourceH265NotSupport);o._times.decodeStart||(o._times.decodeStart=ce()),this._decodeConfigurationRecord(e,t,i,r),this.hasInit=!0}}_doDecode(){const e=this.bufferList.shift();e&&this._decodeVideo(e.payload,e.ts,e.isIframe)}_decodeConfigurationRecord(e,t,i,o){let r=e.slice(5),A={};o===j?A=function(e){const t={},i=new DataView(e.buffer);let o=i.getUint8(0),r=i.getUint8(1);if(i.getUint8(2),i.getUint8(3),1!==o||0===r)return;const A=1+(3&i.getUint8(4));if(3!==A&&4!==A)return;let s=31&i.getUint8(5);if(0===s)return;let n=6;for(let o=0;o1&&(this.removeBuffer(n.buffered.start(0),n.buffered.end(0)),this.timeInit=!1),this.dropping&&s-this.cacheTrack.dts>1e3)this.dropping=!1,this.cacheTrack={};else if(this.cacheTrack&&s>this.cacheTrack.dts){let e=8+this.cacheTrack.size,i=new Uint8Array(e);i[0]=e>>>24&255,i[1]=e>>>16&255,i[2]=e>>>8&255,i[3]=255&e,i.set(ze.types.mdat,4),i.set(this.cacheTrack.data,8),this.cacheTrack.duration=s-this.cacheTrack.dts;let r=ze.moof(this.cacheTrack,this.cacheTrack.dts),A=new Uint8Array(r.byteLength+i.byteLength);A.set(r,0),A.set(i,r.byteLength),this.appendBuffer(A.buffer),o.handleRender(),o.updateStats({fps:!0,ts:t,buf:o.demux.delay}),o._times.videoStart||(o._times.videoStart=ce(),o.handlePlayToRenderTimes())}else o.debug.log("MediaSource","timeInit set false , cacheTrack = {}"),this.timeInit=!1,this.cacheTrack={};this.cacheTrack.id=1,this.cacheTrack.sequenceNumber=++this.sequenceNumber,this.cacheTrack.size=A,this.cacheTrack.dts=s,this.cacheTrack.cts=0,this.cacheTrack.isKeyframe=i,this.cacheTrack.data=r,this.cacheTrack.flags={isLeading:0,dependsOn:i?2:1,isDependedOn:i?1:0,hasRedundancy:0,isNonSync:i?0:1},this.timeInit||1!==n.buffered.length||(o.debug.log("MediaSource","timeInit set true"),this.timeInit=!0,n.currentTime=n.buffered.end(0)),!this.isInitInfo&&n.videoWidth>0&&n.videoHeight>0&&(o.debug.log("MediaSource",`updateVideoInfo: ${n.videoWidth},${n.videoHeight}`),o.video.updateVideoInfo({width:n.videoWidth,height:n.videoHeight}),o.video.initCanvasViewSize(),this.isInitInfo=!0)}appendBuffer(e){const{debug:t,events:{proxy:i}}=this.player;null===this.sourceBuffer&&(this.sourceBuffer=this.mediaSource.addSourceBuffer(X),i(this.sourceBuffer,"error",(e=>{this.player.emit(E.mseSourceBufferError,e)}))),!1===this.sourceBuffer.updating&&this.isStateOpen?this.sourceBuffer.appendBuffer(e):this.isStateClosed?this.player.emit(E.mseSourceBufferError,"mediaSource is not attached to video or mediaSource is closed"):this.isStateEnded?this.player.emit(E.mseSourceBufferError,"mediaSource is closed"):!0===this.sourceBuffer.updating&&this.player.emit(E.mseSourceBufferBusy)}stop(){this.isStateOpen&&this.sourceBuffer&&this.sourceBuffer.abort(),this.endOfStream()}dropSourceBuffer(e){const t=this.player.video.$videoElement;this.dropping=e,t.buffered.length>0&&t.buffered.end(0)-t.currentTime>1&&(t.currentTime=t.buffered.end(0))}removeBuffer(e,t){if(this.isStateOpen&&!1===this.sourceBuffer.updating)try{this.sourceBuffer.remove(e,t)}catch(e){console.error(e)}}endOfStream(){this.isStateOpen&&this.mediaSource.endOfStream()}}const Ze=()=>"undefined"!=typeof navigator&&parseFloat((""+(/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))<10&&!window.MSStream,qe=()=>"wakeLock"in navigator;class Ke{constructor(e){if(this.player=e,this.enabled=!1,qe()){this._wakeLock=null;const e=()=>{null!==this._wakeLock&&"visible"===document.visibilityState&&this.enable()};document.addEventListener("visibilitychange",e),document.addEventListener("fullscreenchange",e)}else Ze()?this.noSleepTimer=null:(this.noSleepVideo=document.createElement("video"),this.noSleepVideo.setAttribute("title","No Sleep"),this.noSleepVideo.setAttribute("playsinline",""),this._addSourceToVideo(this.noSleepVideo,"webm","data:video/webm;base64,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"),this._addSourceToVideo(this.noSleepVideo,"mp4","data:video/mp4;base64,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"),this.noSleepVideo.addEventListener("loadedmetadata",(()=>{this.noSleepVideo.duration<=1?this.noSleepVideo.setAttribute("loop",""):this.noSleepVideo.addEventListener("timeupdate",(()=>{this.noSleepVideo.currentTime>.5&&(this.noSleepVideo.currentTime=Math.random())}))})))}_addSourceToVideo(e,t,i){var o=document.createElement("source");o.src=i,o.type=`video/${t}`,e.appendChild(o)}get isEnabled(){return this.enabled}enable(){const e=this.player.debug;if(qe())return navigator.wakeLock.request("screen").then((t=>{this._wakeLock=t,this.enabled=!0,e.log("wakeLock","Wake Lock active."),this._wakeLock.addEventListener("release",(()=>{e.log("wakeLock","Wake Lock released.")}))})).catch((t=>{throw this.enabled=!1,e.error("wakeLock",`${t.name}, ${t.message}`),t}));if(Ze())return this.disable(),this.noSleepTimer=window.setInterval((()=>{document.hidden||(window.location.href=window.location.href.split("#")[0],window.setTimeout(window.stop,0))}),15e3),this.enabled=!0,Promise.resolve();return this.noSleepVideo.play().then((e=>(this.enabled=!0,e))).catch((e=>{throw this.enabled=!1,e}))}disable(){const e=this.player.debug;qe()?(this._wakeLock&&this._wakeLock.release(),this._wakeLock=null):Ze()?this.noSleepTimer&&(e.warn("wakeLock","NoSleep now disabled for older iOS devices."),window.clearInterval(this.noSleepTimer),this.noSleepTimer=null):this.noSleepVideo.pause(),this.enabled=!1}}class _e extends we{constructor(e,t){var i;super(),this.$container=e,this._opt=Object.assign({},r,t),this.debug=new ie(this),this._opt.useWCS&&(this._opt.useWCS="VideoEncoder"in window),this._opt.useMSE&&(this._opt.useMSE=window.MediaSource&&window.MediaSource.isTypeSupported(X)),this._opt.useMSE?(this._opt.useWCS&&this.debug.log("Player","useWCS set true->false"),this._opt.forceNoOffscreen||this.debug.log("Player","forceNoOffscreen set false->true"),this._opt.useWCS=!1,this._opt.forceNoOffscreen=!0):this._opt.useWCS,this._opt.forceNoOffscreen||("undefined"==typeof OffscreenCanvas?(this._opt.forceNoOffscreen=!0,this._opt.useOffscreen=!1):this._opt.useOffscreen=!0),this._opt.hasAudio||(this._opt.operateBtns.audio=!1),this._opt.hasControl=this._hasControl(),this._loading=!1,this._playing=!1,this._hasLoaded=!1,this._checkHeartTimeout=null,this._checkLoadingTimeout=null,this._startBpsTime=null,this._isPlayingBeforePageHidden=!1,this._stats={buf:0,fps:0,abps:0,vbps:0,ts:0},this._times={playInitStart:"",playStart:"",streamStart:"",streamResponse:"",demuxStart:"",decodeStart:"",videoStart:"",playTimestamp:"",streamTimestamp:"",streamResponseTimestamp:"",demuxTimestamp:"",decodeTimestamp:"",videoTimestamp:"",allTimestamp:""},this._videoTimestamp=0,this._audioTimestamp=0,i=this,Object.defineProperty(i,"rect",{get:()=>{const e=i.$container.getBoundingClientRect();return e.width=Math.max(e.width,i.$container.clientWidth),e.height=Math.max(e.height,i.$container.clientHeight),e}}),["bottom","height","left","right","top","width"].forEach((e=>{Object.defineProperty(i,e,{get:()=>i.rect[e]})})),this.events=new oe(this),this.video=new Ce(this),this._opt.hasAudio&&(this.audio=new ke(this)),this.recorder=new Le(this),this._onlyMseOrWcsVideo()?this.loaded=!0:this.decoderWorker=new Ue(this),this.stream=null,this.demux=null,this._opt.useWCS&&(this.webcodecsDecoder=new Qe(this)),this._opt.useMSE&&(this.mseDecoder=new Xe(this)),this.control=new Pe(this),this.keepScreenOn=new Ke(this),(e=>{try{const t=()=>{e.emit(B.fullscreen,e.fullscreen),e.fullscreen?e._opt.useMSE&&e.resize():e.resize()};se.on("change",t),e.events.destroys.push((()=>{se.off("change",t)}))}catch(e){}if(e.on(E.decoderWorkerInit,(()=>{e.debug.log("player","has loaded"),e.loaded=!0})),e.on(E.play,(()=>{e.loading=!1})),e.on(E.fullscreen,(t=>{if(t)try{se.request(e.$container).then((()=>{})).catch((t=>{e.webFullscreen=!0}))}catch(t){e.webFullscreen=!0}else try{se.exit().then((()=>{})).catch((()=>{e.webFullscreen=!1}))}catch(t){e.webFullscreen=!1}})),e.on(E.webFullscreen,(t=>{t?e.$container.classList.add("jessibuca-fullscreen-web"):e.$container.classList.remove("jessibuca-fullscreen-web")})),e.on(E.resize,(()=>{e.video.resize()})),e._opt.debug){const t=[E.timeUpdate];Object.keys(E).forEach((i=>{e.on(E[i],(o=>{t.includes(i)||e.debug.log("player events",E[i],o)}))})),Object.keys(C).forEach((t=>{e.on(C[t],(i=>{e.debug.log("player event error",C[t],i)}))}))}})(this),(e=>{const{_opt:t,debug:i,events:{proxy:o}}=e;t.supportDblclickFullscreen&&o(e.$container,"dblclick",(()=>{e.fullscreen=!e.fullscreen})),o(document,"visibilitychange",(()=>{t.hiddenAutoPause&&(i.log("visibilitychange",document.visibilityState,e._isPlayingBeforePageHidden),"visible"===document.visibilityState?e._isPlayingBeforePageHidden&&e.play():(e._isPlayingBeforePageHidden=e.playing,e.playing&&e.pause()))})),o(window,"fullscreenchange",(()=>{null!==e.keepScreenOn&&"visible"===document.visibilityState&&e.enableWakeLock()}))})(this),this._opt.useWCS&&this.debug.log("Player","use WCS"),this._opt.useMSE&&this.debug.log("Player","use MSE"),this._opt.useOffscreen&&this.debug.log("Player","use offscreen"),this.debug.log("Player options",this._opt)}destroy(){this._loading=!1,this._playing=!1,this._hasLoaded=!1,this._times={playInitStart:"",playStart:"",streamStart:"",streamResponse:"",demuxStart:"",decodeStart:"",videoStart:"",playTimestamp:"",streamTimestamp:"",streamResponseTimestamp:"",demuxTimestamp:"",decodeTimestamp:"",videoTimestamp:"",allTimestamp:""},this.decoderWorker&&(this.decoderWorker.destroy(),this.decoderWorker=null),this.video&&(this.video.destroy(),this.video=null),this.audio&&(this.audio.destroy(),this.audio=null),this.stream&&(this.stream.destroy(),this.stream=null),this.recorder&&(this.recorder.destroy(),this.recorder=null),this.control&&(this.control.destroy(),this.control=null),this.webcodecsDecoder&&(this.webcodecsDecoder.destroy(),this.webcodecsDecoder=null),this.mseDecoder&&(this.mseDecoder.destroy(),this.mseDecoder=null),this.demux&&(this.demux.destroy(),this.demux=null),this.events&&(this.events.destroy(),this.events=null),this.clearCheckHeartTimeout(),this.clearCheckLoadingTimeout(),this.releaseWakeLock(),this.keepScreenOn=null,this.resetStats(),this._audioTimestamp=0,this._videoTimestamp=0,this.emit("destroy"),this.off(),this.debug.log("play","destroy end")}set fullscreen(e){ge()?(this.emit(E.webFullscreen,e),setTimeout((()=>{this.updateOption({rotate:e?270:0}),this.resize()}),10)):this.emit(E.fullscreen,e)}get fullscreen(){return document.isFullScreen||document.mozIsFullScreen||document.webkitIsFullScreen||this.webFullscreen}set webFullscreen(e){this.emit(E.webFullscreen,e)}get webFullscreen(){return this.$container.classList.contains("jessibuca-fullscreen-web")}set loaded(e){this._hasLoaded=e}get loaded(){return this._hasLoaded}set playing(e){e&&(this.loading=!1),this.playing!==e&&(this._playing=e,this.emit(E.playing,e),this.emit(E.volumechange,this.volume),e?this.emit(E.play):this.emit(E.pause))}get playing(){return this._playing}get volume(){return this.audio&&this.audio.volume||0}set volume(e){this.audio&&this.audio.setVolume(e)}set loading(e){this.loading!==e&&(this._loading=e,this.emit(E.loading,this._loading))}get loading(){return this._loading}set recording(e){this.playing&&(e?this.recorder.startRecord():this.recorder.stopRecordAndSave())}get recording(){return this.recorder&&this.recorder.recording}set audioTimestamp(e){null!==e&&(this._audioTimestamp=e)}get audioTimestamp(){return this._audioTimestamp}set videoTimestamp(e){null!==e&&(this._videoTimestamp=e,this._opt.useWCS||this._opt.useMSE||this.audioTimestamp&&this.videoTimestamp&&this.audio&&this.audio.emit(E.videoSyncAudio,{audioTimestamp:this.audioTimestamp,videoTimestamp:this.videoTimestamp,diff:this.audioTimestamp-this.videoTimestamp}))}get videoTimestamp(){return this._videoTimestamp}updateOption(e){this._opt=Object.assign({},this._opt,e)}init(){return new Promise(((e,t)=>{this.stream||(this.stream=new De(this)),this.demux||(this.demux=new Me(this)),this._opt.useWCS&&(this.webcodecsDecoder||(this.webcodecsDecoder=new Qe(this))),this._opt.useMSE&&(this.mseDecoder||(this.mseDecoder=new Xe(this))),this.decoderWorker||this._onlyMseOrWcsVideo()?e():(this.decoderWorker=new Ue(this),this.once(E.decoderWorkerInit,(()=>{e()})))}))}play(e){return new Promise(((t,i)=>{if(!e&&!this._opt.url)return i();this.loading=!0,this.playing=!1,this._times.playInitStart=ce(),e||(e=this._opt.url),this._opt.url=e,this.clearCheckHeartTimeout(),this.init().then((()=>{this._times.playStart=ce(),this._opt.isNotMute&&this.mute(!1),this.webcodecsDecoder&&this.webcodecsDecoder.once(C.webcodecsH265NotSupport,(()=>{this.emit(C.webcodecsH265NotSupport),this._opt.autoWasm||this.emit(E.error,C.webcodecsH265NotSupport)})),this.mseDecoder&&this.mseDecoder.once(C.mediaSourceH265NotSupport,(()=>{this.emit(C.mediaSourceH265NotSupport),this._opt.autoWasm||this.emit(E.error,C.mediaSourceH265NotSupport)})),this.enableWakeLock(),this.stream.fetchStream(e),this.checkLoadingTimeout(),this.stream.once(C.fetchError,(e=>{i(e)})),this.stream.once(C.websocketError,(e=>{i(e)})),this.stream.once(E.streamSuccess,(()=>{t(),this._times.streamResponse=ce(),this.video.play()}))})).catch((e=>{i(e)}))}))}close(){return new Promise(((e,t)=>{this._close().then((()=>{this.video.clearView(),e()}))}))}_close(){return new Promise(((e,t)=>{this.stream&&(this.stream.destroy(),this.stream=null),this.demux&&(this.demux.destroy(),this.demux=null),this.decoderWorker&&(this.decoderWorker.destroy(),this.decoderWorker=null),this.webcodecsDecoder&&(this.webcodecsDecoder.destroy(),this.webcodecsDecoder=null),this.mseDecoder&&(this.mseDecoder.destroy(),this.mseDecoder=null),this.clearCheckHeartTimeout(),this.clearCheckLoadingTimeout(),this.playing=!1,this.loading=!1,this.recording=!1,this.audio&&this.audio.pause(),this.releaseWakeLock(),this.resetStats(),this._audioTimestamp=0,this._videoTimestamp=0,this._times={playInitStart:"",playStart:"",streamStart:"",streamResponse:"",demuxStart:"",decodeStart:"",videoStart:"",playTimestamp:"",streamTimestamp:"",streamResponseTimestamp:"",demuxTimestamp:"",decodeTimestamp:"",videoTimestamp:"",allTimestamp:""},setTimeout((()=>{e()}),0)}))}pause(e){return e?this.close():this._close()}mute(e){this.audio&&this.audio.mute(e)}resize(){this.video.resize()}startRecord(e,t){this.recording||(this.recorder.setFileName(e,t),this.recording=!0)}stopRecordAndSave(){this.recording&&(this.recording=!1)}_hasControl(){let e=!1,t=!1;return Object.keys(this._opt.operateBtns).forEach((e=>{this._opt.operateBtns[e]&&(t=!0)})),(this._opt.showBandwidth||this._opt.text||t)&&(e=!0),e}_onlyMseOrWcsVideo(){return!1===this._opt.hasAudio&&(this._opt.useMSE||this._opt.useWCS&&!this._opt.useOffscreen)}checkHeart(){this.clearCheckHeartTimeout(),this.checkHeartTimeout()}checkHeartTimeout(){this._checkHeartTimeout=setTimeout((()=>{this.pause(!1).then((()=>{this.emit(E.timeout,E.delayTimeout),this.emit(E.delayTimeout)}))}),1e3*this._opt.heartTimeout)}clearCheckHeartTimeout(){this._checkHeartTimeout&&(clearTimeout(this._checkHeartTimeout),this._checkHeartTimeout=null)}checkLoadingTimeout(){this._checkLoadingTimeout=setTimeout((()=>{this.pause(!1).then((()=>{this.emit(E.timeout,E.loadingTimeout),this.emit(E.loadingTimeout)}))}),1e3*this._opt.loadingTimeout)}clearCheckLoadingTimeout(){this._checkLoadingTimeout&&(clearTimeout(this._checkLoadingTimeout),this._checkLoadingTimeout=null)}handleRender(){this.loading&&(this.emit(E.start),this.loading=!1,this.clearCheckLoadingTimeout()),this.playing||(this.playing=!0),this.checkHeart()}updateStats(e){e=e||{},this._startBpsTime||(this._startBpsTime=ce()),ve(e.ts)&&(this._stats.ts=e.ts),ve(e.buf)&&(this._stats.buf=e.buf),e.fps&&(this._stats.fps+=1),e.abps&&(this._stats.abps+=e.abps),e.vbps&&(this._stats.vbps+=e.vbps);const t=ce();t-this._startBpsTime<1e3||(this.emit(E.stats,this._stats),this.emit(E.performance,function(e){let t=0;return e>=24?t=2:e>=15&&(t=1),t}(this._stats.fps)),this._stats.fps=0,this._stats.abps=0,this._stats.vbps=0,this._startBpsTime=t)}resetStats(){this._startBpsTime=null,this._stats={buf:0,fps:0,abps:0,vbps:0,ts:0}}enableWakeLock(){this._opt.keepScreenOn&&this.keepScreenOn.enable()}releaseWakeLock(){this._opt.keepScreenOn&&this.keepScreenOn.disable()}handlePlayToRenderTimes(){const e=this._times;e.playTimestamp=e.playStart-e.playInitStart,e.streamTimestamp=e.streamStart-e.playStart,e.streamResponseTimestamp=e.streamResponse-e.streamStart,e.demuxTimestamp=e.demuxStart-e.streamResponse,e.decodeTimestamp=e.decodeStart-e.demuxStart,e.videoTimestamp=e.videoStart-e.decodeStart,e.allTimestamp=e.videoStart-e.playInitStart,this.emit(E.playToRenderTimes,e)}}class $e extends we{static ERROR=C;static TIMEOUT={loadingTimeout:E.loadingTimeout,delayTimeout:E.delayTimeout};constructor(e){super();let t=e,i=e.container;if("string"==typeof e.container&&(i=document.querySelector(e.container)),!i)throw new Error("Jessibuca need container option");i.classList.add("jessibuca-container"),delete t.container,ve(t.videoBuffer)&&(t.videoBuffer=1e3*Number(t.videoBuffer)),ve(t.timeout)&&(ye(t.loadingTimeout)&&(t.loadingTimeout=t.timeout),ye(t.heartTimeout)&&(t.heartTimeout=t.timeout)),this._opt=t,this.$container=i,this._loadingTimeoutReplayTimes=0,this._heartTimeoutReplayTimes=0,this.events=new oe(this),this._initPlayer(i,t)}destroy(){this.events&&(this.events.destroy(),this.events=null),this.player&&(this.player.destroy(),this.player=null),this.$container=null,this._opt=null,this._loadingTimeoutReplayTimes=0,this._heartTimeoutReplayTimes=0,this.off()}_initPlayer(e,t){this.player=new _e(e,t),this._bindEvents()}_resetPlayer(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.player.destroy(),this.player=null;const t=Object.assign(this._opt,e);this._initPlayer(this.$container,t)}_bindEvents(){Object.keys(B).forEach((e=>{this.player.on(B[e],(t=>{this.emit(e,t)}))}))}setDebug(e){this.player.updateOption({isDebug:!!e})}mute(){this.player.mute(!0)}cancelMute(){this.player.mute(!1)}setVolume(e){this.player.volume=e}audioResume(){this.player.audio&&this.player.audio.audioEnabled(!0)}setTimeout(e){e=Number(e),this.player.updateOption({timeout:e,loadingTimeout:e,heartTimeout:e})}setScaleMode(e){let t={isFullResize:!1,isResize:!1};switch(e=Number(e)){case M:t.isFullResize=!1,t.isResize=!1;break;case Q:t.isFullResize=!1,t.isResize=!0;break;case W:t.isFullResize=!0,t.isResize=!0}this.player.updateOption(t),this.resize()}pause(){return this.player.pause()}close(){return this._opt.url="",this.player.close()}clearView(){this.player.video.clearView()}play(e){return new Promise(((t,i)=>{if(!e&&!this._opt.url)return this.emit(E.error,C.playError),void i();if(e){if(!this._opt.url)return this._play(e);e===this._opt.url?this.player.playing?t():(this.clearView(),this.player.play(this._opt.url).then((()=>{t()})).catch((()=>{this.player.pause().then((()=>{i()}))}))):this.player.pause().then((()=>(this.clearView(),this._play(e)))).catch((()=>{i()}))}else this.player.play(this._opt.url).then((()=>{t()})).catch((()=>{this.player.pause().then((()=>{i()}))}))}))}_play(r){return new Promise(((A,s)=>{this._opt.url=r;const n=0===r.indexOf("http"),a=n?t:e,d=n||-1!==r.indexOf(".flv")||this._opt.isFlv?i:o;this.player.updateOption({protocol:a,demuxType:d}),this.player.once(C.mediaSourceH265NotSupport,(()=>{this.close().then((()=>{this.player._opt.autoWasm&&(this.player.debug.log("Jessibuca","auto wasm [mse-> wasm] reset player and play"),this._resetPlayer({useMSE:!1}),this.play(r).then((()=>{this.player.debug.log("Jessibuca","auto wasm [mse-> wasm] reset player and play success")})).catch((()=>{this.player.debug.log("Jessibuca","auto wasm [mse-> wasm] reset player and play error")})))}))})),this.player.once(C.webcodecsH265NotSupport,(()=>{this.close().then((()=>{this.player._opt.autoWasm&&(this.player.debug.log("Jessibuca","auto wasm [wcs-> wasm] reset player and play"),this._resetPlayer({useWCS:!1}),this.play(r).then((()=>{this.player.debug.log("Jessibuca","auto wasm [wcs-> wasm] reset player and play success")})).catch((()=>{this.player.debug.log("Jessibuca","auto wasm [wcs-> wasm] reset player and play error")})))}))})),this.player.once(C.wasmDecodeError,(()=>{this.player._opt.wasmDecodeErrorReplay&&this.close().then((()=>{this.player.debug.log("Jessibuca","wasm decode error and reset player and play"),this._resetPlayer({useWCS:!1}),this.play(r).then((()=>{this.player.debug.log("Jessibuca","wasm decode error and reset player and play success")})).catch((()=>{this.player.debug.log("Jessibuca","wasm decode error and reset player and play error")}))}))})),this.player.once(E.delayTimeout,(()=>{this.player._opt.heartTimeoutReplay&&this._heartTimeoutReplayTimes{this._heartTimeoutReplayTimes=0})).catch((()=>{})))})),this.player.once(E.loadingTimeout,(()=>{this.player._opt.loadingTimeoutReplay&&this._loadingTimeoutReplayTimes{this._loadingTimeoutReplayTimes=0})).catch((()=>{})))})),this.hasLoaded()?this.player.play(r).then((()=>{A()})).catch((()=>{this.player.pause().then((()=>{s()}))})):this.player.once(E.decoderWorkerInit,(()=>{this.player.play(r).then((()=>{A()})).catch((()=>{this.player.pause().then((()=>{s()}))}))}))}))}resize(){this.player.resize()}setBufferTime(e){e=Number(e),this.player.updateOption({videoBuffer:1e3*e}),this.player.decoderWorker&&this.player.decoderWorker.updateWorkConfig({key:"videoBuffer",value:1e3*e})}setRotate(e){e=parseInt(e,10);this._opt.rotate!==e&&-1!==[0,90,270].indexOf(e)&&(this.player.updateOption({rotate:e}),this.resize())}hasLoaded(){return this.player.loaded}setKeepScreenOn(){this.player.updateOption({keepScreenOn:!0})}setFullscreen(e){const t=!!e;this.player.fullscreen!==t&&(this.player.fullscreen=t)}screenshot(e,t,i,o){return this.player.video.screenshot(e,t,i,o)}startRecord(e,t){return new Promise(((i,o)=>{this.player.playing?(this.player.startRecord(e,t),i()):o()}))}stopRecordAndSave(){this.player.recording&&this.player.stopRecordAndSave()}isPlaying(){return this.player.playing}isMute(){return!this.player.audio||this.player.audio.isMute}isRecording(){return this.player.recorder.recording}}return window.Jessibuca=$e,$e}));
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).jessibuca=t()}(this,(function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t){return e(t={exports:{}},t.exports),t.exports}var i,o=t((function(e){e.exports=function(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e},e.exports.__esModule=!0,e.exports.default=e.exports})),r=(i=o)&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i;const A=0,s=1,n="flv",a="m7s",d={videoBuffer:1e3,isResize:!0,isFullResize:!1,isFlv:!1,debug:!1,hotKey:!1,loadingTimeout:10,heartTimeout:5,timeout:10,loadingTimeoutReplay:!1,heartTimeoutReplay:!1,loadingTimeoutReplayTimes:3,heartTimeoutReplayTimes:3,supportDblclickFullscreen:!1,showBandwidth:!1,keepScreenOn:!1,isNotMute:!1,hasAudio:!0,hasVideo:!0,operateBtns:{fullscreen:!1,screenshot:!1,play:!1,audio:!1,record:!1},controlAutoHide:!1,hasControl:!1,loadingText:"",background:"",decoder:"decoder.js",url:"",rotate:0,forceNoOffscreen:!0,hiddenAutoPause:!1,protocol:s,demuxType:n,useWCS:!1,wcsUseVideoRender:!1,useMSE:!1,useOffscreen:!1,autoWasm:!0,wasmDecodeErrorReplay:!0,openWebglAlignment:!1},c="init",l="initVideo",u="render",h="playAudio",p="initAudio",m="audioCode",g="videoCode",f="wasmError",b="Invalid NAL unit size",y=1,v=2,w=8,S=9,E="init",B="decode",C="audioDecode",R="close",k="updateConfig",T={fullscreen:"fullscreen$2",webFullscreen:"webFullscreen",decoderWorkerInit:"decoderWorkerInit",play:"play",playing:"playing",pause:"pause",mute:"mute",load:"load",loading:"loading",videoInfo:"videoInfo",timeUpdate:"timeUpdate",audioInfo:"audioInfo",log:"log",error:"error",kBps:"kBps",timeout:"timeout",delayTimeout:"delayTimeout",loadingTimeout:"loadingTimeout",stats:"stats",performance:"performance",record:"record",recording:"recording",recordingTimestamp:"recordingTimestamp",recordStart:"recordStart",recordEnd:"recordEnd",recordCreateError:"recordCreateError",buffer:"buffer",videoFrame:"videoFrame",start:"start",metadata:"metadata",resize:"resize",streamEnd:"streamEnd",streamSuccess:"streamSuccess",streamMessage:"streamMessage",streamError:"streamError",volumechange:"volumechange",destroy:"destroy",mseSourceOpen:"mseSourceOpen",mseSourceClose:"mseSourceClose",mseSourceBufferError:"mseSourceBufferError",mseSourceBufferBusy:"mseSourceBufferBusy",videoWaiting:"videoWaiting",videoTimeUpdate:"videoTimeUpdate",videoSyncAudio:"videoSyncAudio",playToRenderTimes:"playToRenderTimes"},I={load:T.load,timeUpdate:T.timeUpdate,videoInfo:T.videoInfo,audioInfo:T.audioInfo,error:T.error,kBps:T.kBps,log:T.log,start:T.start,timeout:T.timeout,loadingTimeout:T.loadingTimeout,delayTimeout:T.delayTimeout,fullscreen:"fullscreen",play:T.play,pause:T.pause,mute:T.mute,stats:T.stats,performance:T.performance,recordingTimestamp:T.recordingTimestamp,recordStart:T.recordStart,recordEnd:T.recordEnd,playToRenderTimes:T.playToRenderTimes},x={playError:"playIsNotPauseOrUrlIsNull",fetchError:"fetchError",websocketError:"websocketError",webcodecsH265NotSupport:"webcodecsH265NotSupport",mediaSourceH265NotSupport:"mediaSourceH265NotSupport",wasmDecodeError:"wasmDecodeError"},D="notConnect",j="open",L="close",U="error",F={download:"download",base64:"base64",blob:"blob"},V={7:"H264(AVC)",12:"H265(HEVC)"},O=7,M=12,Q={10:"AAC",7:"ALAW",8:"MULAW"},W=32,G=33,J=34,N=0,P=1,z=2,Y="mp4",H="webm",X="webcodecs",Z="webgl",q="offscreen",K="key",_="delta",$='video/mp4; codecs="avc1.64002A"',ee="ended",te="open",ie="closed",oe=1e3,re=27,Ae=38,se=40;class ne{constructor(e){this.log=function(t){if(e._opt.debug){for(var i=arguments.length,o=new Array(i>1?i-1:0),r=1;r1?i-1:0),r=1;r1?i-1:0),r=1;r3&&void 0!==arguments[3]?arguments[3]:{};if(!e)return;if(Array.isArray(t))return t.map((t=>this.proxy(e,t,i,o)));e.addEventListener(t,i,o);const r=()=>e.removeEventListener(t,i,o);return this.destroys.push(r),r}destroy(){this.master.debug&&this.master.debug.log("Events","destroy"),this.destroys.forEach((e=>e()))}}var de=t((function(e){!function(){var t="undefined"!=typeof window&&void 0!==window.document?window.document:{},i=e.exports,o=function(){for(var e,i=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],o=0,r=i.length,A={};o0&&void 0!==arguments[0]?arguments[0]:"";const t=e.split(","),i=atob(t[1]),o=t[0].replace("data:","").replace(";base64","");let r=i.length,A=new Uint8Array(r);for(;r--;)A[r]=i.charCodeAt(r);return new File([A],"file",{type:o})}function ue(e,t){const i=document.createElement("a");i.download=t,i.href=URL.createObjectURL(e),i.click(),setTimeout((()=>{URL.revokeObjectURL(e)}),ve()?1e3:0)}function he(){return(new Date).getTime()}function pe(e,t,i){return Math.max(Math.min(e,Math.max(t,i)),Math.min(t,i))}function me(e,t,i){if(e)return"object"==typeof t&&Object.keys(t).forEach((i=>{me(e,i,t[i])})),e.style[t]=i,e}function ge(e,t){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(!e)return 0;const o=getComputedStyle(e,null).getPropertyValue(t);return i?parseFloat(o):o}function fe(){return performance&&"function"==typeof performance.now?performance.now():Date.now()}function be(e){let t=0,i=fe();return o=>{t+=o;const r=fe(),A=r-i;A>=1e3&&(e(t/A*1e3),i=r,t=0)}}function ye(){return/iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(window.navigator.userAgent.toLowerCase())}function ve(){const e=window.navigator.userAgent.toLowerCase();return e&&/iphone|ipad|ipod|ios/.test(e)}function we(e){if(null==e||""===e)return"0 KB/S";let t=parseFloat(e);return t=t.toFixed(2),t+"KB/S"}function Se(e){return null==e}function Ee(e){return!Se(e)}de.isEnabled,(()=>{try{if("object"==typeof WebAssembly&&"function"==typeof WebAssembly.instantiate){const e=new WebAssembly.Module(Uint8Array.of(0,97,115,109,1,0,0,0));if(e instanceof WebAssembly.Module)return new WebAssembly.Instance(e)instanceof WebAssembly.Instance}}catch(e){}})();class Be{on(e,t,i){const o=this.e||(this.e={});return(o[e]||(o[e]=[])).push({fn:t,ctx:i}),this}once(e,t,i){const o=this;function r(){o.off(e,r);for(var A=arguments.length,s=new Array(A),n=0;n1?i-1:0),r=1;r{delete i[e]})),void delete this.e;const o=i[e],r=[];if(o&&t)for(let e=0,i=o.length;e{var i=["attribute vec4 vertexPos;","attribute vec4 texturePos;","varying vec2 textureCoord;","void main()","{","gl_Position = vertexPos;","textureCoord = texturePos.xy;","}"].join("\n"),o=["precision highp float;","varying highp vec2 textureCoord;","uniform sampler2D ySampler;","uniform sampler2D uSampler;","uniform sampler2D vSampler;","const mat4 YUV2RGB = mat4","(","1.1643828125, 0, 1.59602734375, -.87078515625,","1.1643828125, -.39176171875, -.81296875, .52959375,","1.1643828125, 2.017234375, 0, -1.081390625,","0, 0, 0, 1",");","void main(void) {","highp float y = texture2D(ySampler, textureCoord).r;","highp float u = texture2D(uSampler, textureCoord).r;","highp float v = texture2D(vSampler, textureCoord).r;","gl_FragColor = vec4(y, u, v, 1) * YUV2RGB;","}"].join("\n");t&&e.pixelStorei(e.UNPACK_ALIGNMENT,1);var r=e.createShader(e.VERTEX_SHADER);e.shaderSource(r,i),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)||console.log("Vertex shader failed to compile: "+e.getShaderInfoLog(r));var A=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(A,o),e.compileShader(A),e.getShaderParameter(A,e.COMPILE_STATUS)||console.log("Fragment shader failed to compile: "+e.getShaderInfoLog(A));var s=e.createProgram();e.attachShader(s,r),e.attachShader(s,A),e.linkProgram(s),e.getProgramParameter(s,e.LINK_STATUS)||console.log("Program failed to compile: "+e.getProgramInfoLog(s)),e.useProgram(s);var n=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,n),e.bufferData(e.ARRAY_BUFFER,new Float32Array([1,1,-1,1,1,-1,-1,-1]),e.STATIC_DRAW);var a=e.getAttribLocation(s,"vertexPos");e.enableVertexAttribArray(a),e.vertexAttribPointer(a,2,e.FLOAT,!1,0,0);var d=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,d),e.bufferData(e.ARRAY_BUFFER,new Float32Array([1,0,0,0,1,1,0,1]),e.STATIC_DRAW);var c=e.getAttribLocation(s,"texturePos");function l(t,i){var o=e.createTexture();return e.bindTexture(e.TEXTURE_2D,o),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),e.uniform1i(e.getUniformLocation(s,t),i),o}e.enableVertexAttribArray(c),e.vertexAttribPointer(c,2,e.FLOAT,!1,0,0);var u=l("ySampler",0),h=l("uSampler",1),p=l("vSampler",2);return{render:function(t,i,o,r,A){e.viewport(0,0,t,i),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,u),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,t,i,0,e.LUMINANCE,e.UNSIGNED_BYTE,o),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,h),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,t/2,i/2,0,e.LUMINANCE,e.UNSIGNED_BYTE,r),e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,p),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,t/2,i/2,0,e.LUMINANCE,e.UNSIGNED_BYTE,A),e.drawArrays(e.TRIANGLE_STRIP,0,4)},destroy:function(){try{e.deleteProgram(s),e.deleteBuffer(n),e.deleteBuffer(d),e.deleteTexture(u),e.deleteTexture(h),e.deleteBuffer(p)}catch(e){}}}})(this.contextGl,this.player._opt.openWebglAlignment);this.contextGlRender=e.render,this.contextGlDestroy=e.destroy}_initContext2D(){this.context2D=this.$videoElement.getContext("2d")}_initCanvasRender(){this.player._opt.useWCS&&!this._supportOffscreen()?(this.renderType=X,this._initContext2D()):this._supportOffscreen()?(this.renderType=q,this._bindOffscreen()):(this.renderType=Z,this._initContextGl())}_supportOffscreen(){return"function"==typeof this.$videoElement.transferControlToOffscreen&&this.player._opt.useOffscreen}_bindOffscreen(){this.bitmaprenderer=this.$videoElement.getContext("bitmaprenderer")}initCanvasViewSize(){this.$videoElement.width=this.videoInfo.width,this.$videoElement.height=this.videoInfo.height,this.resize()}render(e){switch(this.player.videoTimestamp=e.ts,this.renderType){case q:this.bitmaprenderer.transferFromImageBitmap(e.buffer);break;case Z:this.contextGlRender(this.$videoElement.width,this.$videoElement.height,e.output[0],e.output[1],e.output[2]);break;case X:this.context2D.drawImage(e.videoFrame,0,0,this.$videoElement.width,this.$videoElement.height)}}screenshot(e,t,i,o){e=e||he(),o=o||F.download;const r={png:"image/png",jpeg:"image/jpeg",webp:"image/webp"};let A=.92;!r[t]&&F[t]&&(o=t,t="png",i=void 0),"string"==typeof i&&(o=i,i=void 0),void 0!==i&&(A=Number(i));const s=this.$videoElement.toDataURL(r[t]||r.png,A),n=le(s);return o===F.base64?s:o===F.blob?n:void(o===F.download&&ue(n,e))}clearView(){switch(this.renderType){case q:(function(e,t){const i=document.createElement("canvas");return i.width=e,i.height=t,createImageBitmap(i,0,0,e,t)})(this.$videoElement.width,this.$videoElement.height).then((e=>{this.bitmaprenderer.transferFromImageBitmap(e)}));break;case Z:this.contextGl.clear(this.contextGl.COLOR_BUFFER_BIT);break;case X:this.context2D.clearRect(0,0,this.$videoElement.width,this.$videoElement.height)}}resize(){this.player.debug.log("canvasVideo","resize");const e=this.player._opt;let t=this.player.width,i=this.player.height;e.hasControl&&!e.controlAutoHide&&(ye()&&this.player.fullscreen?t-=38:i-=38);let o=this.$videoElement.width,r=this.$videoElement.height;const A=e.rotate;let s=(t-o)/2,n=(i-r)/2;270!==A&&90!==A||(o=this.$videoElement.height,r=this.$videoElement.width);const a=t/o,d=i/r;let c=a>d?d:a;e.isResize||a!==d&&(c=a+","+d),e.isFullResize&&(c=a>d?a:d);let l="scale("+c+")";A&&(l+=" rotate("+A+"deg)"),this.$videoElement.style.transform=l,this.$videoElement.style.left=s+"px",this.$videoElement.style.top=n+"px"}}class ke extends Ce{constructor(e){super(),this.player=e;const t=document.createElement("video");t.muted=!0,t.style.position="absolute",t.style.top=0,t.style.left=0,e.$container.appendChild(t),this.$videoElement=t,this.videoInfo={width:"",height:"",encType:""};const i=this.player._opt;i.useWCS&&i.wcsUseVideoRender&&(this.trackGenerator=new MediaStreamTrackGenerator({kind:"video"}),t.srcObject=new MediaStream([this.trackGenerator]),this.vwriter=this.trackGenerator.writable.getWriter()),this.resize();const{proxy:o}=this.player.events;o(this.$videoElement,"canplay",(()=>{this.player.debug.log("Video","canplay")})),o(this.$videoElement,"waiting",(()=>{this.player.emit(T.videoWaiting)})),o(this.$videoElement,"timeupdate",(e=>{})),this.player.debug.log("Video","init")}destroy(){this.player.$container.removeChild(this.$videoElement),this.$videoElement&&(this.$videoElement.src="",this.$videoElement=null),this.trackGenerator&&(this.trackGenerator=null),this.vwriter&&(this.trackGenerator=null),this.init=!1,this.off(),this.player.debug.log("Video","destroy")}play(){this.$videoElement.play()}clearView(){}screenshot(e,t,i,o){e=e||he(),o=o||F.download;let r=.92;!{png:"image/png",jpeg:"image/jpeg",webp:"image/webp"}[t]&&F[t]&&(o=t,t="png",i=void 0),"string"==typeof i&&(o=i,i=void 0),void 0!==i&&(r=Number(i));const A=this.$videoElement;let s=document.createElement("canvas");s.width=A.videoWidth,s.height=A.videoHeight;s.getContext("2d").drawImage(A,0,0,s.width,s.height);const n=s.toDataURL(F[t]||F.png,r),a=le(n);return o===F.base64?n:o===F.blob?a:void(o===F.download&&ue(a,e))}initCanvasViewSize(){this.resize()}render(e){this.vwriter&&this.vwriter.write(e.videoFrame)}resize(){let e=this.player.width,t=this.player.height;const i=this.player._opt,o=i.rotate;i.hasControl&&!i.controlAutoHide&&(ye()&&this.player.fullscreen?e-=38:t-=38),this.$videoElement.width=e,this.$videoElement.height=t,270!==o&&90!==o||(this.$videoElement.width=t,this.$videoElement.height=e);let r=(e-this.$videoElement.width)/2,A=(t-this.$videoElement.height)/2,s="contain";i.isResize||(s="fill"),i.isFullResize&&(s="none"),this.$videoElement.style.objectFit=s,this.$videoElement.style.transform="rotate("+o+"deg)",this.$videoElement.style.left=r+"px",this.$videoElement.style.top=A+"px"}}class Te{constructor(e){return new(Te.getLoaderFactory(e._opt))(e)}static getLoaderFactory(e){return e.useMSE||e.useWCS&&e.wcsUseVideoRender?ke:Re}}class Ie extends Be{constructor(e){super(),this.bufferList=[],this.player=e,this.scriptNode=null,this.hasInitScriptNode=!1,this.audioContextChannel=null,this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.gainNode=this.audioContext.createGain();const t=this.audioContext.createBufferSource();t.buffer=this.audioContext.createBuffer(1,1,22050),t.connect(this.audioContext.destination),t.noteOn?t.noteOn(0):t.start(0),this.audioBufferSourceNode=t,this.mediaStreamAudioDestinationNode=this.audioContext.createMediaStreamDestination(),this.audioEnabled(!0),this.gainNode.gain.value=0,this.playing=!1,this.audioSyncVideoOption={diff:null},this.audioInfo={encType:"",channels:"",sampleRate:""},this.init=!1,this.hasAudio=!1,this.on(T.videoSyncAudio,(e=>{this.audioSyncVideoOption=e})),this.player.debug.log("AudioContext","init")}destroy(){this.closeAudio(),this.audioContext.close(),this.audioContext=null,this.gainNode=null,this.init=!1,this.hasAudio=!1,this.playing=!1,this.scriptNode&&(this.scriptNode.onaudioprocess=ce,this.scriptNode=null),this.audioBufferSourceNode=null,this.mediaStreamAudioDestinationNode=null,this.hasInitScriptNode=!1,this.audioSyncVideoOption={diff:null},this.audioInfo={encType:"",channels:"",sampleRate:""},this.off(),this.player.debug.log("AudioContext","destroy")}updateAudioInfo(e){e.encTypeCode&&(this.audioInfo.encType=Q[e.encTypeCode]),e.channels&&(this.audioInfo.channels=e.channels),e.sampleRate&&(this.audioInfo.sampleRate=e.sampleRate),this.audioInfo.sampleRate&&this.audioInfo.channels&&this.audioInfo.encType&&!this.init&&(this.player.emit(T.audioInfo,this.audioInfo),this.init=!0)}get isPlaying(){return this.playing}get isMute(){return 0===this.gainNode.gain.value||this.isStateSuspended()}get volume(){return this.gainNode.gain.value}get bufferSize(){return this.bufferList.length}initScriptNode(){if(this.playing=!0,this.hasInitScriptNode)return;const e=this.audioInfo.channels,t=this.audioContext.createScriptProcessor(1024,0,e);t.onaudioprocess=t=>{const i=t.outputBuffer;if(this.bufferList.length&&this.playing){if(!this.player._opt.useWCS&&!this.player._opt.useMSE){if(this.audioSyncVideoOption.diff>oe)return void this.player.debug.warn("AudioContext",`audioSyncVideoOption more than diff :${this.audioSyncVideoOption.diff}, waiting`);if(this.audioSyncVideoOption.diff<-1e3){this.player.debug.warn("AudioContext",`audioSyncVideoOption less than diff :${this.audioSyncVideoOption.diff}, dropping`);let e=this.bufferList.shift();for(;e.ts-this.player.videoTimestamp<-1e3&&this.bufferList.length>0;)e=this.bufferList.shift();if(0===this.bufferList.length)return}}if(0===this.bufferList.length)return;const t=this.bufferList.shift();t&&t.ts&&(this.player.audioTimestamp=t.ts);for(let o=0;o20&&(this.player.debug.warn("AudioContext",`bufferList is large: ${this.bufferList.length}`),this.bufferList.length>50&&this.bufferList.shift()))}pause(){this.audioSyncVideoOption={diff:null},this.playing=!1,this.clear()}resume(){this.playing=!0}}class xe{constructor(e){return new(xe.getLoaderFactory())(e)}static getLoaderFactory(){return Ie}}class De extends Be{constructor(e){super(),this.player=e,this.playing=!1,this.abortController=new AbortController,this.streamRate=be((t=>{e.emit(T.kBps,(t/1024).toFixed(2))})),e.debug.log("FetchStream","init")}destroy(){this.abort(),this.off(),this.streamRate=null,this.player.debug.log("FetchStream","destroy")}fetchStream(e){const{demux:t}=this.player;this.player._times.streamStart=he(),fetch(e,{signal:this.abortController.signal}).then((e=>{const i=e.body.getReader();this.emit(T.streamSuccess);const o=()=>{i.read().then((e=>{let{done:i,value:r}=e;i?t.close():(this.streamRate&&this.streamRate(r.byteLength),t.dispatch(r),o())})).catch((e=>{t.close(),this.emit(x.fetchError,e),this.player.emit(T.error,x.fetchError),this.abort()}))};o()})).catch((e=>{this.abort(),this.emit(x.fetchError,e),this.player.emit(T.error,x.fetchError)}))}abort(){this.abortController&&(this.abortController.abort(),this.abortController=null)}}class je extends Be{constructor(e){super(),this.player=e,this.socket=null,this.socketStatus=D,this.wsUrl=null,this.streamRate=be((t=>{e.emit(T.kBps,(t/1024).toFixed(2))}))}destroy(){this.socket&&(this.socket.close(),this.socket=null),this.socketStatus=D,this.streamRate=null,this.wsUrl=null,this.off(),this.player.debug.log("websocketLoader","destroy")}_createWebSocket(){const e=this.player,{debug:t,events:{proxy:i},demux:o}=e;this.socket=new WebSocket(this.wsUrl),this.socket.binaryType="arraybuffer",i(this.socket,"open",(()=>{this.emit(T.streamSuccess),t.log("websocketLoader","socket open"),this.socketStatus=j})),i(this.socket,"message",(e=>{this.streamRate&&this.streamRate(e.data.byteLength),this._handleMessage(e.data)})),i(this.socket,"close",(()=>{t.log("websocketLoader","socket close"),this.emit(T.streamEnd),this.socketStatus=L})),i(this.socket,"error",(e=>{t.log("websocketLoader","socket error"),this.emit(x.websocketError,e),this.player.emit(T.error,x.websocketError),this.socketStatus=U,o.close(),t.log("websocketLoader","socket error:",e)}))}_handleMessage(e){const{demux:t}=this.player;t?t.dispatch(e):this.player.debug.warn("websocketLoader","websocket handle message demux is null")}fetchStream(e){this.player._times.streamStart=he(),this.wsUrl=e,this._createWebSocket()}}class Le{constructor(e){return new(Le.getLoaderFactory(e._opt.protocol))(e)}static getLoaderFactory(e){return e===s?De:e===A?je:void 0}}var Ue=t((function(t){function i(e,t){if(!e)throw"First parameter is required.";t=new o(e,t=t||{type:"video"});var A=this;function s(i){i&&(t.initCallback=function(){i(),i=t.initCallback=null});var o=new r(e,t);(h=new o(e,t)).record(),u("recording"),t.disableLogs||console.log("Initialized recorderType:",h.constructor.name,"for output-type:",t.type)}function n(e){if(e=e||function(){},h){if("paused"===A.state)return A.resumeRecording(),void setTimeout((function(){n(e)}),1);"recording"===A.state||t.disableLogs||console.warn('Recording state should be: "recording", however current state is: ',A.state),t.disableLogs||console.log("Stopped recording "+t.type+" stream."),"gif"!==t.type?h.stop(i):(h.stop(),i()),u("stopped")}else m();function i(i){if(h){Object.keys(h).forEach((function(e){"function"!=typeof h[e]&&(A[e]=h[e])}));var o=h.blob;if(!o){if(!i)throw"Recording failed.";h.blob=o=i}if(o&&!t.disableLogs&&console.log(o.type,"->",b(o.size)),e){var r;try{r=l.createObjectURL(o)}catch(e){}"function"==typeof e.call?e.call(A,r):e(r)}t.autoWriteToDisk&&d((function(e){var i={};i[t.type+"Blob"]=e,x.Store(i)}))}else"function"==typeof e.call?e.call(A,""):e("")}}function a(e){postMessage((new FileReaderSync).readAsDataURL(e))}function d(e,i){if(!e)throw"Pass a callback function over getDataURL.";var o=i?i.blob:(h||{}).blob;if(!o)return t.disableLogs||console.warn("Blob encoder did not finish its job yet."),void setTimeout((function(){d(e,i)}),1e3);if("undefined"==typeof Worker||navigator.mozGetUserMedia){var r=new FileReader;r.readAsDataURL(o),r.onload=function(t){e(t.target.result)}}else{var A=function(e){try{var t=l.createObjectURL(new Blob([e.toString(),"this.onmessage = function (eee) {"+e.name+"(eee.data);}"],{type:"application/javascript"})),i=new Worker(t);return l.revokeObjectURL(t),i}catch(e){}}(a);A.onmessage=function(t){e(t.data)},A.postMessage(o)}}function c(e){e=e||0,"paused"!==A.state?"stopped"!==A.state&&(e>=A.recordingDuration?n(A.onRecordingStopped):(e+=1e3,setTimeout((function(){c(e)}),1e3))):setTimeout((function(){c(e)}),1e3)}function u(e){A&&(A.state=e,"function"==typeof A.onStateChanged.call?A.onStateChanged.call(A,e):A.onStateChanged(e))}var h,p='It seems that recorder is destroyed or "startRecording" is not invoked for '+t.type+" recorder.";function m(){!0!==t.disableLogs&&console.warn(p)}var g={startRecording:function(i){return t.disableLogs||console.log("RecordRTC version: ",A.version),i&&(t=new o(e,i)),t.disableLogs||console.log("started recording "+t.type+" stream."),h?(h.clearRecordedData(),h.record(),u("recording"),A.recordingDuration&&c(),A):(s((function(){A.recordingDuration&&c()})),A)},stopRecording:n,pauseRecording:function(){h?"recording"===A.state?(u("paused"),h.pause(),t.disableLogs||console.log("Paused recording.")):t.disableLogs||console.warn("Unable to pause the recording. Recording state: ",A.state):m()},resumeRecording:function(){h?"paused"===A.state?(u("recording"),h.resume(),t.disableLogs||console.log("Resumed recording.")):t.disableLogs||console.warn("Unable to resume the recording. Recording state: ",A.state):m()},initRecorder:s,setRecordingDuration:function(e,t){if(void 0===e)throw"recordingDuration is required.";if("number"!=typeof e)throw"recordingDuration must be a number.";return A.recordingDuration=e,A.onRecordingStopped=t||function(){},{onRecordingStopped:function(e){A.onRecordingStopped=e}}},clearRecordedData:function(){h?(h.clearRecordedData(),t.disableLogs||console.log("Cleared old recorded data.")):m()},getBlob:function(){if(h)return h.blob;m()},getDataURL:d,toURL:function(){if(h)return l.createObjectURL(h.blob);m()},getInternalRecorder:function(){return h},save:function(e){h?y(h.blob,e):m()},getFromDisk:function(e){h?i.getFromDisk(t.type,e):m()},setAdvertisementArray:function(e){t.advertisement=[];for(var i=e.length,o=0;o-1&&"netscape"in window&&/ rv:/.test(navigator.userAgent),m=!h&&!u&&!!navigator.webkitGetUserMedia||v()||-1!==navigator.userAgent.toLowerCase().indexOf("chrome/"),g=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);g&&!m&&-1!==navigator.userAgent.indexOf("CriOS")&&(g=!1,m=!0);var f=window.MediaStream;function b(e){if(0===e)return"0 Bytes";var t=parseInt(Math.floor(Math.log(e)/Math.log(1e3)),10);return(e/Math.pow(1e3,t)).toPrecision(3)+" "+["Bytes","KB","MB","GB","TB"][t]}function y(e,t){if(!e)throw"Blob object is required.";if(!e.type)try{e.type="video/webm"}catch(e){}var i=(e.type||"video/webm").split("/")[1];if(-1!==i.indexOf(";")&&(i=i.split(";")[0]),t&&-1!==t.indexOf(".")){var o=t.split(".");t=o[0],i=o[1]}var r=(t||Math.round(9999999999*Math.random())+888888888)+"."+i;if(void 0!==navigator.msSaveOrOpenBlob)return navigator.msSaveOrOpenBlob(e,r);if(void 0!==navigator.msSaveBlob)return navigator.msSaveBlob(e,r);var A=document.createElement("a");A.href=l.createObjectURL(e),A.download=r,A.style="display:none;opacity:0;color:transparent;",(document.body||document.documentElement).appendChild(A),"function"==typeof A.click?A.click():(A.target="_blank",A.dispatchEvent(new MouseEvent("click",{view:window,bubbles:!0,cancelable:!0}))),l.revokeObjectURL(A.href)}function v(){return"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0)}function w(e,t){return e&&e.getTracks?e.getTracks().filter((function(e){return e.kind===(t||"audio")})):[]}function S(e,t){"srcObject"in t?t.srcObject=e:"mozSrcObject"in t?t.mozSrcObject=e:t.srcObject=e}void 0===f&&"undefined"!=typeof webkitMediaStream&&(f=webkitMediaStream),void 0!==f&&void 0===f.prototype.stop&&(f.prototype.stop=function(){this.getTracks().forEach((function(e){e.stop()}))}),i.invokeSaveAsDialog=y,i.getTracks=w,i.getSeekableBlob=function(e,t){if("undefined"==typeof EBML)throw new Error("Please link: https://www.webrtc-experiment.com/EBML.js");var i=new EBML.Reader,o=new EBML.Decoder,r=EBML.tools,A=new FileReader;A.onload=function(e){o.decode(this.result).forEach((function(e){i.read(e)})),i.stop();var A=r.makeMetadataSeekable(i.metadatas,i.duration,i.cues),s=this.result.slice(i.metadataSize),n=new Blob([A,s],{type:"video/webm"});t(n)},A.readAsArrayBuffer(e)},i.bytesToSize=b,i.isElectron=v;var E={};function B(){if(p||g||u)return!0;var e,t,i=navigator.userAgent,o=""+parseFloat(navigator.appVersion),r=parseInt(navigator.appVersion,10);return(m||h)&&(e=i.indexOf("Chrome"),o=i.substring(e+7)),-1!==(t=o.indexOf(";"))&&(o=o.substring(0,t)),-1!==(t=o.indexOf(" "))&&(o=o.substring(0,t)),r=parseInt(""+o,10),isNaN(r)&&(o=""+parseFloat(navigator.appVersion),r=parseInt(navigator.appVersion,10)),r>=49}function C(e,t){var i=this;if(void 0===e)throw'First argument "MediaStream" is required.';if("undefined"==typeof MediaRecorder)throw"Your browser does not support the Media Recorder API. Please try other modules e.g. WhammyRecorder or StereoAudioRecorder.";if("audio"===(t=t||{mimeType:"video/webm"}).type){var o;if(w(e,"video").length&&w(e,"audio").length)navigator.mozGetUserMedia?(o=new f).addTrack(w(e,"audio")[0]):o=new f(w(e,"audio")),e=o;t.mimeType&&-1!==t.mimeType.toString().toLowerCase().indexOf("audio")||(t.mimeType=m?"audio/webm":"audio/ogg"),t.mimeType&&"audio/ogg"!==t.mimeType.toString().toLowerCase()&&navigator.mozGetUserMedia&&(t.mimeType="audio/ogg")}var r,A=[];function s(){i.timestamps.push((new Date).getTime()),"function"==typeof t.onTimeStamp&&t.onTimeStamp(i.timestamps[i.timestamps.length-1],i.timestamps)}function n(e){return r&&r.mimeType?r.mimeType:e.mimeType||"video/webm"}function a(){A=[],r=null,i.timestamps=[]}this.getArrayOfBlobs=function(){return A},this.record=function(){i.blob=null,i.clearRecordedData(),i.timestamps=[],d=[],A=[];var o=t;t.disableLogs||console.log("Passing following config over MediaRecorder API.",o),r&&(r=null),m&&!B()&&(o="video/vp8"),"function"==typeof MediaRecorder.isTypeSupported&&o.mimeType&&(MediaRecorder.isTypeSupported(o.mimeType)||(t.disableLogs||console.warn("MediaRecorder API seems unable to record mimeType:",o.mimeType),o.mimeType="audio"===t.type?"audio/webm":"video/webm"));try{r=new MediaRecorder(e,o),t.mimeType=o.mimeType}catch(t){r=new MediaRecorder(e)}o.mimeType&&!MediaRecorder.isTypeSupported&&"canRecordMimeType"in r&&!1===r.canRecordMimeType(o.mimeType)&&(t.disableLogs||console.warn("MediaRecorder API seems unable to record mimeType:",o.mimeType)),r.ondataavailable=function(e){if(e.data&&d.push("ondataavailable: "+b(e.data.size)),"number"!=typeof t.timeSlice)!e.data||!e.data.size||e.data.size<100||i.blob?i.recordingCallback&&(i.recordingCallback(new Blob([],{type:n(o)})),i.recordingCallback=null):(i.blob=t.getNativeBlob?e.data:new Blob([e.data],{type:n(o)}),i.recordingCallback&&(i.recordingCallback(i.blob),i.recordingCallback=null));else if(e.data&&e.data.size&&(A.push(e.data),s(),"function"==typeof t.ondataavailable)){var r=t.getNativeBlob?e.data:new Blob([e.data],{type:n(o)});t.ondataavailable(r)}},r.onstart=function(){d.push("started")},r.onpause=function(){d.push("paused")},r.onresume=function(){d.push("resumed")},r.onstop=function(){d.push("stopped")},r.onerror=function(e){e&&(e.name||(e.name="UnknownError"),d.push("error: "+e),t.disableLogs||(-1!==e.name.toString().toLowerCase().indexOf("invalidstate")?console.error("The MediaRecorder is not in a state in which the proposed operation is allowed to be executed.",e):-1!==e.name.toString().toLowerCase().indexOf("notsupported")?console.error("MIME type (",o.mimeType,") is not supported.",e):-1!==e.name.toString().toLowerCase().indexOf("security")?console.error("MediaRecorder security error",e):"OutOfMemory"===e.name?console.error("The UA has exhaused the available memory. User agents SHOULD provide as much additional information as possible in the message attribute.",e):"IllegalStreamModification"===e.name?console.error("A modification to the stream has occurred that makes it impossible to continue recording. An example would be the addition of a Track while recording is occurring. User agents SHOULD provide as much additional information as possible in the message attribute.",e):"OtherRecordingError"===e.name?console.error("Used for an fatal error other than those listed above. User agents SHOULD provide as much additional information as possible in the message attribute.",e):"GenericError"===e.name?console.error("The UA cannot provide the codec or recording option that has been requested.",e):console.error("MediaRecorder Error",e)),function(e){if(!i.manuallyStopped&&r&&"inactive"===r.state)return delete t.timeslice,void r.start(6e5);setTimeout(void 0,1e3)}(),"inactive"!==r.state&&"stopped"!==r.state&&r.stop())},"number"==typeof t.timeSlice?(s(),r.start(t.timeSlice)):r.start(36e5),t.initCallback&&t.initCallback()},this.timestamps=[],this.stop=function(e){e=e||function(){},i.manuallyStopped=!0,r&&(this.recordingCallback=e,"recording"===r.state&&r.stop(),"number"==typeof t.timeSlice&&setTimeout((function(){i.blob=new Blob(A,{type:n(t)}),i.recordingCallback(i.blob)}),100))},this.pause=function(){r&&"recording"===r.state&&r.pause()},this.resume=function(){r&&"paused"===r.state&&r.resume()},this.clearRecordedData=function(){r&&"recording"===r.state&&i.stop(a),a()},this.getInternalRecorder=function(){return r},this.blob=null,this.getState=function(){return r&&r.state||"inactive"};var d=[];this.getAllStates=function(){return d},void 0===t.checkForInactiveTracks&&(t.checkForInactiveTracks=!1);i=this;!function o(){if(r&&!1!==t.checkForInactiveTracks)return!1===function(){if("active"in e){if(!e.active)return!1}else if("ended"in e&&e.ended)return!1;return!0}()?(t.disableLogs||console.log("MediaStream seems stopped."),void i.stop()):void setTimeout(o,1e3)}(),this.name="MediaStreamRecorder",this.toString=function(){return this.name}}function R(e,t){if(!w(e,"audio").length)throw"Your stream has no audio tracks.";var o,r=this,A=[],s=[],n=!1,a=0,d=2,c=(t=t||{}).desiredSampRate;function u(){if(!1===t.checkForInactiveTracks)return!0;if("active"in e){if(!e.active)return!1}else if("ended"in e&&e.ended)return!1;return!0}function h(e,t){function i(e,t){var i,o=e.numberOfAudioChannels,r=e.leftBuffers.slice(0),A=e.rightBuffers.slice(0),s=e.sampleRate,n=e.internalInterleavedLength,a=e.desiredSampRate;function d(e,t,i){var o=Math.round(e.length*(t/i)),r=[],A=Number((e.length-1)/(o-1));r[0]=e[0];for(var s=1;s96e3)&&(t.disableLogs||console.log("sample-rate must be under range 22050 and 96000.")),t.disableLogs||t.desiredSampRate&&console.log("Desired sample-rate: "+t.desiredSampRate);var y=!1;function v(){A=[],s=[],a=0,E=!1,n=!1,y=!1,p=null,r.leftchannel=A,r.rightchannel=s,r.numberOfAudioChannels=d,r.desiredSampRate=c,r.sampleRate=b,r.recordingLength=a,B={left:[],right:[],recordingLength:0}}function S(){o&&(o.onaudioprocess=null,o.disconnect(),o=null),m&&(m.disconnect(),m=null),v()}this.pause=function(){y=!0},this.resume=function(){if(!1===u())throw"Please make sure MediaStream is active.";if(!n)return t.disableLogs||console.log("Seems recording has been restarted."),void this.record();y=!1},this.clearRecordedData=function(){t.checkForInactiveTracks=!1,n&&this.stop(S),S()},this.name="StereoAudioRecorder",this.toString=function(){return this.name};var E=!1;o.onaudioprocess=function(e){if(!y)if(!1===u()&&(t.disableLogs||console.log("MediaStream seems stopped."),o.disconnect(),n=!1),n){E||(E=!0,t.onAudioProcessStarted&&t.onAudioProcessStarted(),t.initCallback&&t.initCallback());var i=e.inputBuffer.getChannelData(0),c=new Float32Array(i);if(A.push(c),2===d){var l=e.inputBuffer.getChannelData(1),h=new Float32Array(l);s.push(h)}a+=f,r.recordingLength=a,void 0!==t.timeSlice&&(B.recordingLength+=f,B.left.push(c),2===d&&B.right.push(h))}else m&&(m.disconnect(),m=null)},p.createMediaStreamDestination?o.connect(p.createMediaStreamDestination()):o.connect(p.destination),this.leftchannel=A,this.rightchannel=s,this.numberOfAudioChannels=d,this.desiredSampRate=c,this.sampleRate=b,r.recordingLength=a;var B={left:[],right:[],recordingLength:0};function C(){n&&"function"==typeof t.ondataavailable&&void 0!==t.timeSlice&&(B.left.length?(h({desiredSampRate:c,sampleRate:b,numberOfAudioChannels:d,internalInterleavedLength:B.recordingLength,leftBuffers:B.left,rightBuffers:1===d?[]:B.right},(function(e,i){var o=new Blob([i],{type:"audio/wav"});t.ondataavailable(o),setTimeout(C,t.timeSlice)})),B={left:[],right:[],recordingLength:0}):setTimeout(C,t.timeSlice))}}function k(e,t){if("undefined"==typeof html2canvas)throw"Please link: https://www.webrtc-experiment.com/screenshot.js";(t=t||{}).frameInterval||(t.frameInterval=10);var i=!1;["captureStream","mozCaptureStream","webkitCaptureStream"].forEach((function(e){e in document.createElement("canvas")&&(i=!0)}));var o,r,A,s=!(!window.webkitRTCPeerConnection&&!window.webkitGetUserMedia||!window.chrome),n=50,a=navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);if(s&&a&&a[2]&&(n=parseInt(a[2],10)),s&&n<52&&(i=!1),t.useWhammyRecorder&&(i=!1),i)if(t.disableLogs||console.log("Your browser supports both MediRecorder API and canvas.captureStream!"),e instanceof HTMLCanvasElement)o=e;else{if(!(e instanceof CanvasRenderingContext2D))throw"Please pass either HTMLCanvasElement or CanvasRenderingContext2D.";o=e.canvas}else navigator.mozGetUserMedia&&(t.disableLogs||console.error("Canvas recording is NOT supported in Firefox."));this.record=function(){if(A=!0,i&&!t.useWhammyRecorder){var e;"captureStream"in o?e=o.captureStream(25):"mozCaptureStream"in o?e=o.mozCaptureStream(25):"webkitCaptureStream"in o&&(e=o.webkitCaptureStream(25));try{var s=new f;s.addTrack(w(e,"video")[0]),e=s}catch(e){}if(!e)throw"captureStream API are NOT available.";(r=new C(e,{mimeType:t.mimeType||"video/webm"})).record()}else h.frames=[],u=(new Date).getTime(),l();t.initCallback&&t.initCallback()},this.getWebPImages=function(i){if("canvas"===e.nodeName.toLowerCase()){var o=h.frames.length;h.frames.forEach((function(e,i){var r=o-i;t.disableLogs||console.log(r+"/"+o+" frames remaining"),t.onEncodingCallback&&t.onEncodingCallback(r,o);var A=e.image.toDataURL("image/webp",1);h.frames[i].image=A})),t.disableLogs||console.log("Generating WebM"),i()}else i()},this.stop=function(e){A=!1;var o=this;i&&r?r.stop(e):this.getWebPImages((function(){h.compile((function(i){t.disableLogs||console.log("Recording finished!"),o.blob=i,o.blob.forEach&&(o.blob=new Blob([],{type:"video/webm"})),e&&e(o.blob),h.frames=[]}))}))};var d=!1;function c(){h.frames=[],A=!1,d=!1}function l(){if(d)return u=(new Date).getTime(),setTimeout(l,500);if("canvas"===e.nodeName.toLowerCase()){var i=(new Date).getTime()-u;return u=(new Date).getTime(),h.frames.push({image:(o=document.createElement("canvas"),r=o.getContext("2d"),o.width=e.width,o.height=e.height,r.drawImage(e,0,0),o),duration:i}),void(A&&setTimeout(l,t.frameInterval))}var o,r;html2canvas(e,{grabMouse:void 0===t.showMousePointer||t.showMousePointer,onrendered:function(e){var i=(new Date).getTime()-u;if(!i)return setTimeout(l,t.frameInterval);u=(new Date).getTime(),h.frames.push({image:e.toDataURL("image/webp",1),duration:i}),A&&setTimeout(l,t.frameInterval)}})}this.pause=function(){d=!0,r instanceof C&&r.pause()},this.resume=function(){d=!1,r instanceof C?r.resume():A||this.record()},this.clearRecordedData=function(){A&&this.stop(c),c()},this.name="CanvasRecorder",this.toString=function(){return this.name};var u=(new Date).getTime(),h=new I.Video(100)}function T(e,t){function i(e){e=void 0!==e?e:10;var t=(new Date).getTime()-a;return t?A?(a=(new Date).getTime(),setTimeout(i,100)):(a=(new Date).getTime(),n.paused&&n.play(),l.drawImage(n,0,0,c.width,c.height),d.frames.push({duration:t,image:c.toDataURL("image/webp")}),void(r||setTimeout(i,e,e))):setTimeout(i,e,e)}function o(e,t,i,o,r){var A=document.createElement("canvas");A.width=c.width,A.height=c.height;var s,n,a,d=A.getContext("2d"),l=[],u=-1===t,h=t&&t>0&&t<=e.length?t:e.length,p=0,m=0,g=0,f=Math.sqrt(Math.pow(255,2)+Math.pow(255,2)+Math.pow(255,2)),b=i&&i>=0&&i<=1?i:0,y=o&&o>=0&&o<=1?o:0,v=!1;n=-1,a=(s={length:h,functionToLoop:function(t,i){var o,r,A,s=function(){!v&&A-o<=A*y||(u&&(v=!0),l.push(e[i])),t()};if(v)s();else{var n=new Image;n.onload=function(){d.drawImage(n,0,0,c.width,c.height);var e=d.getImageData(0,0,c.width,c.height);o=0,r=e.data.length,A=e.data.length/4;for(var t=0;t127)throw"TrackNumber > 127 not supported";return[128|e.trackNum,e.timecode>>8,255&e.timecode,t].map((function(e){return String.fromCharCode(e)})).join("")+e.frame}({discardable:0,frame:e.data.slice(4),invisible:0,keyframe:1,lacing:0,trackNum:1,timecode:Math.round(t)});return t+=e.duration,{data:i,id:163}})))}function i(e){for(var t=[];e>0;)t.push(255&e),e>>=8;return new Uint8Array(t.reverse())}function o(e){var t=[];e=(e.length%8?new Array(9-e.length%8).join("0"):"")+e;for(var i=0;i1?2*A[0].width:A[0].width;var n=1;3!==e&&4!==e||(n=2),5!==e&&6!==e||(n=3),7!==e&&8!==e||(n=4),9!==e&&10!==e||(n=5),r.height=A[0].height*n}else r.width=s.width||360,r.height=s.height||240;t&&t instanceof HTMLVideoElement&&u(t),A.forEach((function(e,t){u(e,t)})),setTimeout(l,s.frameInterval)}}function u(e,t){if(!o){var i=0,r=0,s=e.width,n=e.height;1===t&&(i=e.width),2===t&&(r=e.height),3===t&&(i=e.width,r=e.height),4===t&&(r=2*e.height),5===t&&(i=e.width,r=2*e.height),6===t&&(r=3*e.height),7===t&&(i=e.width,r=3*e.height),void 0!==e.stream.left&&(i=e.stream.left),void 0!==e.stream.top&&(r=e.stream.top),void 0!==e.stream.width&&(s=e.stream.width),void 0!==e.stream.height&&(n=e.stream.height),A.drawImage(e,i,r,s,n),"function"==typeof e.stream.onRender&&e.stream.onRender(A,i,r,s,n,t)}}function h(e){var i=document.createElement("video");return function(e,t){"srcObject"in t?t.srcObject=e:"mozSrcObject"in t?t.mozSrcObject=e:t.srcObject=e}(e,i),i.className=t,i.muted=!0,i.volume=0,i.width=e.width||s.width||360,i.height=e.height||s.height||240,i.play(),i}function p(t){i=[],(t=t||e).forEach((function(e){if(e.getTracks().filter((function(e){return"video"===e.kind})).length){var t=h(e);t.stream=e,i.push(t)}}))}void 0!==n?c.AudioContext=n:"undefined"!=typeof webkitAudioContext&&(c.AudioContext=webkitAudioContext),this.startDrawingFrames=function(){l()},this.appendStreams=function(t){if(!t)throw"First parameter is required.";t instanceof Array||(t=[t]),t.forEach((function(t){var o=new d;if(t.getTracks().filter((function(e){return"video"===e.kind})).length){var r=h(t);r.stream=t,i.push(r),o.addTrack(t.getTracks().filter((function(e){return"video"===e.kind}))[0])}if(t.getTracks().filter((function(e){return"audio"===e.kind})).length){var A=s.audioContext.createMediaStreamSource(t);s.audioDestination=s.audioContext.createMediaStreamDestination(),A.connect(s.audioDestination),o.addTrack(s.audioDestination.stream.getTracks().filter((function(e){return"audio"===e.kind}))[0])}e.push(o)}))},this.releaseStreams=function(){i=[],o=!0,s.gainNode&&(s.gainNode.disconnect(),s.gainNode=null),s.audioSources.length&&(s.audioSources.forEach((function(e){e.disconnect()})),s.audioSources=[]),s.audioDestination&&(s.audioDestination.disconnect(),s.audioDestination=null),s.audioContext&&s.audioContext.close(),s.audioContext=null,A.clearRect(0,0,r.width,r.height),r.stream&&(r.stream.stop(),r.stream=null)},this.resetVideoStreams=function(e){!e||e instanceof Array||(e=[e]),p(e)},this.name="MultiStreamsMixer",this.toString=function(){return this.name},this.getMixedStream=function(){o=!1;var t=function(){var e;p(),"captureStream"in r?e=r.captureStream():"mozCaptureStream"in r?e=r.mozCaptureStream():s.disableLogs||console.error("Upgrade to latest Chrome or otherwise enable this flag: chrome://flags/#enable-experimental-web-platform-features");var t=new d;return e.getTracks().filter((function(e){return"video"===e.kind})).forEach((function(e){t.addTrack(e)})),r.stream=t,t}(),i=function(){c.AudioContextConstructor||(c.AudioContextConstructor=new c.AudioContext);s.audioContext=c.AudioContextConstructor,s.audioSources=[],!0===s.useGainNode&&(s.gainNode=s.audioContext.createGain(),s.gainNode.connect(s.audioContext.destination),s.gainNode.gain.value=0);var t=0;if(e.forEach((function(e){if(e.getTracks().filter((function(e){return"audio"===e.kind})).length){t++;var i=s.audioContext.createMediaStreamSource(e);!0===s.useGainNode&&i.connect(s.gainNode),s.audioSources.push(i)}})),!t)return;return s.audioDestination=s.audioContext.createMediaStreamDestination(),s.audioSources.forEach((function(e){e.connect(s.audioDestination)})),s.audioDestination.stream}();return i&&i.getTracks().filter((function(e){return"audio"===e.kind})).forEach((function(e){t.addTrack(e)})),e.forEach((function(e){e.fullcanvas})),t}}function L(e,t){e=e||[];var i,o,r=this;(t=t||{elementClass:"multi-streams-mixer",mimeType:"video/webm",video:{width:360,height:240}}).frameInterval||(t.frameInterval=10),t.video||(t.video={}),t.video.width||(t.video.width=360),t.video.height||(t.video.height=240),this.record=function(){var r;i=new j(e,t.elementClass||"multi-streams-mixer"),(r=[],e.forEach((function(e){w(e,"video").forEach((function(e){r.push(e)}))})),r).length&&(i.frameInterval=t.frameInterval||10,i.width=t.video.width||360,i.height=t.video.height||240,i.startDrawingFrames()),t.previewStream&&"function"==typeof t.previewStream&&t.previewStream(i.getMixedStream()),(o=new C(i.getMixedStream(),t)).record()},this.stop=function(e){o&&o.stop((function(t){r.blob=t,e(t),r.clearRecordedData()}))},this.pause=function(){o&&o.pause()},this.resume=function(){o&&o.resume()},this.clearRecordedData=function(){o&&(o.clearRecordedData(),o=null),i&&(i.releaseStreams(),i=null)},this.addStreams=function(r){if(!r)throw"First parameter is required.";r instanceof Array||(r=[r]),e.concat(r),o&&i&&(i.appendStreams(r),t.previewStream&&"function"==typeof t.previewStream&&t.previewStream(i.getMixedStream()))},this.resetVideoStreams=function(e){i&&(!e||e instanceof Array||(e=[e]),i.resetVideoStreams(e))},this.getMixer=function(){return i},this.name="MultiStreamRecorder",this.toString=function(){return this.name}}function U(e,t){var i,o,r;function A(){return new ReadableStream({start:function(o){var r=document.createElement("canvas"),A=document.createElement("video"),s=!0;A.srcObject=e,A.muted=!0,A.height=t.height,A.width=t.width,A.volume=0,A.onplaying=function(){r.width=t.width,r.height=t.height;var e=r.getContext("2d"),n=1e3/t.frameRate,a=setInterval((function(){if(i&&(clearInterval(a),o.close()),s&&(s=!1,t.onVideoProcessStarted&&t.onVideoProcessStarted()),e.drawImage(A,0,0),"closed"!==o._controlledReadableStream.state)try{o.enqueue(e.getImageData(0,0,t.width,t.height))}catch(e){}}),n)},A.play()}})}function s(e,a){if(!t.workerPath&&!a)return i=!1,void fetch("https://unpkg.com/webm-wasm@latest/dist/webm-worker.js").then((function(t){t.arrayBuffer().then((function(t){s(e,t)}))}));if(!t.workerPath&&a instanceof ArrayBuffer){var d=new Blob([a],{type:"text/javascript"});t.workerPath=l.createObjectURL(d)}t.workerPath||console.error("workerPath parameter is missing."),(o=new Worker(t.workerPath)).postMessage(t.webAssemblyPath||"https://unpkg.com/webm-wasm@latest/dist/webm-wasm.wasm"),o.addEventListener("message",(function(e){"READY"===e.data?(o.postMessage({width:t.width,height:t.height,bitrate:t.bitrate||1200,timebaseDen:t.frameRate||30,realtime:t.realtime}),A().pipeTo(new WritableStream({write:function(e){i?console.error("Got image, but recorder is finished!"):o.postMessage(e.data.buffer,[e.data.buffer])}}))):e.data&&(r||n.push(e.data))}))}"undefined"!=typeof ReadableStream&&"undefined"!=typeof WritableStream||console.error("Following polyfill is strongly recommended: https://unpkg.com/@mattiasbuelens/web-streams-polyfill/dist/polyfill.min.js"),(t=t||{}).width=t.width||640,t.height=t.height||480,t.frameRate=t.frameRate||30,t.bitrate=t.bitrate||1200,t.realtime=t.realtime||!0,this.record=function(){n=[],r=!1,this.blob=null,s(e),"function"==typeof t.initCallback&&t.initCallback()},this.pause=function(){r=!0},this.resume=function(){r=!1};var n=[];this.stop=function(e){i=!0;var t=this;!function(e){o?(o.addEventListener("message",(function(t){null===t.data&&(o.terminate(),o=null,e&&e())})),o.postMessage(null)):e&&e()}((function(){t.blob=new Blob(n,{type:"video/webm"}),e(t.blob)}))},this.name="WebAssemblyRecorder",this.toString=function(){return this.name},this.clearRecordedData=function(){n=[],r=!1,this.blob=null},this.blob=null}i.DiskStorage=x,i.GifRecorder=D,i.MultiStreamRecorder=L,i.RecordRTCPromisesHandler=function(e,t){if(!this)throw'Use "new RecordRTCPromisesHandler()"';if(void 0===e)throw'First argument "MediaStream" is required.';var o=this;o.recordRTC=new i(e,t),this.startRecording=function(){return new Promise((function(e,t){try{o.recordRTC.startRecording(),e()}catch(e){t(e)}}))},this.stopRecording=function(){return new Promise((function(e,t){try{o.recordRTC.stopRecording((function(i){o.blob=o.recordRTC.getBlob(),o.blob&&o.blob.size?e(i):t("Empty blob.",o.blob)}))}catch(e){t(e)}}))},this.pauseRecording=function(){return new Promise((function(e,t){try{o.recordRTC.pauseRecording(),e()}catch(e){t(e)}}))},this.resumeRecording=function(){return new Promise((function(e,t){try{o.recordRTC.resumeRecording(),e()}catch(e){t(e)}}))},this.getDataURL=function(e){return new Promise((function(e,t){try{o.recordRTC.getDataURL((function(t){e(t)}))}catch(e){t(e)}}))},this.getBlob=function(){return new Promise((function(e,t){try{e(o.recordRTC.getBlob())}catch(e){t(e)}}))},this.getInternalRecorder=function(){return new Promise((function(e,t){try{e(o.recordRTC.getInternalRecorder())}catch(e){t(e)}}))},this.reset=function(){return new Promise((function(e,t){try{e(o.recordRTC.reset())}catch(e){t(e)}}))},this.destroy=function(){return new Promise((function(e,t){try{e(o.recordRTC.destroy())}catch(e){t(e)}}))},this.getState=function(){return new Promise((function(e,t){try{e(o.recordRTC.getState())}catch(e){t(e)}}))},this.blob=null,this.version="5.6.2"},i.WebAssemblyRecorder=U}));class Fe extends Be{constructor(e){super(),this.player=e,this.fileName="",this.fileType=H,this.isRecording=!1,this.recordingTimestamp=0,this.recordingInterval=null,e.debug.log("Recorder","init")}destroy(){this._reset(),this.player.debug.log("Recorder","destroy")}setFileName(e,t){this.fileName=e,Y!==t&&H!==t||(this.fileType=t)}get recording(){return this.isRecording}get recordTime(){return this.recordingTimestamp}startRecord(){const e=this.player.debug,t={type:"video",mimeType:"video/webm;codecs=h264",onTimeStamp:t=>{e.log("Recorder","record timestamp :"+t)},disableLogs:!this.player._opt.debug};try{const e=this.player.video.$videoElement.captureStream(25);if(this.player.audio&&this.player.audio.mediaStreamAudioDestinationNode&&this.player.audio.mediaStreamAudioDestinationNode.stream&&!this.player.audio.isStateSuspended()&&this.player.audio.hasAudio&&this.player._opt.hasAudio){const t=this.player.audio.mediaStreamAudioDestinationNode.stream;if(t.getAudioTracks().length>0){const i=t.getAudioTracks()[0];i&&i.enabled&&e.addTrack(i)}}this.recorder=Ue(e,t)}catch(t){e.error("Recorder",t),this.emit(T.recordCreateError)}this.recorder&&(this.isRecording=!0,this.player.emit(T.recording,!0),this.recorder.startRecording(),e.log("Recorder","start recording"),this.player.emit(T.recordStart),this.recordingInterval=window.setInterval((()=>{this.recordingTimestamp+=1,this.player.emit(T.recordingTimestamp,this.recordingTimestamp)}),1e3))}stopRecordAndSave(){this.recorder&&this.isRecording&&this.recorder.stopRecording((()=>{this.player.debug.log("Recorder","stop recording"),this.player.emit(T.recordEnd),function(e,t,i){const o=window.URL.createObjectURL(e),r=document.createElement("a");r.href=o,r.download=(t||he())+"."+(i||H),r.click(),setTimeout((()=>{window.URL.revokeObjectURL(o)}),ve()?1e3:0)}(this.recorder.getBlob(),this.fileName,this.fileType),this._reset(),this.player.emit(T.recording,!1)}))}_reset(){this.isRecording=!1,this.recordingTimestamp=0,this.recorder&&(this.recorder.destroy(),this.recorder=null),this.fileName=null,this.recordingInterval&&clearInterval(this.recordingInterval),this.recordingInterval=null}}class Ve{constructor(e){return new(Ve.getLoaderFactory())(e)}static getLoaderFactory(){return Fe}}class Oe{constructor(e){this.player=e,this.decoderWorker=new Worker(e._opt.decoder),this._initDecoderWorker(),e.debug.log("decoderWorker","init")}destroy(){this.decoderWorker.postMessage({cmd:R}),this.decoderWorker.terminate(),this.decoderWorker=null,this.player.debug.log("decoderWorker","destroy")}_initDecoderWorker(){const{debug:e,events:{proxy:t}}=this.player;this.decoderWorker.onmessage=t=>{const i=t.data;switch(i.cmd){case c:e.log("decoderWorker","onmessage:",c),this.player.loaded||this.player.emit(T.load),this.player.emit(T.decoderWorkerInit),this._initWork();break;case g:e.log("decoderWorker","onmessage:",g,i.code),this.player._times.decodeStart||(this.player._times.decodeStart=he()),this.player.video.updateVideoInfo({encTypeCode:i.code});break;case m:e.log("decoderWorker","onmessage:",m,i.code),this.player.audio&&this.player.audio.updateAudioInfo({encTypeCode:i.code});break;case l:e.log("decoderWorker","onmessage:",l,`width:${i.w},height:${i.h}`),this.player.video.updateVideoInfo({width:i.w,height:i.h}),this.player.video.initCanvasViewSize();break;case p:e.log("decoderWorker","onmessage:",p,`channels:${i.channels},sampleRate:${i.sampleRate}`),this.player.audio&&(this.player.audio.updateAudioInfo(i),this.player.audio.initScriptNode(i));break;case u:this.player.handleRender(),this.player.video.render(i),this.player.emit(T.timeUpdate,i.ts),this.player.updateStats({fps:!0,ts:i.ts,buf:i.delay}),this.player._times.videoStart||(this.player._times.videoStart=he(),this.player.handlePlayToRenderTimes());break;case h:this.player.playing&&this.player.audio&&this.player.audio.play(i.buffer,i.ts);break;case f:i.message&&-1!==i.message.indexOf(b)&&(this.player.emit(T.error,x.wasmDecodeError),this.player.emit(x.wasmDecodeError));break;default:this.player[i.cmd]&&this.player[i.cmd](i)}}}_initWork(){const e={debug:this.player._opt.debug,forceNoOffscreen:this.player._opt.forceNoOffscreen,useWCS:this.player._opt.useWCS,videoBuffer:this.player._opt.videoBuffer,openWebglAlignment:this.player._opt.openWebglAlignment};this.decoderWorker.postMessage({cmd:E,opt:JSON.stringify(e),sampleRate:this.player.audio&&this.player.audio.audioContext.sampleRate||0})}decodeVideo(e,t,i){const o={type:v,ts:Math.max(t,0),isIFrame:i};this.decoderWorker.postMessage({cmd:B,buffer:e,options:o},[e.buffer])}decodeAudio(e,t){this.player._opt.useWCS&&!this.player._opt.useOffscreen||this.player._opt.useMSE?this._decodeAudioNoDelay(e,t):this._decodeAudio(e,t)}_decodeAudio(e,t){const i={type:y,ts:Math.max(t,0)};this.decoderWorker.postMessage({cmd:B,buffer:e,options:i},[e.buffer])}_decodeAudioNoDelay(e,t){this.decoderWorker.postMessage({cmd:C,buffer:e,ts:Math.max(t,0)},[e.buffer])}updateWorkConfig(e){this.decoderWorker.postMessage({cmd:k,key:e.key,value:e.value})}}class Me extends Be{constructor(e){super(),this.player=e,this.stopId=null,this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1,this.bufferList=[],this.dropping=!1,this.initInterval()}destroy(){this.stopId&&(clearInterval(this.stopId),this.stopId=null),this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1,this.bufferList=[],this.dropping=!1,this.off()}getDelay(e){return e?(this.firstTimestamp?e&&(this.delay=Date.now()-this.startTimestamp-(e-this.firstTimestamp)):(this.firstTimestamp=e,this.startTimestamp=Date.now(),this.delay=-1),this.delay):-1}resetDelay(){this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1,this.dropping=!1}initInterval(){this.player.debug.log("common dumex","init Interval");let e=()=>{let e;const t=this.player._opt.videoBuffer;if(this.bufferList.length)if(this.dropping){for(e=this.bufferList.shift(),e.type===y&&0===e.payload[1]&&this._doDecoderDecode(e);!e.isIFrame&&this.bufferList.length;)e=this.bufferList.shift(),e.type===y&&0===e.payload[1]&&this._doDecoderDecode(e);e.isIFrame&&(this.dropping=!1,this._doDecoderDecode(e))}else if(e=this.bufferList[0],-1===this.getDelay(e.ts))this.bufferList.shift(),this._doDecoderDecode(e);else if(this.delay>t+1e3)this.resetDelay(),this.dropping=!0;else for(;this.bufferList.length&&(e=this.bufferList[0],this.getDelay(e.ts)>t);)this.bufferList.shift(),this._doDecoderDecode(e)};e(),this.stopId=setInterval(e,10)}_doDecode(e,t,i,o){const r=this.player;let A={ts:i,type:t,isIFrame:!1};r._opt.useWCS&&!r._opt.useOffscreen||r._opt.useMSE?(t===v&&(A.isIFrame=o),this.pushBuffer(e,A)):t===v?r.decoderWorker&&r.decoderWorker.decodeVideo(e,i,o):t===y&&r._opt.hasAudio&&r.decoderWorker&&r.decoderWorker.decodeAudio(e,i)}_doDecoderDecode(e){const t=this.player,{webcodecsDecoder:i,mseDecoder:o}=t;e.type===y?t._opt.hasAudio&&t.decoderWorker&&t.decoderWorker.decodeAudio(e.payload,e.ts):e.type===v&&(t._opt.useWCS&&!t._opt.useOffscreen?i.decodeVideo(e.payload,e.ts,e.isIFrame):t._opt.useMSE&&o.decodeVideo(e.payload,e.ts,e.isIFrame))}pushBuffer(e,t){t.type===y?this.bufferList.push({ts:t.ts,payload:e,type:y}):t.type===v&&this.bufferList.push({ts:t.ts,payload:e,type:v,isIFrame:t.isIFrame})}close(){}}class Qe extends Me{constructor(e){super(e),this.input=this._inputFlv(),this.flvDemux=this.dispatchFlvData(this.input),e.debug.log("FlvDemux","init")}destroy(){super.destroy(),this.input=null,this.flvDemux=null,this.player.debug.log("FlvDemux","destroy")}dispatch(e){this.flvDemux(e)}*_inputFlv(){yield 9;const e=new ArrayBuffer(4),t=new Uint8Array(e),i=new Uint32Array(e),o=this.player;for(;;){t[3]=0;const e=yield 15,r=e[4];t[0]=e[7],t[1]=e[6],t[2]=e[5];const A=i[0];t[0]=e[10],t[1]=e[9],t[2]=e[8];let s=i[0];16777215===s&&(t[3]=e[11],s=i[0]);const n=yield A;switch(r){case w:o._opt.hasAudio&&(o.updateStats({abps:n.byteLength}),n.byteLength>0&&this._doDecode(n,y,s));break;case S:if(o._times.demuxStart||(o._times.demuxStart=he()),o._opt.hasVideo){o.updateStats({vbps:n.byteLength});const e=n[0]>>4==1;n.byteLength>0&&this._doDecode(n,v,s,e)}}}}dispatchFlvData(e){let t=e.next(),i=null;return o=>{let r=new Uint8Array(o);if(i){let e=new Uint8Array(i.length+r.length);e.set(i),e.set(r,i.length),r=e,i=null}for(;r.length>=t.value;){let i=r.slice(t.value);t=e.next(r.slice(0,t.value)),r=i}r.length>0&&(i=r)}}close(){this.input&&this.input.return(null)}}class We extends Me{constructor(e){super(e),e.debug.log("M7sDemux","init")}destroy(){super.destroy(),this.player.debug.log("M7sDemux","destroy")}dispatch(e){const t=this.player,i=new DataView(e),o=i.getUint8(0),r=i.getUint32(1,!1);switch(o){case y:if(t._opt.hasAudio){const i=new Uint8Array(e,5);t.updateStats({abps:i.byteLength}),i.byteLength>0&&this._doDecode(i,o,r)}break;case v:if(t._opt.hasVideo&&(t._times.demuxStart||(t._times.demuxStart=he()),i.byteLength>5)){const A=new Uint8Array(e,5),s=i.getUint8(5)>>4==1;t.updateStats({vbps:A.byteLength}),A.byteLength>0&&this._doDecode(A,o,r,s)}}}}class Ge{constructor(e){return new(Ge.getLoaderFactory(e._opt.demuxType))(e)}static getLoaderFactory(e){return e===a?We:e===n?Qe:void 0}}class Je extends Be{constructor(e){super(),this.player=e,this.hasInit=!1,this.isInitInfo=!1,this.decoder=null,this.initDecoder(),e.debug.log("Webcodecs","init")}destroy(){this.decoder&&(this.decoder.close(),this.decoder=null),this.hasInit=!1,this.isInitInfo=!1,this.off(),this.player.debug.log("Webcodecs","destroy")}initDecoder(){const e=this;this.decoder=new VideoDecoder({output(t){e.handleDecode(t)},error(t){e.handleError(t)}})}handleDecode(e){this.isInitInfo||(this.player.video.updateVideoInfo({width:e.codedWidth,height:e.codedHeight}),this.player.video.initCanvasViewSize(),this.isInitInfo=!0),this.player._times.videoStart||(this.player._times.videoStart=he(),this.player.handlePlayToRenderTimes()),this.player.handleRender(),this.player.video.render({videoFrame:e}),this.player.updateStats({fps:!0,ts:0,buf:this.player.demux.delay}),setTimeout((function(){e.close?e.close():e.destroy()}),100)}handleError(e){this.player.debug.log("Webcodecs","VideoDecoder handleError",e)}decodeVideo(e,t,i){if(this.hasInit){const o=new EncodedVideoChunk({data:e.slice(5),timestamp:t,type:i?K:_});this.decoder.decode(o)}else if(i&&0===e[1]){const t=15&e[0];if(this.player.video.updateVideoInfo({encTypeCode:t}),t===M)return void this.emit(x.webcodecsH265NotSupport);this.player._times.decodeStart||(this.player._times.decodeStart=he());const i=function(e){let t=e.subarray(1,4),i="avc1.";for(let e=0;e<3;e++){let o=t[e].toString(16);o.length<2&&(o="0"+o),i+=o}return{codec:i,description:e}}(e.slice(5));this.decoder.configure(i),this.hasInit=!0}}}const Ne={play:"播放",pause:"暂停",audio:"",mute:"",screenshot:"截图",loading:"加载",fullscreen:"全屏",fullscreenExit:"退出全屏",record:"录制",recordStop:"停止录制"};var Pe=Object.keys(Ne).reduce(((e,t)=>(e[t]=`\n \n ${Ne[t]?`${Ne[t]}`:""}\n`,e)),{}),ze=(e,t)=>{const{events:{proxy:i}}=e,o=document.createElement("object");o.setAttribute("aria-hidden","true"),o.setAttribute("tabindex",-1),o.type="text/html",o.data="about:blank",me(o,{display:"block",position:"absolute",top:"0",left:"0",height:"100%",width:"100%",overflow:"hidden",pointerEvents:"none",zIndex:"-1"});let r=e.width,A=e.height;i(o,"load",(()=>{i(o.contentDocument.defaultView,"resize",(()=>{e.width===r&&e.height===A||(r=e.width,A=e.height,e.emit(T.resize))}))})),e.$container.appendChild(o),e.on(T.destroy,(()=>{e.$container.removeChild(o)})),e.on(T.volumechange,(()=>{!function(e){if(0===e)me(t.$volumeOn,"display","none"),me(t.$volumeOff,"display","flex"),me(t.$volumeHandle,"top","48px");else if(t.$volumeHandle&&t.$volumePanel){const i=ge(t.$volumePanel,"height")||60,o=ge(t.$volumeHandle,"height"),r=i-(i-o)*e-o;me(t.$volumeHandle,"top",`${r}px`),me(t.$volumeOn,"display","flex"),me(t.$volumeOff,"display","none")}t.$volumePanelText&&(t.$volumePanelText.innerHTML=parseInt(100*e))}(e.volume)})),e.on(T.loading,(e=>{me(t.$loading,"display",e?"flex":"none"),me(t.$poster,"display","none"),e&&me(t.$playBig,"display","none")}));const s=i=>{let o=!0===(r=i)||!1===r?i:e.fullscreen;var r;me(t.$fullscreenExit,"display",o?"flex":"none"),me(t.$fullscreen,"display",o?"none":"flex")};try{de.on("change",s),e.events.destroys.push((()=>{de.off("change",s)}))}catch(e){}e.on(T.webFullscreen,(e=>{s(e)})),e.on(T.recording,(()=>{me(t.$record,"display",e.recording?"none":"flex"),me(t.$recordStop,"display",e.recording?"flex":"none")})),e.on(T.recordingTimestamp,(e=>{})),e.on(T.playing,(e=>{me(t.$play,"display",e?"none":"flex"),me(t.$playBig,"display",e?"none":"block"),me(t.$pause,"display",e?"flex":"none"),me(t.$screenshot,"display",e?"flex":"none"),me(t.$record,"display",e?"flex":"none"),me(t.$fullscreen,"display",e?"flex":"none"),e||t.$speed&&(t.$speed.innerHTML=we(""))})),e.on(T.kBps,(e=>{const i=we(e);t.$speed&&(t.$speed.innerHTML=i)}))};function Ye(e,t){void 0===t&&(t={});var i=t.insertAt;if(e&&"undefined"!=typeof document){var o=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===i&&o.firstChild?o.insertBefore(r,o.firstChild):o.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}Ye('@keyframes rotation{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}.jessibuca-container .jessibuca-icon{cursor:pointer;width:16px;height:16px}.jessibuca-container .jessibuca-poster{position:absolute;z-index:10;left:0;top:0;right:0;bottom:0;height:100%;width:100%;background-position:50%;background-repeat:no-repeat;background-size:contain;pointer-events:none}.jessibuca-container .jessibuca-play-big{position:absolute;display:none;height:100%;width:100%;background:rgba(0,0,0,.4)}.jessibuca-container .jessibuca-play-big:after{cursor:pointer;content:"";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:block;width:48px;height:48px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACgklEQVRoQ+3ZPYsTQRjA8eeZZCFlWttAwCIkZOaZJt8hlvkeHrlccuAFT6wEG0FQOeQQLCIWih6chQgKgkkKIyqKCVYip54IWmiQkTmyYhFvd3Zn3yDb7szu/7cv7GaDkPEFM94PK0DSZ9DzDAyHw7uI2HRDlVJX5/N5r9FoHCYdr/fvCRiNRmpJ6AEidoUQ15NG+AH8BgD2n9AHANAmohdJQfwAfgGA4xF4bjabnW21Whob62ILoKNfAsAGEd2PU2ATcNSNiDf0/cE5/xAHxDpgEf0NADaJ6HLUiKgAbvcjpdSGlPJZVJCoAUfdSqkLxWLxTLlc/mkbEgtgET1TSnWklLdtIuIEuN23crlcp16vv7cBSQKgu38AwBYRXQyLSArg3hsjRDxNRE+CQhIF/BN9qVAobFYqle+mkLQAdLd+8K0T0U0TRJoAbvc9fVkJId75gaQRoLv1C2STiPTb7rFLWgE6+g0RncwyYEJEtawCvjDGmpzzp5kD6NfxfD7frtVqB17xen2a7oG3ALBm+oMoFQBEPD+dTvtBfpImDXjIGFvjnD/3c7ksG5MU4HDxWeZa0HB3XhKAXcdxOn5vUi9gnIDXSqm2lHLPK8pkfVyAbSLqm4T5HRs1YB8RO0KIid8g03FRAT4rpbpSyh3TINPxUQB2GGM9zvkn05gg420CJovLZT9ISNA5tgB9ItoOGhFmnh/AcZ/X9xhj65zzV2Eiwsz1A1j2B8dHAOgS0W6YnduY6wkYj8d3lFKn/j66Ea84jtOrVqtfbQSE3YYnYDAY5Eql0hYAnNDv6kKIx2F3anO+J8DmzqLY1goQxVE12ebqDJgcrSjGrs5AFEfVZJt/AF0m+jHzUTtnAAAAAElFTkSuQmCC");background-repeat:no-repeat;background-position:50%}.jessibuca-container .jessibuca-play-big:hover:after{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACEElEQVRoQ+2ZXStEQRjH/3/yIXwDdz7J+i7kvdisXCk3SiFJW27kglBcSFFKbqwQSa4krykuKB09Naf2Yndn5jgzc06d53Znd36/mWfeniVyHsw5PwqB0DOonYEoijYBlOpAFwCMkHwLDS/9mwhEDUCfAAyTXA4tYSLwC6CtCegegH6S56FETAR+AHRoACcBTJAUWa+RloBAXwAYIrnt0yBNgZi7qtbHgw8RFwLC/QFglOScawlXAjH3gUqrE1cirgVi7mkAYyS/0xbxJSDcdwAGSa6nKeFTIOZeUyL3aYiEEBDuLwDjJGf+KxFKIOY+BdBL8iipSGiBmHtWbbuftiJZERBuOfgGSK7aSGRJIObeUml1ayKSRQHhlgtkiaTcdltGVgUE+ppkV54FaiS78yrwqlLoOI8Cch2XV548W7WRpTVwA6DP9kGUFYEpAOUkT9LQAvtq1M+0udKkQSgBqSlJWWYxKXj8vRACK+o6bbRIdYI+Ba7U7rKjg7L53JdAhWTZBsy0rWuBXZUuNVMg23auBF7UIl2yBbJt70JAoKV6/WwLk6R9mgKSJlJ1kLTxFmkJyCla8UZd15GJQKvyumyJ8gy8DAEvfZoINPqD41EtUjmUgoaJwAaAnjrKebVI34OSq85NBNqlCAWgE0CV5GEWwI3vQlmCbcSinYFCwPEIFDPgeIC1P1/MgHaIHDf4Aydx2TF7wnKeAAAAAElFTkSuQmCC")}.jessibuca-container .jessibuca-loading{display:none;flex-direction:column;justify-content:center;align-items:center;position:absolute;z-index:20;left:0;top:0;right:0;bottom:0;width:100%;height:100%;pointer-events:none}.jessibuca-container .jessibuca-loading-text{line-height:20px;font-size:13px;color:#fff;margin-top:10px}.jessibuca-container .jessibuca-controls{background-color:#161616;box-sizing:border-box;display:flex;flex-direction:column;justify-content:flex-end;position:absolute;z-index:40;left:0;right:0;bottom:0;height:38px;padding-left:13px;padding-right:13px;font-size:14px;color:#fff;opacity:0;visibility:hidden;transition:all .2s ease-in-out;-webkit-user-select:none;user-select:none;transition:width .5s ease-in}.jessibuca-container .jessibuca-controls .jessibuca-controls-item{position:relative;display:flex;justify-content:center;padding:0 8px}.jessibuca-container .jessibuca-controls .jessibuca-controls-item:hover .icon-title-tips{visibility:visible;opacity:1}.jessibuca-container .jessibuca-controls .jessibuca-fullscreen,.jessibuca-container .jessibuca-controls .jessibuca-fullscreen-exit,.jessibuca-container .jessibuca-controls .jessibuca-icon-audio,.jessibuca-container .jessibuca-controls .jessibuca-microphone-close,.jessibuca-container .jessibuca-controls .jessibuca-pause,.jessibuca-container .jessibuca-controls .jessibuca-play,.jessibuca-container .jessibuca-controls .jessibuca-record,.jessibuca-container .jessibuca-controls .jessibuca-record-stop,.jessibuca-container .jessibuca-controls .jessibuca-screenshot{display:none}.jessibuca-container .jessibuca-controls .jessibuca-icon-audio,.jessibuca-container .jessibuca-controls .jessibuca-icon-mute{z-index:1}.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom{display:flex;justify-content:space-between;height:100%}.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom .jessibuca-controls-left,.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom .jessibuca-controls-right{display:flex;align-items:center}.jessibuca-container.jessibuca-controls-show .jessibuca-controls{opacity:1;visibility:visible}.jessibuca-container.jessibuca-controls-show-auto-hide .jessibuca-controls{opacity:.8;visibility:visible;display:none}.jessibuca-container.jessibuca-hide-cursor *{cursor:none!important}.jessibuca-container .jessibuca-icon-loading{width:50px;height:50px;background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%;animation:rotation 1s linear infinite}.jessibuca-container .jessibuca-icon-screenshot{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAE5UlEQVRoQ+1YW2sdVRT+1s7JxbsoVkEUrIIX0ouz15zYNA+N1RdtQfCltlUfvLbqL/BCwZ8grbHtizQqPojgBSr0JkiMmT2nxgapqBURtPVCq7HxJCeZJVPmxDlzZubMmXOSEsnAvOy917fXt9e39tp7E5b4R0vcfywTuNgRbBgBx3HuJqLVzPzmYjprjHkcwAlmLqXNm4XAISLaSESPaq2HF4OE67rbRGRYRA7btn1fbgLGmKsA/Azg0gBkGzO/vZAkHMd5hIiqc5wHcCMz/5k0Z2oExsfHV1QqldPAf8lORNu11m8tBAljzFYAYWxRSl1vWdZvuQj4RsYYF4AVBlgIOVVlE55HRIxt23ZuCfmGjuOsJ6LPoiAistW27XfaEYmIbOYhPc9bXywWR1oiEJDYQkR1zrYjEjGyqfqbKd8a7kJVtLgQ+30i8pht2wfyRKIdmJkJBPkQTbILfudJ7CTZNBvVpggEcgpvc/ML38zESbLJsxBNE/A9biX0rdjGyTQXgbxyapdsarb0PMlXtWnGoXbKpm0Essqp3bJpK4E0OXmed3+hUBDP8w5FI91M0rdcyLLILElOCbaZilSWeXMncRx4klTCY1spfG3dhZJWx3GcDUR0EEB3ZMw0ET2gtT6SZWWzjmlrBIJCl0hAKfWgZVmHszqXZVxbCSxpCS2JJA6umIhe8ZKKVLPbaBJ+S9toqVRa53nedgAbAKwIwH4FcAzAa0R0l4i8F7PPz189k6RFRA+LyNcAXojDV0oNW5b1eW4Cxpg9AHZkSaaa6hhzb065uDSCH2LmRB8Sk9gY4293g43Qo/1pV80m8yQMfZSZ781cB1zXHRKRZ2IMpgD8A+DamL4ZItqitX4/jbQx5iEA7wLoihn3V/ACckWMJN/QWj9b1x5tGBsbW6uUOh5pPy0iL3Z2dn6ilJqanp5ep5TaJSLhF4NppdRNaU8gPmapVLrO87yfIoXuWyJ6uVKp+HmFjo6OQSJ6FcBtYT+UUmstyxqvkWuUgDFmP4AnQu2/e563qlgs+u9DNZ8xZhRAX7VRRPbath0XuXk7Y8xeAE+FgL6fnJzsHRwcLIfBR0ZGLunq6poAsDLUvp+Zw7b1r9PGmJMAbg8Z7WDmoThZuK67WkS+DD18fcPMdzSQUBR/EzN/nIC/SUQ+DPXV4dclsTHmHAD/SfHCNzc3t7Kvr++HJKeMMacA3BL0nyuXyzcPDAxMxo0fHR29slAo/Ajg6qD/fE9Pzw29vb1/x42fmJi4vFwu+5G/LOg/y8zXNJLQ2dAES5JANMQ7mfn1jBI6ycx3NiMhItqstf4oAX+ziHwQ6qvDj5NQNIn/ALCKmX+JSeIvABRD7fuY+ekGBPYBeDI05tTMzExvf3+/vz2Hk91/ET8RSeI6/DoCpVJpjed5fmKGvzMAXpqdnT3oed5Ud3d3v4jsAqBr9Ei0Rmv9VRqBBPzvROQVETnq2xJRdRu9tRF+bCVOKWT+Kvl/TSIFk6SW/LAjKfjV5K8rZABi8dOOEv7FI7Z8x6zwEWbemLbyMfJr5qiSiJ96oclymBOR3bZtP9+M89WxxpjdAHY2sN3DzM8ljWl4I3Nd9x7/OE1ENcdpETnmH3e11n41zv0l4J8RkU+J6AAz+xtF4teQQG7PFslwmcAiLfSyhC72Qv9/I/Avns2OT7QJskoAAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-screenshot:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAED0lEQVRoQ+2ZycsdRRTFf2ejqHFAMQqiYBTUoElUHLNx3GgCgpuYRF2o0UT9CxwQ/BMkMSbZSKLiQgQHUDCJgjiAxiEiESdEcJbEedgcKaj3UV+/6q7u/jovPPkK3qbr1ql76p5bt6qemPKmKfefeQKHOoLFCNg+H1gi6fFJOmv7VmCvpD1N87Yh8ApwNXCzpB2TIGF7DRDm2inpmt4EbB8LfAMcGUHWSHryYJKwfRMwmuMP4BRJv9TN2RgB2wuB72BWsq+V9MTBIGF7NZBiGzhJ0o+9CIRBtt8FLqgADC6nRDbpVO9Iuqi3hCKB5cDrGZDVkp4aIhIV2aSQyyW9MScCkcQqIOfsnCORkc3I31b5VtyFRmg1IQ7dt0ja3icSQ2C2JhAjUU2ykd+dE7tBNp2i2olAJJFuc+nCt564QTadF6IzgUhiVGiqyinKaQjZpJP2ItBXTkPJZhACXeU0pGwGI9BWTkPLZlACBTldG4o5EA6E1dY66edcyNrs8Q36zg1vVaTazNs7iXPgDVJJzYs7VRvHRzaDEohyugJ4CTi84sg/wHWSdnVxsGQ7aQLXS9pZcqpL/6AEplpCU5HE8YpJ9YrXUKQ6baN1+HPaRm1fBqwFQnKGK2ZoPwCvAo8Ai4FnMpPMHMwapHUj8DFwbw3+Dklv9iZgexOwvktSRduxU2VDlErwmyXV+lCbxLbDdndlCT3TX3vV7JgnKfRuSVflfMkSsL0ZuDMz4E/gL+CETN+/wCpJzzaRtn0D8DRwWMbu1/gCcnSm7zFJd1W/jxGwvQx4r2IYnlbuA14GAomQFw8B6YtBKFSnNj2BxEJ3IvB1pdB9CjwQ8yqYhcg/DJxZ8WOZpA/SbzkC24DbEqOfgPMkBRKzmu23gEuSj1sk5SI3Y2J7C3BHMuZz4FxJf6fgto8APgIWJd+3SUrHjr9O294HnJUMWi8pSGqs2V4CvJ88fH0i6eyChKr4KyS9WIO/Ang+6RvDz0XgABCeFEdtkaQv65yy/QVweuwPY0+T9FuNQ8cAXwHHxf7wdHiypN9r7BfEl8GjYv9+SceXJLQ/mSDYTh2Baog3SHq0pYT2STqno4RWSnqhBn8l8FzSN4bfJol/jkn8bXUS228DFyfft0paVyCwFbg9sQkSDEkctueZZju8iO+tJPEYfo7A0piYKd73wP3xnB+20cvjNnphxdmlkj4sEMjhfwY8COyOY0fb6Bkl/K6FLKxS+M1KpDhJY8mvrG5doRwlf66QZfGbjhLh4pEt35kV3iUp/IvTunU8qtTil/7gaHOY2yjpntaez9b5RmBDYewmSXfX2RRvZLYvbThOh+NuqMa9Ww1+yLnXgO2SwkZR24oEens2oYHzBCa00PMSOtQL/f+NwH+Hg8hAnbrYgQAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-play{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACgklEQVRoQ+3ZPYsTQRjA8eeZZCFlWttAwCIkZOaZJt8hlvkeHrlccuAFT6wEG0FQOeQQLCIWih6chQgKgkkKIyqKCVYip54IWmiQkTmyYhFvd3Zn3yDb7szu/7cv7GaDkPEFM94PK0DSZ9DzDAyHw7uI2HRDlVJX5/N5r9FoHCYdr/fvCRiNRmpJ6AEidoUQ15NG+AH8BgD2n9AHANAmohdJQfwAfgGA4xF4bjabnW21Whob62ILoKNfAsAGEd2PU2ATcNSNiDf0/cE5/xAHxDpgEf0NADaJ6HLUiKgAbvcjpdSGlPJZVJCoAUfdSqkLxWLxTLlc/mkbEgtgET1TSnWklLdtIuIEuN23crlcp16vv7cBSQKgu38AwBYRXQyLSArg3hsjRDxNRE+CQhIF/BN9qVAobFYqle+mkLQAdLd+8K0T0U0TRJoAbvc9fVkJId75gaQRoLv1C2STiPTb7rFLWgE6+g0RncwyYEJEtawCvjDGmpzzp5kD6NfxfD7frtVqB17xen2a7oG3ALBm+oMoFQBEPD+dTvtBfpImDXjIGFvjnD/3c7ksG5MU4HDxWeZa0HB3XhKAXcdxOn5vUi9gnIDXSqm2lHLPK8pkfVyAbSLqm4T5HRs1YB8RO0KIid8g03FRAT4rpbpSyh3TINPxUQB2GGM9zvkn05gg420CJovLZT9ISNA5tgB9ItoOGhFmnh/AcZ/X9xhj65zzV2Eiwsz1A1j2B8dHAOgS0W6YnduY6wkYj8d3lFKn/j66Ea84jtOrVqtfbQSE3YYnYDAY5Eql0hYAnNDv6kKIx2F3anO+J8DmzqLY1goQxVE12ebqDJgcrSjGrs5AFEfVZJt/AF0m+jHzUTtnAAAAAElFTkSuQmCC") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-play:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACEElEQVRoQ+2ZXStEQRjH/3/yIXwDdz7J+i7kvdisXCk3SiFJW27kglBcSFFKbqwQSa4krykuKB09Naf2Yndn5jgzc06d53Znd36/mWfeniVyHsw5PwqB0DOonYEoijYBlOpAFwCMkHwLDS/9mwhEDUCfAAyTXA4tYSLwC6CtCegegH6S56FETAR+AHRoACcBTJAUWa+RloBAXwAYIrnt0yBNgZi7qtbHgw8RFwLC/QFglOScawlXAjH3gUqrE1cirgVi7mkAYyS/0xbxJSDcdwAGSa6nKeFTIOZeUyL3aYiEEBDuLwDjJGf+KxFKIOY+BdBL8iipSGiBmHtWbbuftiJZERBuOfgGSK7aSGRJIObeUml1ayKSRQHhlgtkiaTcdltGVgUE+ppkV54FaiS78yrwqlLoOI8Cch2XV548W7WRpTVwA6DP9kGUFYEpAOUkT9LQAvtq1M+0udKkQSgBqSlJWWYxKXj8vRACK+o6bbRIdYI+Ba7U7rKjg7L53JdAhWTZBsy0rWuBXZUuNVMg23auBF7UIl2yBbJt70JAoKV6/WwLk6R9mgKSJlJ1kLTxFmkJyCla8UZd15GJQKvyumyJ8gy8DAEvfZoINPqD41EtUjmUgoaJwAaAnjrKebVI34OSq85NBNqlCAWgE0CV5GEWwI3vQlmCbcSinYFCwPEIFDPgeIC1P1/MgHaIHDf4Aydx2TF7wnKeAAAAAElFTkSuQmCC") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-pause{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABA0lEQVRoQ+1YwQqCUBAcfWXXsLr2AXWTPXno8yVB8AP6Aa3oHI+kCDqYaawJljSe133uzO44bx0M/HEG/v1gAd9mkAyQgY4I/F8LJUlyrQFtD2AtIkcNoFEU+Z7n7QD4DfFHEVlocrVmgAUAIAOl3mILPcDgEFcUhyrUKMGUUcroc3NQRimj9XJBGaWMvvPydKN0o6/9QTdKN6rZANxj6EbpRulGuZnjYqs8BbyR8Ub2Izeys+u6yyAIDpo/ehzHM2NMDsA0xFsRmWhyfTIDWSXxCEBmrd2EYXjSHJqm6bQoii2AOYBL5Z0xgFxEVppcrQvQJO0zhgX0iXbdWWSADHRE4AZQ731AhEUeNwAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-pause:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAA7klEQVRoQ+2YSwrCQBBEX6HiVvxsPYDewfN7By/gD9ciQkvERQwJdBSiYs0mEDo96aruombEjy/9+P/jAj7NoBkwA28i8H8tFBFRA9oeWEo6ZgCNiDGwAYpn3TpKmmVytWbABQBmoNRbbqEHGB7iiuJYhRol2DJqGX1uDsuoZdRmLuNZSzGWUcuoZdRHSp/IylNgK2ErYSthK3FHwLcSvpXIjoLt9Jfa6TMwl3TIMBkRE2AH9BriL5KGmVyvWIltJXEfKN6tJJ0ym0bECFgDU+Ba+WZQFCdpkcnVuoBM0i5jXECXaNftZQbMwJsI3AAPN3dAQflHegAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-record{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC+UlEQVRoQ+1ZS2sTURT+zlDJYE3XSq219QHVuEjnJDT+Bff9Abqw2voAEfGxqygUqWhVFHGl/yMLu9BwByxk5SNI66ML6U7axjhHbmhgWiftncxoOiV3FcI53z3f/e65594zhIQPSnj86BBot4IdBToKRFyBnbeFlFIScVEiuYvIWC6Xe2YK8pcC7SYA4CMzH4mDQBXAqilQBDsLQLfPf9FxnF4i8kwwmypARI+Wl5dvmIBEsUmlUkNE9NaHsVCpVAZGR0d/m+A2JSAid3K53E0TkCg2pVKpz7KseR/GfKVSGYxMAMA0M1+JEpyJb6lUOm5ZVnkrAsVisaunp+esiByr1Wp3R0ZGvmifzZK4XQQWHMc52MgBpdQuAOcAXABwuB400ZTjONdaIjA7O5u2bVsnWU1EujzP+5nP5xdMVjvIJkCBD8x8VCm1G8AYgAkAAxt8Z5j5YmgCSqlTAJ4D2OcD/AXgATNfbYVEAIFPIvKKiE4D6GuCea8xX6gtpJT6DmBvECgRFRzHeROWRAABE4iWCbwHEFhkPM/L5vP5dyaz+23+KwHXdR3P854S0YG1ILSCuthNMfNM2OC1/RYENLY+ygcBnPfht6ZAA6BYLNr6dyqVokKhsGpaNQ2TWJstreXaE2aed133sojcj41AKyvdzCdAgSXLsk4MDw9/a/i4rntbRPxFNZoC/5jAV2be759DKTUJ4FZSFFi0bbs/k8noy2R9dAjEuWU2YgXkQOK3kD6BMsysi2Z9JC2Jdcw/ALzwPO+xvmcl7Rj177JVEbkO4BARjSflFDJJuW1dBxJPoCIiL4noDIB1BS0pW6j+oJmbm+uuVqvjRKQfLr0bZHnIzJf0f6HeAybahrUJqAPruhLlcnnPysqKfpXp11n/Gv62zoHAroS+AafT6QkiGrIsazKbzX7eVIHEt1US39gCkOzWYthkjNE+tuZujDGZQ8XRXn8N4KT5lLFZ6uaYPt+nwyDuvC80YdhvB9uOAu1WoaNAR4GIK/AHvdr+QAexB7EAAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-record:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACfUlEQVRoQ+2ZSYsUQRCFvycK4nJXXEbHBdwO4kn/gv9CD467ICIutxEFkREdFUU86T/xojcPntyQcT2INw+uISFVkD1Wd2dWlU7nUHlqisiX+fJFZGREi8yHMt8/HYG5VrBToFOg4QnMPxcyM2t4KE2nT0i6EwvylwIjQOCFpE1tEPgGfI0FamC3AFgazP8IrJL0KwZzkAI3gLMxIA1ttgCPA4w3wHpJP2NwBxG4KOlcDEgTGzNbA8wEGP57vA0CU5JONtlczFwz2wY8HUbAzBYCB4CtwCVJb33OIAXmioC70LoyBsxsEXAQOApsLIhelnS6FgEzW+5BBvwA/FS+SPJFa40KBZ5L2mxmS4AJ4IjHxCzwaUnHkgmY2V7gLrAyAPwOXJN0qg6DCgIvgQfAPsDjo2pcKddLciEz+wCs6AO6W9KjVBIVBGIgahN4BvRLMjslPYlZPbT53wR2AbeBtcUmXEFPdh5U06mbd/shBBzbr/Jx4FCAX0+BEsDMFocEYrNmFcE+BD4XsXZL0oyZnQCutkagzkn3m1NBwDe/Q9L74MAuFEqUn5op8I8JvJO0elacTALnc1HAH3Njkvwx+WeYWUegTa/pwaqIgexdyIN4uyRPmqULZRXEvulPwD3gpr+zcrtGQxfzRHYG2AAczuUWiom3kc4D2RN4BdwH9gM9CS0XFyoLGu9UuN974eIFVDiuSzruH5LqgRhtU20q8kBPV8LMlhVVmVdnYwX+SMdAZVeieAF7eeltmElJr4cpkH1bJfvGVvatxdR4bMu+teZuWxtKxWncXn8I7EldtQV7vz79fp9KwZp//9CksB8F206BuVahU6BToOEJ/Ab7+KdABdTt8AAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-recordStop{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-recordStop:hover{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreen{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreen:hover{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreenExit{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAADd0lEQVRoQ+2Zz2sdVRTHv+fJBDW6anDVXen6wZszYxYBiYgtFGst3VSDunKjpS0GpUlqfjVpsVVs6aaL0or4YxMVFCJZ2ZLdPUP+gq5bQnTxtNAkfTnlhnnlkmQy9yV9780rudt77tzv5/y4v4bQ4Y06XD/2ANodwec/AiJygJnvtdvTWfPnRkBEJAiCN8rl8kMfiPn5+Ve7u7v3rays0Orq6lJfX99/PuN2auMDoAD+BvA2M6/mTWSMOUtE48D6AjHGzN/kjdlNvy+AnWOOmQ/lTSYiEwDOWzsimgrDcCRvzG76GwGw8/zJzO9sN6GInAMwbW1UdSSKoqndCMwb6wNwGsB39Q+p6h/M/C4R2dTa1AoHYBWKyCkA1+pqiWi2Wq0e7e/vf7yRoJAAKcQggMtuJKIoOtoxACnE0/xOi/SXMAxPuhCFjUBdpIjYVWXSEf0TM3/g9BeriDMKdSPEz8z8vrU1xgwT0YXCrEJZy1iSJKOqOub0/8jMA0mSfKKqNwoPkHp7ioiGHIhRIvpHVa93BEBa2JcAfOlALAHo6RgAKzRJkk9V1S6xL7kpV4idOM31taxaIKJHqmpPnMMA9hcOQES2PDJkAT1XAAC+ZebPfWB3auNzmLObVsNRUNUXVHUujuM7OxXnMy4XwOcj29mIyOuq+lapVGrYCelKpkEQ3CyXy4tbzdN0AGPMxr2iYZ+sra3FcRybtgCIiK2BKw2rdgaUSqWoUqlIkQAepFDdAF7cBq5ERI9rtdr1OI7tmE2t6SmUEYFHAEaexYW/1QC2EF+ru5GIvg7D0D2GNJxprQY4o6qv1I/b6SpzOYqiLxpWng5oOQAzXxWRWwA+dkRfYOb1p5hGW6sBJpn5KytSRG4D+KguWFXHoyhy7xdeLC0F2ChSRL4H8OFuINoKYIUbY34gogHH3eeZef1K6tPaDpCm068A3nMEDzHzxY4BUNWSiPxORO6z5aDPPlGICNQ9bYyZIaLjjudzIQoFkKbTbwCO+UI0HcB9J/LdeY0xs0R02IGYYObRrWqiFQCfEZEtSHsfmGZm+4qxbbM/hQD8BeBNa0hEM2EYnmgLgP3lFARBT1dXly4vL//b29tbzQNIU+llAHeJaLFSqRzJes5vegR8xGbZLCwsHKzVav8z8/0sm0ID+MDvAfh4qZk2exFopnd9vv0ELrXBQO7fD10AAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreenExit:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC/ElEQVRoQ+2Zy49NQRCHvx+ReK6IlZ34E7CUiCAR4xEbTLCyQRATYswwb2IQZDYWgojHZpCQECts+ResiQwLj0RClNSkb9Lu3HtPz7mZc8+V6eXt6tP1VVV3VdcVbT7U5vozC9BqD/7/HjCzlZLet9rS9fbP9ICZvQPWSfqRAmFmS4ClMHm+JiR9S1mXVyYFwIBXwEZJv7I2MrPjQH8A6JN0OWtNM/OpAL7HS0mbsjYzswGgN8gNS+rJWtPM/HQAfJ9nkrY22tDMTgMjQaZH0nAzCmatTQE4ClyNPvQU2CbJQ2vKKB2Aa2hmR4DrkbbPgQ5Jv6sJSgkQILqA0dgTkjraBiBAxPHtPz2UtDuGKK0HKkqamd8qg5HS9yXtjebLdYjrHNRqiAeS9gQvnQGGSnML1bvGzOwc0BfN35PUaWYHgRulBwjW9ju+O4JwqM/AWFsABIgLwKkIYgJY1jYAAeJQuGIXVIVcKTKxh8WfBin9J+AVpx/eFWUEqFkyNACKp0rhgWYArkg6kQibSyylmPOklQdibijBX+fSLHFRJkDid+qKmdlaYENOI0zeEcBNSZ9qbVIEQHWuyGOTNZLetgrAz8ClPFpHa1ZL8rf5lFGEB2oBfAxQi4D5DeDmAP7mGJPka0oD4LnDr9imH/xFe8AP4vLIjBclxWXItCOtaIBjwOKo3HaFRyWdnLbmYUHhAJKumdkt4ECk9JCkSitmWixFAwxKOjt5uZvdBvZH2vZLit8XSSBFA/yjpJndAfY1A9FSgOCJu0BnBNErqfIkzfRCywECxCNgR6Rtt6TzmdqHBmyKXG4ZM4sTWc04NzNPWE+AuG3ZlZInSuGBinXMbBzYGVkrE6JUACGcHgPbUyGKAIj7REmZ18y897o5ghiQ5E/bltRChwE/kF7Xj0jyLkbDYWbzgBfA+iA4LmlXqwD8LydvszjAF0lfswBCKC0E3gBeP22p186f8RBKUbaejJmtAr5L+lBPptQAKfCzAClWmkmZWQ/MpHVTvv0X9iFAQGQyevIAAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-audio{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACrUlEQVRoQ+2ZPYgTURCAZzbBXJnCeL2Cnb87b9MEtPBUrrMQFAtrtT5/ClGs9LBWWz0RtbBUFCF4oJDsbO68wsLA2YqQSmLlvpEHu7IuMdlLcus+yUKKhJfZ+ebnvZl5CJY/aLn+MAP41x7M1QPMfFtr/crzvHfTAs8FoNPp1LTWzwHgqIg0lFLvrQHwfX8BER8DwC6jNCIecF13wwoA3/dvIuKNpLJa60Oe560XGoCZd4rICiKeTCtaeABmPg4AJmRqg6xcaABmvg4At4aFRyEBhoVM4UMoCplHADCfJTEL5YEsIVNID5iQAYCHALCYxeq5b6PMfF5EBAAEESthGK7W6/XPRpFWq7W3VCqtZg2ZcT3g+/6i4zjzIlLSWn/yPO/DIGMNLCWY2Sj/+xGRK0qpZfNDEASnROTFVi0fr8+aA8z8Ld6KEfGt67oLYwMAwEUium8EREn7OgeAjwCwPyo/nrque3YSgAtE9GDaAM1mc65arc4Zuf1+P2w0Gt9jJZl5DQAORt+fENG5wgEw8zUAMB/zbBBRwyqAIAjuiMjlSOlNItpjFUCqWl0josMzgChR/9hGAWBbknjmAdPhDdqa0gfZzAMJKyVP4v8hhJYRcSni+0JEu63ahZj5anyQici6UuqIVQDdbrfS6/UqRulyufyTiH5sF8AlIro37VpoWEHIzGZ2tM+sEZFnSqkzk9RCS0R01wjIsZz+mug53hDRia0AnI4bGgDYISItz/M2jYC8Gpp2u30MEWuO4zha665Sqp0ZYFStX/iWchRAItFGzoHSsrJ2ZFl1mHg6bfVYJeGJv85CC++BpIJZ5kSFC6G0ha0e7mYJqcJ7IOkRay84UhD2XjHFIFZf8iW9YcYoYRi+tO6aNeupOs66iU/icV46zf/MAKZpzXFk/QL+JG1PUPhRiQAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-audio:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACSElEQVRoQ+2Zu4sUQRCHf5+C+gf4yBXMfMYHGvjCzEBQDIzV+HwEohipGKupD0QNDE8UEwUFTe68wEDhTMVUMFJ+0tArzbjs9u3Ojt0wBR0M9MzUV1XdXVWNKhcq1189wP/2YKcesH1d0nPgdVvgnQDY3iTpqaT9kuaAt9UA2D4o6aGkzVHpXcByFQC2r0q60lB2D7BUNIDtjZIeSDoyRNGyAWwfiiET4n6YlAtg+7Kka2PCozyAMSHT5CkLIIbMfUlbMhdmOQCZIVOeB2LI3JN0NNPq6bTZe8D2aUmOY72kN8DnoIXt7eF5FSEzkQdsB+OEsFwr6RPwbpixhqYStoPyqVwAbkaAY5KeTWD5wStZHrD9XdJgK34FhBP9H8kFOAvciQBhn3/RAcBHSTvjfx4DJ6cBOAPcbRvA9gZJYQT5DfwYKGl7UdLu+PwIOFUiwCVJYQRZBuZqA7gh6XxUegXYVhtAmq0uAnt7gLhQm9vorBZx74Hcc6D3QLKH/z2JGyVnlYs4pCfzEe4rsLW2XehicpAtAftqAwiZbhhBfgE/ZwVwDrjddi40KiG0HXpHO+KcJ8CJaXKheeBWBOgqnf6W1BwvgcOrATieFDTrJL0HViJAVwXNgVgPrJH0BfiQDTDKtREiNK7KLSnHASQLLacP1PxcVkWWq8PU3emq2yqJJ0b1Qsv2QKpdZp+orBBqmrfq5m5mSJXtgUZI1XnB0YCo94opCal6L/ka3ghtlIXqrllzT9VJ5k19Ek/y0zbf6QHatOYk3/oDujC8QMWgjf4AAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-mute{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-mute:hover{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-text{font-size:14px;width:30px}.jessibuca-container .jessibuca-speed{font-size:14px;color:#fff}.jessibuca-container .jessibuca-quality-menu-list{position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%);transition:visibility .3s,opacity .3s;background-color:rgba(0,0,0,.5);border-radius:4px}.jessibuca-container .jessibuca-quality-menu-list.jessibuca-quality-menu-shown{visibility:visible;opacity:1}.jessibuca-container .icon-title-tips{pointer-events:none;position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%);transition:visibility .3s ease 0s,opacity .3s ease 0s;background-color:rgba(0,0,0,.5);border-radius:4px}.jessibuca-container .icon-title{display:inline-block;padding:5px 10px;font-size:12px;white-space:nowrap;color:#fff}.jessibuca-container .jessibuca-quality-menu{padding:8px 0}.jessibuca-container .jessibuca-quality-menu-item{display:block;height:25px;margin:0;padding:0 10px;cursor:pointer;font-size:14px;text-align:center;width:50px;color:hsla(0,0%,100%,.5);transition:color .3s,background-color .3s}.jessibuca-container .jessibuca-quality-menu-item:hover{background-color:hsla(0,0%,100%,.2)}.jessibuca-container .jessibuca-quality-menu-item:focus{outline:none}.jessibuca-container .jessibuca-quality-menu-item.jessibuca-quality-menu-item-active{color:#2298fc}.jessibuca-container .jessibuca-volume-panel-wrap{position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%) translateY(22%);transition:visibility .3s,opacity .3s;background-color:rgba(0,0,0,.5);border-radius:4px;height:120px;width:50px;overflow:hidden}.jessibuca-container .jessibuca-volume-panel-wrap.jessibuca-volume-panel-wrap-show{visibility:visible;opacity:1}.jessibuca-container .jessibuca-volume-panel{cursor:pointer;position:absolute;top:21px;height:60px;width:50px;overflow:hidden}.jessibuca-container .jessibuca-volume-panel-text{position:absolute;left:0;top:0;width:50px;height:20px;line-height:20px;text-align:center;color:#fff;font-size:12px}.jessibuca-container .jessibuca-volume-panel-handle{position:absolute;top:48px;left:50%;width:12px;height:12px;border-radius:12px;margin-left:-6px;background:#fff}.jessibuca-container .jessibuca-volume-panel-handle:before{bottom:-54px;background:#fff}.jessibuca-container .jessibuca-volume-panel-handle:after{bottom:6px;background:hsla(0,0%,100%,.2)}.jessibuca-container .jessibuca-volume-panel-handle:after,.jessibuca-container .jessibuca-volume-panel-handle:before{content:"";position:absolute;display:block;left:50%;width:3px;margin-left:-1px;height:60px}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-controls{width:100vh;transform:translateX(-13vw) translateY(-47.8vh) rotate(270deg);transition:width .5s ease-in}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-play-big:after{transform:rotate(270deg)}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-loading{flex-direction:row}.jessibuca-container.jessibuca-fullscreen-web .jessibuca-loading-text{transform:rotate(270deg)}');class He{constructor(e){var t;this.player=e,((e,t)=>{e._opt.hasControl&&e._opt.controlAutoHide?e.$container.classList.add("jessibuca-controls-show-auto-hide"):e.$container.classList.add("jessibuca-controls-show");const i=e._opt,o=i.operateBtns;e.$container.insertAdjacentHTML("beforeend",`\n ${i.background?``:""}\n \n ${Pe.loading}\n ${i.loadingText?`
${i.loadingText}
`:""}\n
\n ${i.hasControl&&o.play?'':""}\n ${i.hasControl?`\n \n
\n
\n ${i.showBandwidth?'
':""}\n
\n
\n ${o.audio?`\n
\n ${Pe.audio}\n ${Pe.mute}\n
\n
\n `:""}\n ${o.play?`
${Pe.play}
${Pe.pause}
`:""}\n ${o.screenshot?`
${Pe.screenshot}
`:""}\n ${o.record?`
${Pe.record}
${Pe.recordStop}
`:""}\n ${o.fullscreen?`
${Pe.fullscreen}
${Pe.fullscreenExit}
`:""}\n
\n
\n
\n `:""}\n\n `),Object.defineProperty(t,"$poster",{value:e.$container.querySelector(".jessibuca-poster")}),Object.defineProperty(t,"$loading",{value:e.$container.querySelector(".jessibuca-loading")}),Object.defineProperty(t,"$play",{value:e.$container.querySelector(".jessibuca-play")}),Object.defineProperty(t,"$playBig",{value:e.$container.querySelector(".jessibuca-play-big")}),Object.defineProperty(t,"$pause",{value:e.$container.querySelector(".jessibuca-pause")}),Object.defineProperty(t,"$controls",{value:e.$container.querySelector(".jessibuca-controls")}),Object.defineProperty(t,"$fullscreen",{value:e.$container.querySelector(".jessibuca-fullscreen")}),Object.defineProperty(t,"$fullscreen",{value:e.$container.querySelector(".jessibuca-fullscreen")}),Object.defineProperty(t,"$volume",{value:e.$container.querySelector(".jessibuca-volume")}),Object.defineProperty(t,"$volumePanelWrap",{value:e.$container.querySelector(".jessibuca-volume-panel-wrap")}),Object.defineProperty(t,"$volumePanelText",{value:e.$container.querySelector(".jessibuca-volume-panel-text")}),Object.defineProperty(t,"$volumePanel",{value:e.$container.querySelector(".jessibuca-volume-panel")}),Object.defineProperty(t,"$volumeHandle",{value:e.$container.querySelector(".jessibuca-volume-panel-handle")}),Object.defineProperty(t,"$volumeOn",{value:e.$container.querySelector(".jessibuca-icon-audio")}),Object.defineProperty(t,"$volumeOff",{value:e.$container.querySelector(".jessibuca-icon-mute")}),Object.defineProperty(t,"$fullscreen",{value:e.$container.querySelector(".jessibuca-fullscreen")}),Object.defineProperty(t,"$fullscreenExit",{value:e.$container.querySelector(".jessibuca-fullscreen-exit")}),Object.defineProperty(t,"$record",{value:e.$container.querySelector(".jessibuca-record")}),Object.defineProperty(t,"$recordStop",{value:e.$container.querySelector(".jessibuca-record-stop")}),Object.defineProperty(t,"$screenshot",{value:e.$container.querySelector(".jessibuca-screenshot")}),Object.defineProperty(t,"$speed",{value:e.$container.querySelector(".jessibuca-speed")})})(e,this),ze(e,this),t=this,Object.defineProperty(t,"controlsRect",{get:()=>t.$controls.getBoundingClientRect()}),((e,t)=>{const{events:{proxy:i},debug:o}=e;function r(e){const{bottom:i,height:o}=t.$volumePanel.getBoundingClientRect(),{height:r}=t.$volumeHandle.getBoundingClientRect();return pe(i-e.y-r/2,0,o-r/2)/(o-r)}i(window,["click","contextmenu"],(i=>{i.composedPath().indexOf(e.$container)>-1?t.isFocus=!0:t.isFocus=!1})),i(window,"orientationchange",(()=>{setTimeout((()=>{e.resize()}),300)})),i(t.$controls,"click",(e=>{e.stopPropagation()})),i(t.$pause,"click",(t=>{e.pause()})),i(t.$play,"click",(t=>{e.play()})),i(t.$playBig,"click",(t=>{e.play()})),i(t.$volume,"mouseover",(()=>{t.$volumePanelWrap.classList.add("jessibuca-volume-panel-wrap-show")})),i(t.$volume,"mouseout",(()=>{t.$volumePanelWrap.classList.remove("jessibuca-volume-panel-wrap-show")})),i(t.$volumeOn,"click",(i=>{i.stopPropagation(),me(t.$volumeOn,"display","none"),me(t.$volumeOff,"display","block"),e.lastVolume=e.volume,e.volume=0})),i(t.$volumeOff,"click",(i=>{i.stopPropagation(),me(t.$volumeOn,"display","block"),me(t.$volumeOff,"display","none"),e.volume=e.lastVolume||.5})),i(t.$screenshot,"click",(t=>{t.stopPropagation(),e.video.screenshot()})),i(t.$volumePanel,"click",(t=>{t.stopPropagation(),e.volume=r(t)})),i(t.$volumeHandle,"mousedown",(()=>{t.isVolumeDroging=!0})),i(t.$volumeHandle,"mousemove",(i=>{t.isVolumeDroging&&(e.volume=r(i))})),i(document,"mouseup",(()=>{t.isVolumeDroging&&(t.isVolumeDroging=!1)})),i(t.$record,"click",(t=>{t.stopPropagation(),e.recording=!0})),i(t.$recordStop,"click",(t=>{t.stopPropagation(),e.recording=!1})),i(t.$fullscreen,"click",(t=>{t.stopPropagation(),e.fullscreen=!0})),i(t.$fullscreenExit,"click",(t=>{t.stopPropagation(),e.fullscreen=!1})),e._opt.hasControl&&e._opt.controlAutoHide&&(i(e.$container,"mouseover",(()=>{e.fullscreen||me(t.$controls,"display","block")})),i(e.$container,"mouseout",(()=>{me(t.$controls,"display","none")})))})(e,this),e._opt.hotKey&&((e,t)=>{const{events:{proxy:i}}=e,o={};function r(e,t){o[e]?o[e].push(t):o[e]=[t]}r(re,(()=>{e.fullscreen&&(e.fullscreen=!1)})),r(Ae,(()=>{e.volume+=.05})),r(se,(()=>{e.volume-=.05})),i(window,"keydown",(e=>{if(t.isFocus){const t=document.activeElement.tagName.toUpperCase(),i=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==i&&"true"!==i){const t=o[e.keyCode];t&&(e.preventDefault(),t.forEach((e=>e())))}}}))})(e,this),this.player.debug.log("Control","init")}destroy(){this.$poster&&this.player.$container.removeChild(this.$poster),this.$loading&&this.player.$container.removeChild(this.$loading),this.$controls&&this.player.$container.removeChild(this.$controls),this.$playBig&&this.player.$container.removeChild(this.$playBig),this.player.debug.log("control","destroy")}autoSize(){const e=this.player;e.$container.style.padding="0 0";const t=e.width,i=e.height,o=t/i,r=e.video.$videoElement.width/e.video.$videoElement.height;if(o>r){const o=(t-i*r)/2;e.$container.style.padding=`0 ${o}px`}else{const o=(i-t/r)/2;e.$container.style.padding=`${o}px 0`}}}Ye(".jessibuca-container{position:relative;width:100%;height:100%;overflow:hidden}.jessibuca-container.jessibuca-fullscreen-web{position:fixed;z-index:9999;left:0;top:0;right:0;bottom:0;width:100vw!important;height:100vh!important;background:#000}");class Xe{static init(){Xe.types={avc1:[],avcC:[],hvc1:[],hvcC:[],btrt:[],dinf:[],dref:[],esds:[],ftyp:[],hdlr:[],mdat:[],mdhd:[],mdia:[],mfhd:[],minf:[],moof:[],moov:[],mp4a:[],mvex:[],mvhd:[],sdtp:[],stbl:[],stco:[],stsc:[],stsd:[],stsz:[],stts:[],tfdt:[],tfhd:[],traf:[],trak:[],trun:[],trex:[],tkhd:[],vmhd:[],smhd:[]};for(let e in Xe.types)Xe.types.hasOwnProperty(e)&&(Xe.types[e]=[e.charCodeAt(0),e.charCodeAt(1),e.charCodeAt(2),e.charCodeAt(3)]);let e=Xe.constants={};e.FTYP=new Uint8Array([105,115,111,109,0,0,0,1,105,115,111,109,97,118,99,49]),e.STSD_PREFIX=new Uint8Array([0,0,0,0,0,0,0,1]),e.STTS=new Uint8Array([0,0,0,0,0,0,0,0]),e.STSC=e.STCO=e.STTS,e.STSZ=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0]),e.HDLR_VIDEO=new Uint8Array([0,0,0,0,0,0,0,0,118,105,100,101,0,0,0,0,0,0,0,0,0,0,0,0,86,105,100,101,111,72,97,110,100,108,101,114,0]),e.HDLR_AUDIO=new Uint8Array([0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0,83,111,117,110,100,72,97,110,100,108,101,114,0]),e.DREF=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,12,117,114,108,32,0,0,0,1]),e.SMHD=new Uint8Array([0,0,0,0,0,0,0,0]),e.VMHD=new Uint8Array([0,0,0,1,0,0,0,0,0,0,0,0])}static box(e){let t=8,i=null,o=Array.prototype.slice.call(arguments,1),r=o.length;for(let e=0;e>>24&255,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i.set(e,4);let A=8;for(let e=0;e>>24&255,e>>>16&255,e>>>8&255,255&e,t>>>24&255,t>>>16&255,t>>>8&255,255&t,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]))}static trak(e){return Xe.box(Xe.types.trak,Xe.tkhd(e),Xe.mdia(e))}static tkhd(e){let t=e.id,i=e.duration,o=e.presentWidth,r=e.presentHeight;return Xe.box(Xe.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,o>>>8&255,255&o,0,0,r>>>8&255,255&r,0,0]))}static mdia(e){return Xe.box(Xe.types.mdia,Xe.mdhd(e),Xe.hdlr(e),Xe.minf(e))}static mdhd(e){let t=e.timescale,i=e.duration;return Xe.box(Xe.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,i>>>24&255,i>>>16&255,i>>>8&255,255&i,85,196,0,0]))}static hdlr(e){let t=null;return t="audio"===e.type?Xe.constants.HDLR_AUDIO:Xe.constants.HDLR_VIDEO,Xe.box(Xe.types.hdlr,t)}static minf(e){let t=null;return t="audio"===e.type?Xe.box(Xe.types.smhd,Xe.constants.SMHD):Xe.box(Xe.types.vmhd,Xe.constants.VMHD),Xe.box(Xe.types.minf,t,Xe.dinf(),Xe.stbl(e))}static dinf(){return Xe.box(Xe.types.dinf,Xe.box(Xe.types.dref,Xe.constants.DREF))}static stbl(e){return Xe.box(Xe.types.stbl,Xe.stsd(e),Xe.box(Xe.types.stts,Xe.constants.STTS),Xe.box(Xe.types.stsc,Xe.constants.STSC),Xe.box(Xe.types.stsz,Xe.constants.STSZ),Xe.box(Xe.types.stco,Xe.constants.STCO))}static stsd(e){return"audio"===e.type?Xe.box(Xe.types.stsd,Xe.constants.STSD_PREFIX,Xe.mp4a(e)):"avc"===e.videoType?Xe.box(Xe.types.stsd,Xe.constants.STSD_PREFIX,Xe.avc1(e)):Xe.box(Xe.types.stsd,Xe.constants.STSD_PREFIX,Xe.hvc1(e))}static mp4a(e){let t=e.channelCount,i=e.audioSampleRate,o=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t,0,16,0,0,0,0,i>>>8&255,255&i,0,0]);return Xe.box(Xe.types.mp4a,o,Xe.esds(e))}static esds(e){let t=e.config||[],i=t.length,o=new Uint8Array([0,0,0,0,3,23+i,0,1,0,4,15+i,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([i]).concat(t).concat([6,1,2]));return Xe.box(Xe.types.esds,o)}static avc1(e){let t=e.avcc;const i=e.codecWidth,o=e.codecHeight;let r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,i>>>8&255,255&i,o>>>8&255,255&o,0,72,0,0,0,72,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return Xe.box(Xe.types.avc1,r,Xe.box(Xe.types.avcC,t))}static hvc1(e){let t=e.avcc;const i=e.codecWidth,o=e.codecHeight;let r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,i>>>8&255,255&i,o>>>8&255,255&o,0,72,0,0,0,72,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return Xe.box(Xe.types.hvc1,r,Xe.box(Xe.types.hvcC,t))}static mvex(e){return Xe.box(Xe.types.mvex,Xe.trex(e))}static trex(e){let t=e.id,i=new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return Xe.box(Xe.types.trex,i)}static moof(e,t){return Xe.box(Xe.types.moof,Xe.mfhd(e.sequenceNumber),Xe.traf(e,t))}static mfhd(e){let t=new Uint8Array([0,0,0,0,e>>>24&255,e>>>16&255,e>>>8&255,255&e]);return Xe.box(Xe.types.mfhd,t)}static traf(e,t){let i=e.id,o=Xe.box(Xe.types.tfhd,new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i])),r=Xe.box(Xe.types.tfdt,new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t])),A=Xe.sdtp(e),s=Xe.trun(e,A.byteLength+16+16+8+16+8+8);return Xe.box(Xe.types.traf,o,r,s,A)}static sdtp(e){let t=new Uint8Array(5),i=e.flags;return t[4]=i.isLeading<<6|i.dependsOn<<4|i.isDependedOn<<2|i.hasRedundancy,Xe.box(Xe.types.sdtp,t)}static trun(e,t){let i=new Uint8Array(28);t+=36,i.set([0,0,15,1,0,0,0,1,t>>>24&255,t>>>16&255,t>>>8&255,255&t],0);let o=e.duration,r=e.size,A=e.flags,s=e.cts;return i.set([o>>>24&255,o>>>16&255,o>>>8&255,255&o,r>>>24&255,r>>>16&255,r>>>8&255,255&r,A.isLeading<<2|A.dependsOn,A.isDependedOn<<6|A.hasRedundancy<<4|A.isNonSync,0,0,s>>>24&255,s>>>16&255,s>>>8&255,255&s],12),Xe.box(Xe.types.trun,i)}static mdat(e){return Xe.box(Xe.types.mdat,e)}}Xe.init();class Ze{constructor(e){this.TAG="ExpGolomb",this._buffer=e,this._buffer_index=0,this._total_bytes=e.byteLength,this._total_bits=8*e.byteLength,this._current_word=0,this._current_word_bits_left=0}destroy(){this._buffer=null}_fillCurrentWord(){let e=this._total_bytes-this._buffer_index,t=Math.min(4,e),i=new Uint8Array(4);i.set(this._buffer.subarray(this._buffer_index,this._buffer_index+t)),this._current_word=new DataView(i.buffer).getUint32(0,!1),this._buffer_index+=t,this._current_word_bits_left=8*t}readBits(e){if(e<=this._current_word_bits_left){let t=this._current_word>>>32-e;return this._current_word<<=e,this._current_word_bits_left-=e,t}let t=this._current_word_bits_left?this._current_word:0;t>>>=32-this._current_word_bits_left;let i=e-this._current_word_bits_left;this._fillCurrentWord();let o=Math.min(i,this._current_word_bits_left),r=this._current_word>>>32-o;return this._current_word<<=o,this._current_word_bits_left-=o,t=t<>>e))return this._current_word<<=e,this._current_word_bits_left-=e,e;return this._fillCurrentWord(),e+this._skipLeadingZero()}readUEG(){let e=this._skipLeadingZero();return this.readBits(e+1)-1}readSEG(){let e=this.readUEG();return 1&e?e+1>>>1:-1*(e>>>1)}}class qe{static _ebsp2rbsp(e){let t=e,i=t.byteLength,o=new Uint8Array(i),r=0;for(let e=0;e=2&&3===t[e]&&0===t[e-1]&&0===t[e-2]||(o[r]=t[e],r++);return new Uint8Array(o.buffer,0,r)}static parseSPS(e){let t=qe._ebsp2rbsp(e),i=new Ze(t);i.readByte();let o=i.readByte();i.readByte();let r=i.readByte();i.readUEG();let A=qe.getProfileString(o),s=qe.getLevelString(r),n=1,a=420,d=[0,420,422,444],c=8;if((100===o||110===o||122===o||244===o||44===o||83===o||86===o||118===o||128===o||138===o||144===o)&&(n=i.readUEG(),3===n&&i.readBits(1),n<=3&&(a=d[n]),c=i.readUEG()+8,i.readUEG(),i.readBits(1),i.readBool())){let e=3!==n?8:12;for(let t=0;t0&&e<16?(v=t[e-1],w=o[e-1]):255===e&&(v=i.readByte()<<8|i.readByte(),w=i.readByte()<<8|i.readByte())}if(i.readBool()&&i.readBool(),i.readBool()&&(i.readBits(4),i.readBool()&&i.readBits(24)),i.readBool()&&(i.readUEG(),i.readUEG()),i.readBool()){let e=i.readBits(32),t=i.readBits(32);E=i.readBool(),B=t,C=2*e,S=B/C}}let R=1;1===v&&1===w||(R=v/w);let k=0,T=0;if(0===n)k=1,T=2-m;else{k=3===n?1:2,T=(1===n?2:1)*(2-m)}let I=16*(h+1),x=16*(p+1)*(2-m);I-=(g+f)*k,x-=(b+y)*T;let D=Math.ceil(I*R);return i.destroy(),i=null,{profile_string:A,level_string:s,bit_depth:c,ref_frames:u,chroma_format:a,chroma_format_string:qe.getChromaFormatString(a),frame_rate:{fixed:E,fps:S,fps_den:C,fps_num:B},sar_ratio:{width:v,height:w},codec_size:{width:I,height:x},present_size:{width:D,height:x}}}static _skipScalingList(e,t){let i=8,o=8,r=0;for(let A=0;A{this.mediaSourceOpen=!0,this.player.emit(T.mseSourceOpen)})),i(this.mediaSource,"sourceclose",(()=>{this.player.emit(T.mseSourceClose)})),e.debug.log("MediaSource","init")}destroy(){this.stop(),this.bufferList=[],this.mediaSource=null,this.mediaSourceOpen=!1,this.sourceBuffer=null,this.hasInit=!1,this.isInitInfo=!1,this.sequenceNumber=0,this.cacheTrack=null,this.timeInit=!1,this.off(),this.player.debug.log("MediaSource","destroy")}get state(){return this.mediaSource.readyState}get isStateOpen(){return this.state===te}get isStateClosed(){return this.state===ie}get isStateEnded(){return this.state===ee}get duration(){return this.mediaSource.duration}set duration(e){this.mediaSource.duration=e}decodeVideo(e,t,i){const o=this.player;if(this.hasInit)this._decodeVideo(e,t,i);else if(i&&0===e[1]){const r=15&e[0];if(o.video.updateVideoInfo({encTypeCode:r}),r===M)return void this.emit(x.mediaSourceH265NotSupport);o._times.decodeStart||(o._times.decodeStart=he()),this._decodeConfigurationRecord(e,t,i,r),this.hasInit=!0}}_doDecode(){const e=this.bufferList.shift();e&&this._decodeVideo(e.payload,e.ts,e.isIframe)}_decodeConfigurationRecord(e,t,i,o){let r=e.slice(5),A={};o===O?A=function(e){const t={},i=new DataView(e.buffer);let o=i.getUint8(0),r=i.getUint8(1);if(i.getUint8(2),i.getUint8(3),1!==o||0===r)return;const A=1+(3&i.getUint8(4));if(3!==A&&4!==A)return;let s=31&i.getUint8(5);if(0===s)return;let n=6;for(let o=0;o1&&(this.removeBuffer(n.buffered.start(0),n.buffered.end(0)),this.timeInit=!1),this.dropping&&s-this.cacheTrack.dts>1e3)this.dropping=!1,this.cacheTrack={};else if(this.cacheTrack&&s>this.cacheTrack.dts){let e=8+this.cacheTrack.size,i=new Uint8Array(e);i[0]=e>>>24&255,i[1]=e>>>16&255,i[2]=e>>>8&255,i[3]=255&e,i.set(Xe.types.mdat,4),i.set(this.cacheTrack.data,8),this.cacheTrack.duration=s-this.cacheTrack.dts;let r=Xe.moof(this.cacheTrack,this.cacheTrack.dts),A=new Uint8Array(r.byteLength+i.byteLength);A.set(r,0),A.set(i,r.byteLength),this.appendBuffer(A.buffer),o.handleRender(),o.updateStats({fps:!0,ts:t,buf:o.demux.delay}),o._times.videoStart||(o._times.videoStart=he(),o.handlePlayToRenderTimes())}else o.debug.log("MediaSource","timeInit set false , cacheTrack = {}"),this.timeInit=!1,this.cacheTrack={};this.cacheTrack.id=1,this.cacheTrack.sequenceNumber=++this.sequenceNumber,this.cacheTrack.size=A,this.cacheTrack.dts=s,this.cacheTrack.cts=0,this.cacheTrack.isKeyframe=i,this.cacheTrack.data=r,this.cacheTrack.flags={isLeading:0,dependsOn:i?2:1,isDependedOn:i?1:0,hasRedundancy:0,isNonSync:i?0:1},this.timeInit||1!==n.buffered.length||(o.debug.log("MediaSource","timeInit set true"),this.timeInit=!0,n.currentTime=n.buffered.end(0)),!this.isInitInfo&&n.videoWidth>0&&n.videoHeight>0&&(o.debug.log("MediaSource",`updateVideoInfo: ${n.videoWidth},${n.videoHeight}`),o.video.updateVideoInfo({width:n.videoWidth,height:n.videoHeight}),o.video.initCanvasViewSize(),this.isInitInfo=!0)}appendBuffer(e){const{debug:t,events:{proxy:i}}=this.player;null===this.sourceBuffer&&(this.sourceBuffer=this.mediaSource.addSourceBuffer($),i(this.sourceBuffer,"error",(e=>{this.player.emit(T.mseSourceBufferError,e)}))),!1===this.sourceBuffer.updating&&this.isStateOpen?this.sourceBuffer.appendBuffer(e):this.isStateClosed?this.player.emit(T.mseSourceBufferError,"mediaSource is not attached to video or mediaSource is closed"):this.isStateEnded?this.player.emit(T.mseSourceBufferError,"mediaSource is closed"):!0===this.sourceBuffer.updating&&this.player.emit(T.mseSourceBufferBusy)}stop(){this.isStateOpen&&this.sourceBuffer&&this.sourceBuffer.abort(),this.endOfStream()}dropSourceBuffer(e){const t=this.player.video.$videoElement;this.dropping=e,t.buffered.length>0&&t.buffered.end(0)-t.currentTime>1&&(t.currentTime=t.buffered.end(0))}removeBuffer(e,t){if(this.isStateOpen&&!1===this.sourceBuffer.updating)try{this.sourceBuffer.remove(e,t)}catch(e){console.error(e)}}endOfStream(){this.isStateOpen&&this.mediaSource.endOfStream()}}const _e=()=>"undefined"!=typeof navigator&&parseFloat((""+(/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))<10&&!window.MSStream,$e=()=>"wakeLock"in navigator;class et{constructor(e){if(this.player=e,this.enabled=!1,$e()){this._wakeLock=null;const e=()=>{null!==this._wakeLock&&"visible"===document.visibilityState&&this.enable()};document.addEventListener("visibilitychange",e),document.addEventListener("fullscreenchange",e)}else _e()?this.noSleepTimer=null:(this.noSleepVideo=document.createElement("video"),this.noSleepVideo.setAttribute("title","No Sleep"),this.noSleepVideo.setAttribute("playsinline",""),this._addSourceToVideo(this.noSleepVideo,"webm","data:video/webm;base64,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"),this._addSourceToVideo(this.noSleepVideo,"mp4","data:video/mp4;base64,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"),this.noSleepVideo.addEventListener("loadedmetadata",(()=>{this.noSleepVideo.duration<=1?this.noSleepVideo.setAttribute("loop",""):this.noSleepVideo.addEventListener("timeupdate",(()=>{this.noSleepVideo.currentTime>.5&&(this.noSleepVideo.currentTime=Math.random())}))})))}_addSourceToVideo(e,t,i){var o=document.createElement("source");o.src=i,o.type=`video/${t}`,e.appendChild(o)}get isEnabled(){return this.enabled}enable(){const e=this.player.debug;if($e())return navigator.wakeLock.request("screen").then((t=>{this._wakeLock=t,this.enabled=!0,e.log("wakeLock","Wake Lock active."),this._wakeLock.addEventListener("release",(()=>{e.log("wakeLock","Wake Lock released.")}))})).catch((t=>{throw this.enabled=!1,e.error("wakeLock",`${t.name}, ${t.message}`),t}));if(_e())return this.disable(),this.noSleepTimer=window.setInterval((()=>{document.hidden||(window.location.href=window.location.href.split("#")[0],window.setTimeout(window.stop,0))}),15e3),this.enabled=!0,Promise.resolve();return this.noSleepVideo.play().then((e=>(this.enabled=!0,e))).catch((e=>{throw this.enabled=!1,e}))}disable(){const e=this.player.debug;$e()?(this._wakeLock&&this._wakeLock.release(),this._wakeLock=null):_e()?this.noSleepTimer&&(e.warn("wakeLock","NoSleep now disabled for older iOS devices."),window.clearInterval(this.noSleepTimer),this.noSleepTimer=null):this.noSleepVideo.pause(),this.enabled=!1}}class tt extends Be{constructor(e,t){var i;super(),this.$container=e,this._opt=Object.assign({},d,t),this.debug=new ne(this),this._opt.useWCS&&(this._opt.useWCS="VideoEncoder"in window),this._opt.useMSE&&(this._opt.useMSE=window.MediaSource&&window.MediaSource.isTypeSupported($)),this._opt.useMSE?(this._opt.useWCS&&this.debug.log("Player","useWCS set true->false"),this._opt.forceNoOffscreen||this.debug.log("Player","forceNoOffscreen set false->true"),this._opt.useWCS=!1,this._opt.forceNoOffscreen=!0):this._opt.useWCS,this._opt.forceNoOffscreen||("undefined"==typeof OffscreenCanvas?(this._opt.forceNoOffscreen=!0,this._opt.useOffscreen=!1):this._opt.useOffscreen=!0),this._opt.hasAudio||(this._opt.operateBtns.audio=!1),this._opt.hasControl=this._hasControl(),this._loading=!1,this._playing=!1,this._hasLoaded=!1,this._checkHeartTimeout=null,this._checkLoadingTimeout=null,this._startBpsTime=null,this._isPlayingBeforePageHidden=!1,this._stats={buf:0,fps:0,abps:0,vbps:0,ts:0},this._times={playInitStart:"",playStart:"",streamStart:"",streamResponse:"",demuxStart:"",decodeStart:"",videoStart:"",playTimestamp:"",streamTimestamp:"",streamResponseTimestamp:"",demuxTimestamp:"",decodeTimestamp:"",videoTimestamp:"",allTimestamp:""},this._videoTimestamp=0,this._audioTimestamp=0,i=this,Object.defineProperty(i,"rect",{get:()=>{const e=i.$container.getBoundingClientRect();return e.width=Math.max(e.width,i.$container.clientWidth),e.height=Math.max(e.height,i.$container.clientHeight),e}}),["bottom","height","left","right","top","width"].forEach((e=>{Object.defineProperty(i,e,{get:()=>i.rect[e]})})),this.events=new ae(this),this.video=new Te(this),this._opt.hasAudio&&(this.audio=new xe(this)),this.recorder=new Ve(this),this._onlyMseOrWcsVideo()?this.loaded=!0:this.decoderWorker=new Oe(this),this.stream=null,this.demux=null,this._opt.useWCS&&(this.webcodecsDecoder=new Je(this)),this._opt.useMSE&&(this.mseDecoder=new Ke(this)),this.control=new He(this),this.keepScreenOn=new et(this),(e=>{try{const t=()=>{e.emit(I.fullscreen,e.fullscreen),e.fullscreen?e._opt.useMSE&&e.resize():e.resize()};de.on("change",t),e.events.destroys.push((()=>{de.off("change",t)}))}catch(e){}if(e.on(T.decoderWorkerInit,(()=>{e.debug.log("player","has loaded"),e.loaded=!0})),e.on(T.play,(()=>{e.loading=!1})),e.on(T.fullscreen,(t=>{if(t)try{de.request(e.$container).then((()=>{})).catch((t=>{e.webFullscreen=!0}))}catch(t){e.webFullscreen=!0}else try{de.exit().then((()=>{})).catch((()=>{e.webFullscreen=!1}))}catch(t){e.webFullscreen=!1}})),e.on(T.webFullscreen,(t=>{t?e.$container.classList.add("jessibuca-fullscreen-web"):e.$container.classList.remove("jessibuca-fullscreen-web")})),e.on(T.resize,(()=>{e.video.resize()})),e._opt.debug){const t=[T.timeUpdate];Object.keys(T).forEach((i=>{e.on(T[i],(o=>{t.includes(i)||e.debug.log("player events",T[i],o)}))})),Object.keys(x).forEach((t=>{e.on(x[t],(i=>{e.debug.log("player event error",x[t],i)}))}))}})(this),(e=>{const{_opt:t,debug:i,events:{proxy:o}}=e;t.supportDblclickFullscreen&&o(e.$container,"dblclick",(()=>{e.fullscreen=!e.fullscreen})),o(document,"visibilitychange",(()=>{t.hiddenAutoPause&&(i.log("visibilitychange",document.visibilityState,e._isPlayingBeforePageHidden),"visible"===document.visibilityState?e._isPlayingBeforePageHidden&&e.play():(e._isPlayingBeforePageHidden=e.playing,e.playing&&e.pause()))})),o(window,"fullscreenchange",(()=>{null!==e.keepScreenOn&&"visible"===document.visibilityState&&e.enableWakeLock()}))})(this),this._opt.useWCS&&this.debug.log("Player","use WCS"),this._opt.useMSE&&this.debug.log("Player","use MSE"),this._opt.useOffscreen&&this.debug.log("Player","use offscreen"),this.debug.log("Player options",this._opt)}destroy(){this._loading=!1,this._playing=!1,this._hasLoaded=!1,this._times={playInitStart:"",playStart:"",streamStart:"",streamResponse:"",demuxStart:"",decodeStart:"",videoStart:"",playTimestamp:"",streamTimestamp:"",streamResponseTimestamp:"",demuxTimestamp:"",decodeTimestamp:"",videoTimestamp:"",allTimestamp:""},this.decoderWorker&&(this.decoderWorker.destroy(),this.decoderWorker=null),this.video&&(this.video.destroy(),this.video=null),this.audio&&(this.audio.destroy(),this.audio=null),this.stream&&(this.stream.destroy(),this.stream=null),this.recorder&&(this.recorder.destroy(),this.recorder=null),this.control&&(this.control.destroy(),this.control=null),this.webcodecsDecoder&&(this.webcodecsDecoder.destroy(),this.webcodecsDecoder=null),this.mseDecoder&&(this.mseDecoder.destroy(),this.mseDecoder=null),this.demux&&(this.demux.destroy(),this.demux=null),this.events&&(this.events.destroy(),this.events=null),this.clearCheckHeartTimeout(),this.clearCheckLoadingTimeout(),this.releaseWakeLock(),this.keepScreenOn=null,this.resetStats(),this._audioTimestamp=0,this._videoTimestamp=0,this.emit("destroy"),this.off(),this.debug.log("play","destroy end")}set fullscreen(e){ye()?(this.emit(T.webFullscreen,e),setTimeout((()=>{this.updateOption({rotate:e?270:0}),this.resize()}),10)):this.emit(T.fullscreen,e)}get fullscreen(){return document.isFullScreen||document.mozIsFullScreen||document.webkitIsFullScreen||this.webFullscreen}set webFullscreen(e){this.emit(T.webFullscreen,e)}get webFullscreen(){return this.$container.classList.contains("jessibuca-fullscreen-web")}set loaded(e){this._hasLoaded=e}get loaded(){return this._hasLoaded}set playing(e){e&&(this.loading=!1),this.playing!==e&&(this._playing=e,this.emit(T.playing,e),this.emit(T.volumechange,this.volume),e?this.emit(T.play):this.emit(T.pause))}get playing(){return this._playing}get volume(){return this.audio&&this.audio.volume||0}set volume(e){this.audio&&this.audio.setVolume(e)}set loading(e){this.loading!==e&&(this._loading=e,this.emit(T.loading,this._loading))}get loading(){return this._loading}set recording(e){e?this.playing&&this.recorder.startRecord():this.recorder.stopRecordAndSave()}get recording(){return this.recorder&&this.recorder.recording}set audioTimestamp(e){null!==e&&(this._audioTimestamp=e)}get audioTimestamp(){return this._audioTimestamp}set videoTimestamp(e){null!==e&&(this._videoTimestamp=e,this._opt.useWCS||this._opt.useMSE||this.audioTimestamp&&this.videoTimestamp&&this.audio&&this.audio.emit(T.videoSyncAudio,{audioTimestamp:this.audioTimestamp,videoTimestamp:this.videoTimestamp,diff:this.audioTimestamp-this.videoTimestamp}))}get videoTimestamp(){return this._videoTimestamp}updateOption(e){this._opt=Object.assign({},this._opt,e)}init(){return new Promise(((e,t)=>{this.stream||(this.stream=new Le(this)),this.demux||(this.demux=new Ge(this)),this._opt.useWCS&&(this.webcodecsDecoder||(this.webcodecsDecoder=new Je(this))),this._opt.useMSE&&(this.mseDecoder||(this.mseDecoder=new Ke(this))),this.decoderWorker||this._onlyMseOrWcsVideo()?e():(this.decoderWorker=new Oe(this),this.once(T.decoderWorkerInit,(()=>{e()})))}))}play(e){return new Promise(((t,i)=>{if(!e&&!this._opt.url)return i();this.loading=!0,this.playing=!1,this._times.playInitStart=he(),e||(e=this._opt.url),this._opt.url=e,this.clearCheckHeartTimeout(),this.init().then((()=>{this._times.playStart=he(),this._opt.isNotMute&&this.mute(!1),this.webcodecsDecoder&&this.webcodecsDecoder.once(x.webcodecsH265NotSupport,(()=>{this.emit(x.webcodecsH265NotSupport),this._opt.autoWasm||this.emit(T.error,x.webcodecsH265NotSupport)})),this.mseDecoder&&this.mseDecoder.once(x.mediaSourceH265NotSupport,(()=>{this.emit(x.mediaSourceH265NotSupport),this._opt.autoWasm||this.emit(T.error,x.mediaSourceH265NotSupport)})),this.enableWakeLock(),this.stream.fetchStream(e),this.checkLoadingTimeout(),this.stream.once(x.fetchError,(e=>{i(e)})),this.stream.once(x.websocketError,(e=>{i(e)})),this.stream.once(T.streamSuccess,(()=>{t(),this._times.streamResponse=he(),this.video.play()}))})).catch((e=>{i(e)}))}))}close(){return new Promise(((e,t)=>{this._close().then((()=>{this.video.clearView(),e()}))}))}_close(){return new Promise(((e,t)=>{this.stream&&(this.stream.destroy(),this.stream=null),this.demux&&(this.demux.destroy(),this.demux=null),this.decoderWorker&&(this.decoderWorker.destroy(),this.decoderWorker=null),this.webcodecsDecoder&&(this.webcodecsDecoder.destroy(),this.webcodecsDecoder=null),this.mseDecoder&&(this.mseDecoder.destroy(),this.mseDecoder=null),this.clearCheckHeartTimeout(),this.clearCheckLoadingTimeout(),this.playing=!1,this.loading=!1,this.recording=!1,this.audio&&this.audio.pause(),this.video&&this.video.pause(),this.releaseWakeLock(),this.resetStats(),this._audioTimestamp=0,this._videoTimestamp=0,this._times={playInitStart:"",playStart:"",streamStart:"",streamResponse:"",demuxStart:"",decodeStart:"",videoStart:"",playTimestamp:"",streamTimestamp:"",streamResponseTimestamp:"",demuxTimestamp:"",decodeTimestamp:"",videoTimestamp:"",allTimestamp:""},setTimeout((()=>{e()}),0)}))}pause(e){return e?this.close():this._close()}mute(e){this.audio&&this.audio.mute(e)}resize(){this.video.resize()}startRecord(e,t){this.recording||(this.recorder.setFileName(e,t),this.recording=!0)}stopRecordAndSave(){this.recording&&(this.recording=!1)}_hasControl(){let e=!1,t=!1;return Object.keys(this._opt.operateBtns).forEach((e=>{this._opt.operateBtns[e]&&(t=!0)})),(this._opt.showBandwidth||this._opt.text||t)&&(e=!0),e}_onlyMseOrWcsVideo(){return!1===this._opt.hasAudio&&(this._opt.useMSE||this._opt.useWCS&&!this._opt.useOffscreen)}checkHeart(){this.clearCheckHeartTimeout(),this.checkHeartTimeout()}checkHeartTimeout(){this._checkHeartTimeout=setTimeout((()=>{this.pause(!1).then((()=>{this.emit(T.timeout,T.delayTimeout),this.emit(T.delayTimeout)}))}),1e3*this._opt.heartTimeout)}clearCheckHeartTimeout(){this._checkHeartTimeout&&(clearTimeout(this._checkHeartTimeout),this._checkHeartTimeout=null)}checkLoadingTimeout(){this._checkLoadingTimeout=setTimeout((()=>{this.pause(!1).then((()=>{this.emit(T.timeout,T.loadingTimeout),this.emit(T.loadingTimeout)}))}),1e3*this._opt.loadingTimeout)}clearCheckLoadingTimeout(){this._checkLoadingTimeout&&(clearTimeout(this._checkLoadingTimeout),this._checkLoadingTimeout=null)}handleRender(){this.loading&&(this.emit(T.start),this.loading=!1,this.clearCheckLoadingTimeout()),this.playing||(this.playing=!0),this.checkHeart()}updateStats(e){e=e||{},this._startBpsTime||(this._startBpsTime=he()),Ee(e.ts)&&(this._stats.ts=e.ts),Ee(e.buf)&&(this._stats.buf=e.buf),e.fps&&(this._stats.fps+=1),e.abps&&(this._stats.abps+=e.abps),e.vbps&&(this._stats.vbps+=e.vbps);const t=he();t-this._startBpsTime<1e3||(this.emit(T.stats,this._stats),this.emit(T.performance,function(e){let t=0;return e>=24?t=2:e>=15&&(t=1),t}(this._stats.fps)),this._stats.fps=0,this._stats.abps=0,this._stats.vbps=0,this._startBpsTime=t)}resetStats(){this._startBpsTime=null,this._stats={buf:0,fps:0,abps:0,vbps:0,ts:0}}enableWakeLock(){this._opt.keepScreenOn&&this.keepScreenOn.enable()}releaseWakeLock(){this._opt.keepScreenOn&&this.keepScreenOn.disable()}handlePlayToRenderTimes(){const e=this._times;e.playTimestamp=e.playStart-e.playInitStart,e.streamTimestamp=e.streamStart-e.playStart,e.streamResponseTimestamp=e.streamResponse-e.streamStart,e.demuxTimestamp=e.demuxStart-e.streamResponse,e.decodeTimestamp=e.decodeStart-e.demuxStart,e.videoTimestamp=e.videoStart-e.decodeStart,e.allTimestamp=e.videoStart-e.playInitStart,this.emit(T.playToRenderTimes,e)}}class it extends Be{constructor(e){super();let t=e,i=e.container;if("string"==typeof e.container&&(i=document.querySelector(e.container)),!i)throw new Error("Jessibuca need container option");i.classList.add("jessibuca-container"),delete t.container,Ee(t.videoBuffer)&&(t.videoBuffer=1e3*Number(t.videoBuffer)),Ee(t.timeout)&&(Se(t.loadingTimeout)&&(t.loadingTimeout=t.timeout),Se(t.heartTimeout)&&(t.heartTimeout=t.timeout)),this._opt=t,this.$container=i,this._loadingTimeoutReplayTimes=0,this._heartTimeoutReplayTimes=0,this.events=new ae(this),this._initPlayer(i,t)}destroy(){this.events&&(this.events.destroy(),this.events=null),this.player&&(this.player.destroy(),this.player=null),this.$container=null,this._opt=null,this._loadingTimeoutReplayTimes=0,this._heartTimeoutReplayTimes=0,this.off()}_initPlayer(e,t){this.player=new tt(e,t),this._bindEvents()}_resetPlayer(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.player.destroy(),this.player=null;const t=Object.assign(this._opt,e);this._initPlayer(this.$container,t)}_bindEvents(){Object.keys(I).forEach((e=>{this.player.on(I[e],(t=>{this.emit(e,t)}))}))}setDebug(e){this.player.updateOption({isDebug:!!e})}mute(){this.player.mute(!0)}cancelMute(){this.player.mute(!1)}setVolume(e){this.player.volume=e}audioResume(){this.player.audio&&this.player.audio.audioEnabled(!0)}setTimeout(e){e=Number(e),this.player.updateOption({timeout:e,loadingTimeout:e,heartTimeout:e})}setScaleMode(e){let t={isFullResize:!1,isResize:!1};switch(e=Number(e)){case N:t.isFullResize=!1,t.isResize=!1;break;case P:t.isFullResize=!1,t.isResize=!0;break;case z:t.isFullResize=!0,t.isResize=!0}this.player.updateOption(t),this.resize()}pause(){return this.player.pause()}close(){return this._opt.url="",this.player.close()}clearView(){this.player.video.clearView()}play(e){return new Promise(((t,i)=>{if(!e&&!this._opt.url)return this.emit(T.error,x.playError),void i();if(e){if(!this._opt.url)return this._play(e);e===this._opt.url?this.player.playing?t():(this.clearView(),this.player.play(this._opt.url).then((()=>{t()})).catch((()=>{this.player.pause().then((()=>{i()}))}))):this.player.pause().then((()=>(this.clearView(),this._play(e)))).catch((()=>{i()}))}else this.player.play(this._opt.url).then((()=>{t()})).catch((()=>{this.player.pause().then((()=>{i()}))}))}))}_play(e){return new Promise(((t,i)=>{this._opt.url=e;const o=0===e.indexOf("http"),r=o?s:A,d=o||-1!==e.indexOf(".flv")||this._opt.isFlv?n:a;this.player.updateOption({protocol:r,demuxType:d}),this.player.once(x.mediaSourceH265NotSupport,(()=>{this.close().then((()=>{this.player._opt.autoWasm&&(this.player.debug.log("Jessibuca","auto wasm [mse-> wasm] reset player and play"),this._resetPlayer({useMSE:!1}),this.play(e).then((()=>{this.player.debug.log("Jessibuca","auto wasm [mse-> wasm] reset player and play success")})).catch((()=>{this.player.debug.log("Jessibuca","auto wasm [mse-> wasm] reset player and play error")})))}))})),this.player.once(x.webcodecsH265NotSupport,(()=>{this.close().then((()=>{this.player._opt.autoWasm&&(this.player.debug.log("Jessibuca","auto wasm [wcs-> wasm] reset player and play"),this._resetPlayer({useWCS:!1}),this.play(e).then((()=>{this.player.debug.log("Jessibuca","auto wasm [wcs-> wasm] reset player and play success")})).catch((()=>{this.player.debug.log("Jessibuca","auto wasm [wcs-> wasm] reset player and play error")})))}))})),this.player.once(x.wasmDecodeError,(()=>{this.player._opt.wasmDecodeErrorReplay&&this.close().then((()=>{this.player.debug.log("Jessibuca","wasm decode error and reset player and play"),this._resetPlayer({useWCS:!1}),this.play(e).then((()=>{this.player.debug.log("Jessibuca","wasm decode error and reset player and play success")})).catch((()=>{this.player.debug.log("Jessibuca","wasm decode error and reset player and play error")}))}))})),this.player.once(T.delayTimeout,(()=>{this.player._opt.heartTimeoutReplay&&this._heartTimeoutReplayTimes{this._heartTimeoutReplayTimes=0})).catch((()=>{})))})),this.player.once(T.loadingTimeout,(()=>{this.player._opt.loadingTimeoutReplay&&this._loadingTimeoutReplayTimes{this._loadingTimeoutReplayTimes=0})).catch((()=>{})))})),this.hasLoaded()?this.player.play(e).then((()=>{t()})).catch((()=>{this.player.pause().then((()=>{i()}))})):this.player.once(T.decoderWorkerInit,(()=>{this.player.play(e).then((()=>{t()})).catch((()=>{this.player.pause().then((()=>{i()}))}))}))}))}resize(){this.player.resize()}setBufferTime(e){e=Number(e),this.player.updateOption({videoBuffer:1e3*e}),this.player.decoderWorker&&this.player.decoderWorker.updateWorkConfig({key:"videoBuffer",value:1e3*e})}setRotate(e){e=parseInt(e,10);this._opt.rotate!==e&&-1!==[0,90,270].indexOf(e)&&(this.player.updateOption({rotate:e}),this.resize())}hasLoaded(){return this.player.loaded}setKeepScreenOn(){this.player.updateOption({keepScreenOn:!0})}setFullscreen(e){const t=!!e;this.player.fullscreen!==t&&(this.player.fullscreen=t)}screenshot(e,t,i,o){return this.player.video.screenshot(e,t,i,o)}startRecord(e,t){return new Promise(((i,o)=>{this.player.playing?(this.player.startRecord(e,t),i()):o()}))}stopRecordAndSave(){this.player.recording&&this.player.stopRecordAndSave()}isPlaying(){return this.player.playing}isMute(){return!this.player.audio||this.player.audio.isMute}isRecording(){return this.player.recorder.recording}}return r(it,"ERROR",x),r(it,"TIMEOUT",{loadingTimeout:T.loadingTimeout,delayTimeout:T.delayTimeout}),window.Jessibuca=it,it}));
diff --git a/src/player/index.js b/src/player/index.js
index 30b4ff4a..c09adbd6 100644
--- a/src/player/index.js
+++ b/src/player/index.js
@@ -310,12 +310,12 @@ export default class Player extends Emitter {
}
set recording(value) {
- if (this.playing) {
- if (value) {
+ if (value) {
+ if (this.playing) {
this.recorder.startRecord();
- } else {
- this.recorder.stopRecordAndSave();
}
+ } else {
+ this.recorder.stopRecordAndSave();
}
}
@@ -525,7 +525,6 @@ export default class Player extends Emitter {
this.mseDecoder = null;
}
-
this.clearCheckHeartTimeout();
this.clearCheckLoadingTimeout();
this.playing = false;
@@ -533,6 +532,7 @@ export default class Player extends Emitter {
this.recording = false;
// release audio buffer
this.audio && this.audio.pause();
+ this.video && this.video.pause();
// release lock
this.releaseWakeLock();
// reset stats
diff --git a/src/recorder/recordRTCLoader.js b/src/recorder/recordRTCLoader.js
index b7bea6fd..afda0cb5 100644
--- a/src/recorder/recordRTCLoader.js
+++ b/src/recorder/recordRTCLoader.js
@@ -68,7 +68,7 @@ export default class RecordRTCLoader extends Emitter {
}
if (this.recorder) {
this.isRecording = true;
- this.emit(EVENTS.recording, true);
+ this.player.emit(EVENTS.recording, true);
this.recorder.startRecording();
debug.log('Recorder', 'start recording');
this.player.emit(EVENTS.recordStart);
@@ -88,7 +88,7 @@ export default class RecordRTCLoader extends Emitter {
this.player.emit(EVENTS.recordEnd)
downloadRecord(this.recorder.getBlob(), this.fileName, this.fileType);
this._reset();
- this.emit(EVENTS.recording, false);
+ this.player.emit(EVENTS.recording, false);
})
}
diff --git a/src/video/commonLoader.js b/src/video/commonLoader.js
index ed977841..89cd2a5c 100644
--- a/src/video/commonLoader.js
+++ b/src/video/commonLoader.js
@@ -31,4 +31,8 @@ export default class CommonLoader extends Emitter {
play(){
}
+
+ pause() {
+
+ }
}
diff --git a/src/video/videoLoader.js b/src/video/videoLoader.js
index b8212f02..903a8c92 100644
--- a/src/video/videoLoader.js
+++ b/src/video/videoLoader.js
@@ -123,7 +123,6 @@ export default class VideoLoader extends CommonLoader {
}
}
-
resize() {
let width = this.player.width;
let height = this.player.height;