initial plugin->tech conversion
Showing
11 changed files
with
185 additions
and
165 deletions
... | @@ -7,7 +7,7 @@ | ... | @@ -7,7 +7,7 @@ |
7 | <link href="node_modules/video.js/dist/video-js/video-js.css" rel="stylesheet"> | 7 | <link href="node_modules/video.js/dist/video-js/video-js.css" rel="stylesheet"> |
8 | 8 | ||
9 | <!-- video.js --> | 9 | <!-- video.js --> |
10 | <script src="node_modules/video.js/dist/video-js/video.js"></script> | 10 | <script src="node_modules/video.js/dist/video-js/video.dev.js"></script> |
11 | 11 | ||
12 | <!-- Media Sources plugin --> | 12 | <!-- Media Sources plugin --> |
13 | <script src="node_modules/videojs-contrib-media-sources/src/videojs-media-sources.js"></script> | 13 | <script src="node_modules/videojs-contrib-media-sources/src/videojs-media-sources.js"></script> |
... | @@ -31,7 +31,7 @@ | ... | @@ -31,7 +31,7 @@ |
31 | <!-- bipbop --> | 31 | <!-- bipbop --> |
32 | <!-- <script src="test/tsSegment.js"></script> --> | 32 | <!-- <script src="test/tsSegment.js"></script> --> |
33 | <!-- bunnies --> | 33 | <!-- bunnies --> |
34 | <script src="test/tsSegment-bc.js"></script> | 34 | <!--<script src="test/tsSegment-bc.js"></script>--> |
35 | 35 | ||
36 | <style> | 36 | <style> |
37 | body { | 37 | body { |
... | @@ -63,10 +63,12 @@ | ... | @@ -63,10 +63,12 @@ |
63 | <script> | 63 | <script> |
64 | videojs.options.flash.swf = 'node_modules/video.js/dist/video-js/video-js.swf'; | 64 | videojs.options.flash.swf = 'node_modules/video.js/dist/video-js/video-js.swf'; |
65 | // initialize the player | 65 | // initialize the player |
66 | var player = videojs('video'); | 66 | var player = videojs('video', { |
67 | techOrder: ['hls'] | ||
68 | }); | ||
67 | 69 | ||
68 | // initialize the plugin | 70 | // initialize the plugin |
69 | player.hls(); | 71 | //player.hls() |
70 | </script> | 72 | </script> |
71 | </body> | 73 | </body> |
72 | </html> | 74 | </html> | ... | ... |
... | @@ -8,7 +8,7 @@ | ... | @@ -8,7 +8,7 @@ |
8 | 8 | ||
9 | (function(window) { | 9 | (function(window) { |
10 | var | 10 | var |
11 | FlvTag = window.videojs.hls.FlvTag, | 11 | FlvTag = window.videojs.Hls.FlvTag, |
12 | adtsSampleingRates = [ | 12 | adtsSampleingRates = [ |
13 | 96000, 88200, | 13 | 96000, 88200, |
14 | 64000, 48000, | 14 | 64000, 48000, |
... | @@ -17,7 +17,7 @@ var | ... | @@ -17,7 +17,7 @@ var |
17 | 16000, 12000 | 17 | 16000, 12000 |
18 | ]; | 18 | ]; |
19 | 19 | ||
20 | window.videojs.hls.AacStream = function() { | 20 | window.videojs.Hls.AacStream = function() { |
21 | var | 21 | var |
22 | next_pts, // :uint | 22 | next_pts, // :uint |
23 | pts_offset, // :int | 23 | pts_offset, // :int | ... | ... |
... | @@ -4,7 +4,7 @@ | ... | @@ -4,7 +4,7 @@ |
4 | * Parser for exponential Golomb codes, a variable-bitwidth number encoding | 4 | * Parser for exponential Golomb codes, a variable-bitwidth number encoding |
5 | * scheme used by h264. | 5 | * scheme used by h264. |
6 | */ | 6 | */ |
7 | window.videojs.hls.ExpGolomb = function(workingData) { | 7 | window.videojs.Hls.ExpGolomb = function(workingData) { |
8 | var | 8 | var |
9 | // the number of bytes left to examine in workingData | 9 | // the number of bytes left to examine in workingData |
10 | workingBytesAvailable = workingData.byteLength, | 10 | workingBytesAvailable = workingData.byteLength, | ... | ... |
1 | (function(window) { | 1 | (function(window) { |
2 | 2 | ||
3 | window.videojs = window.videojs || {}; | 3 | window.videojs = window.videojs || {}; |
4 | window.videojs.hls = window.videojs.hls || {}; | 4 | window.videojs.Hls = window.videojs.Hls || {}; |
5 | 5 | ||
6 | var hls = window.videojs.hls; | 6 | var hls = window.videojs.Hls; |
7 | 7 | ||
8 | // (type:uint, extraData:Boolean = false) extends ByteArray | 8 | // (type:uint, extraData:Boolean = false) extends ByteArray |
9 | hls.FlvTag = function(type, extraData) { | 9 | hls.FlvTag = function(type, extraData) { | ... | ... |
... | @@ -8,8 +8,8 @@ | ... | @@ -8,8 +8,8 @@ |
8 | 8 | ||
9 | (function(window) { | 9 | (function(window) { |
10 | var | 10 | var |
11 | ExpGolomb = window.videojs.hls.ExpGolomb, | 11 | ExpGolomb = window.videojs.Hls.ExpGolomb, |
12 | FlvTag = window.videojs.hls.FlvTag, | 12 | FlvTag = window.videojs.Hls.FlvTag, |
13 | 13 | ||
14 | H264ExtraData = function() { | 14 | H264ExtraData = function() { |
15 | this.sps = []; // :Array | 15 | this.sps = []; // :Array |
... | @@ -234,7 +234,7 @@ | ... | @@ -234,7 +234,7 @@ |
234 | * an h264 stream. Exactly one byte. | 234 | * an h264 stream. Exactly one byte. |
235 | */ | 235 | */ |
236 | // incomplete, see Table 7.1 of ITU-T H.264 for 12-32 | 236 | // incomplete, see Table 7.1 of ITU-T H.264 for 12-32 |
237 | window.videojs.hls.NALUnitType = NALUnitType = { | 237 | window.videojs.Hls.NALUnitType = NALUnitType = { |
238 | unspecified: 0, | 238 | unspecified: 0, |
239 | slice_layer_without_partitioning_rbsp_non_idr: 1, | 239 | slice_layer_without_partitioning_rbsp_non_idr: 1, |
240 | slice_data_partition_a_layer_rbsp: 2, | 240 | slice_data_partition_a_layer_rbsp: 2, |
... | @@ -249,7 +249,7 @@ | ... | @@ -249,7 +249,7 @@ |
249 | end_of_stream_rbsp: 11 | 249 | end_of_stream_rbsp: 11 |
250 | }; | 250 | }; |
251 | 251 | ||
252 | window.videojs.hls.H264Stream = function() { | 252 | window.videojs.Hls.H264Stream = function() { |
253 | var | 253 | var |
254 | next_pts, // :uint; | 254 | next_pts, // :uint; |
255 | next_dts, // :uint; | 255 | next_dts, // :uint; | ... | ... |
... | @@ -5,8 +5,8 @@ | ... | @@ -5,8 +5,8 @@ |
5 | (function(window, videojs) { | 5 | (function(window, videojs) { |
6 | 'use strict'; | 6 | 'use strict'; |
7 | var | 7 | var |
8 | resolveUrl = videojs.hls.resolveUrl, | 8 | resolveUrl = videojs.Hls.resolveUrl, |
9 | xhr = videojs.hls.xhr, | 9 | xhr = videojs.Hls.xhr, |
10 | 10 | ||
11 | /** | 11 | /** |
12 | * Returns a new master playlist that is the result of merging an | 12 | * Returns a new master playlist that is the result of merging an |
... | @@ -231,7 +231,7 @@ | ... | @@ -231,7 +231,7 @@ |
231 | return loader.trigger('loadedmetadata'); | 231 | return loader.trigger('loadedmetadata'); |
232 | }); | 232 | }); |
233 | }; | 233 | }; |
234 | PlaylistLoader.prototype = new videojs.hls.Stream(); | 234 | PlaylistLoader.prototype = new videojs.Hls.Stream(); |
235 | 235 | ||
236 | videojs.hls.PlaylistLoader = PlaylistLoader; | 236 | videojs.Hls.PlaylistLoader = PlaylistLoader; |
237 | })(window, window.videojs); | 237 | })(window, window.videojs); | ... | ... |
1 | (function(window) { | 1 | (function(window) { |
2 | var | 2 | var |
3 | videojs = window.videojs, | 3 | videojs = window.videojs, |
4 | FlvTag = videojs.hls.FlvTag, | 4 | FlvTag = videojs.Hls.FlvTag, |
5 | H264Stream = videojs.hls.H264Stream, | 5 | H264Stream = videojs.Hls.H264Stream, |
6 | AacStream = videojs.hls.AacStream, | 6 | AacStream = videojs.Hls.AacStream, |
7 | MP2T_PACKET_LENGTH, | 7 | MP2T_PACKET_LENGTH, |
8 | STREAM_TYPES; | 8 | STREAM_TYPES; |
9 | 9 | ||
... | @@ -11,7 +11,7 @@ | ... | @@ -11,7 +11,7 @@ |
11 | * An object that incrementally transmuxes MPEG2 Trasport Stream | 11 | * An object that incrementally transmuxes MPEG2 Trasport Stream |
12 | * chunks into an FLV. | 12 | * chunks into an FLV. |
13 | */ | 13 | */ |
14 | videojs.hls.SegmentParser = function() { | 14 | videojs.Hls.SegmentParser = function() { |
15 | var | 15 | var |
16 | self = this, | 16 | self = this, |
17 | parseTSPacket, | 17 | parseTSPacket, |
... | @@ -432,8 +432,8 @@ | ... | @@ -432,8 +432,8 @@ |
432 | }; | 432 | }; |
433 | 433 | ||
434 | // MPEG2-TS constants | 434 | // MPEG2-TS constants |
435 | videojs.hls.SegmentParser.MP2T_PACKET_LENGTH = MP2T_PACKET_LENGTH = 188; | 435 | videojs.Hls.SegmentParser.MP2T_PACKET_LENGTH = MP2T_PACKET_LENGTH = 188; |
436 | videojs.hls.SegmentParser.STREAM_TYPES = STREAM_TYPES = { | 436 | videojs.Hls.SegmentParser.STREAM_TYPES = STREAM_TYPES = { |
437 | h264: 0x1b, | 437 | h264: 0x1b, |
438 | adts: 0x0f | 438 | adts: 0x0f |
439 | }; | 439 | }; | ... | ... |
... | @@ -8,28 +8,6 @@ | ... | @@ -8,28 +8,6 @@ |
8 | 8 | ||
9 | (function(window, videojs, document, undefined) { | 9 | (function(window, videojs, document, undefined) { |
10 | 10 | ||
11 | videojs.hls = { | ||
12 | /** | ||
13 | * Whether the browser has built-in HLS support. | ||
14 | */ | ||
15 | supportsNativeHls: (function() { | ||
16 | var | ||
17 | video = document.createElement('video'), | ||
18 | xMpegUrl, | ||
19 | vndMpeg; | ||
20 | |||
21 | // native HLS is definitely not supported if HTML5 video isn't | ||
22 | if (!videojs.Html5.isSupported()) { | ||
23 | return false; | ||
24 | } | ||
25 | |||
26 | xMpegUrl = video.canPlayType('application/x-mpegURL'); | ||
27 | vndMpeg = video.canPlayType('application/vnd.apple.mpegURL'); | ||
28 | return (/probably|maybe/).test(xMpegUrl) || | ||
29 | (/probably|maybe/).test(vndMpeg); | ||
30 | })() | ||
31 | }; | ||
32 | |||
33 | var | 11 | var |
34 | 12 | ||
35 | // the desired length of video to maintain in the buffer, in seconds | 13 | // the desired length of video to maintain in the buffer, in seconds |
... | @@ -95,60 +73,7 @@ var | ... | @@ -95,60 +73,7 @@ var |
95 | } | 73 | } |
96 | }, | 74 | }, |
97 | 75 | ||
98 | /** | 76 | xhr, |
99 | * Creates and sends an XMLHttpRequest. | ||
100 | * @param options {string | object} if this argument is a string, it | ||
101 | * is intrepreted as a URL and a simple GET request is | ||
102 | * inititated. If it is an object, it should contain a `url` | ||
103 | * property that indicates the URL to request and optionally a | ||
104 | * `method` which is the type of HTTP request to send. | ||
105 | * @param callback (optional) {function} a function to call when the | ||
106 | * request completes. If the request was not successful, the first | ||
107 | * argument will be falsey. | ||
108 | * @return {object} the XMLHttpRequest that was initiated. | ||
109 | */ | ||
110 | xhr = videojs.hls.xhr = function(url, callback) { | ||
111 | var | ||
112 | options = { | ||
113 | method: 'GET' | ||
114 | }, | ||
115 | request; | ||
116 | |||
117 | if (typeof callback !== 'function') { | ||
118 | callback = function() {}; | ||
119 | } | ||
120 | |||
121 | if (typeof url === 'object') { | ||
122 | options = videojs.util.mergeOptions(options, url); | ||
123 | url = options.url; | ||
124 | } | ||
125 | |||
126 | request = new window.XMLHttpRequest(); | ||
127 | request.open(options.method, url); | ||
128 | |||
129 | if (options.responseType) { | ||
130 | request.responseType = options.responseType; | ||
131 | } | ||
132 | if (options.withCredentials) { | ||
133 | request.withCredentials = true; | ||
134 | } | ||
135 | |||
136 | request.onreadystatechange = function() { | ||
137 | // wait until the request completes | ||
138 | if (this.readyState !== 4) { | ||
139 | return; | ||
140 | } | ||
141 | |||
142 | // request error | ||
143 | if (this.status >= 400 || this.status === 0) { | ||
144 | return callback.call(this, true, url); | ||
145 | } | ||
146 | |||
147 | return callback.call(this, false, url); | ||
148 | }; | ||
149 | request.send(null); | ||
150 | return request; | ||
151 | }, | ||
152 | 77 | ||
153 | /** | 78 | /** |
154 | * TODO - Document this great feature. | 79 | * TODO - Document this great feature. |
... | @@ -247,44 +172,7 @@ var | ... | @@ -247,44 +172,7 @@ var |
247 | return duration; | 172 | return duration; |
248 | }, | 173 | }, |
249 | 174 | ||
250 | /** | 175 | resolveUrl, |
251 | * Constructs a new URI by interpreting a path relative to another | ||
252 | * URI. | ||
253 | * @param basePath {string} a relative or absolute URI | ||
254 | * @param path {string} a path part to combine with the base | ||
255 | * @return {string} a URI that is equivalent to composing `base` | ||
256 | * with `path` | ||
257 | * @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue | ||
258 | */ | ||
259 | resolveUrl = videojs.hls.resolveUrl = function(basePath, path) { | ||
260 | // use the base element to get the browser to handle URI resolution | ||
261 | var | ||
262 | oldBase = document.querySelector('base'), | ||
263 | docHead = document.querySelector('head'), | ||
264 | a = document.createElement('a'), | ||
265 | base = oldBase, | ||
266 | oldHref, | ||
267 | result; | ||
268 | |||
269 | // prep the document | ||
270 | if (oldBase) { | ||
271 | oldHref = oldBase.href; | ||
272 | } else { | ||
273 | base = docHead.appendChild(document.createElement('base')); | ||
274 | } | ||
275 | |||
276 | base.href = basePath; | ||
277 | a.href = path; | ||
278 | result = a.href; | ||
279 | |||
280 | // clean up | ||
281 | if (oldBase) { | ||
282 | oldBase.href = oldHref; | ||
283 | } else { | ||
284 | docHead.removeChild(base); | ||
285 | } | ||
286 | return result; | ||
287 | }, | ||
288 | 176 | ||
289 | /** | 177 | /** |
290 | * Initializes the HLS plugin. | 178 | * Initializes the HLS plugin. |
... | @@ -293,7 +181,7 @@ var | ... | @@ -293,7 +181,7 @@ var |
293 | init = function(options) { | 181 | init = function(options) { |
294 | var | 182 | var |
295 | mediaSource = new videojs.MediaSource(), | 183 | mediaSource = new videojs.MediaSource(), |
296 | segmentParser = new videojs.hls.SegmentParser(), | 184 | segmentParser = new videojs.Hls.SegmentParser(), |
297 | player = this, | 185 | player = this, |
298 | srcUrl, | 186 | srcUrl, |
299 | 187 | ||
... | @@ -303,7 +191,7 @@ var | ... | @@ -303,7 +191,7 @@ var |
303 | updateDuration; | 191 | updateDuration; |
304 | 192 | ||
305 | // if the video element supports HLS natively, do nothing | 193 | // if the video element supports HLS natively, do nothing |
306 | if (videojs.hls.supportsNativeHls) { | 194 | if (videojs.Hls.supportsNativeHls) { |
307 | return; | 195 | return; |
308 | } | 196 | } |
309 | 197 | ||
... | @@ -346,13 +234,13 @@ var | ... | @@ -346,13 +234,13 @@ var |
346 | } | 234 | } |
347 | 235 | ||
348 | // do nothing if the source is handled by one of the standard techs | 236 | // do nothing if the source is handled by one of the standard techs |
349 | for (j in player.options().techOrder) { | 237 | //for (j in player.options().techOrder) { |
350 | techName = player.options().techOrder[j]; | 238 | //techname = player.options().techorder[j]; |
351 | techName = techName[0].toUpperCase() + techName.substring(1); | 239 | //techname = techname[0].touppercase() + techname.substring(1); |
352 | if (videojs[techName].canPlaySource({ type: sources[i].type })) { | 240 | //if (videojs[techname].canplaysource({ type: sources[i].type })) { |
353 | return; | 241 | //return; |
354 | } | 242 | //} |
355 | } | 243 | //} |
356 | 244 | ||
357 | // use the plugin if the MIME type specifies HLS | 245 | // use the plugin if the MIME type specifies HLS |
358 | if ((/application\/x-mpegURL/).test(sources[i].type) || | 246 | if ((/application\/x-mpegURL/).test(sources[i].type) || |
... | @@ -638,28 +526,158 @@ var | ... | @@ -638,28 +526,158 @@ var |
638 | oldMediaPlaylist = updatedPlaylist; | 526 | oldMediaPlaylist = updatedPlaylist; |
639 | }); | 527 | }); |
640 | }); | 528 | }); |
641 | player.src([{ | ||
642 | src: videojs.URL.createObjectURL(mediaSource), | ||
643 | type: "video/flv" | ||
644 | }]); | ||
645 | 529 | ||
646 | if (player.options().autoplay) { | 530 | //player.src([{ |
647 | player.play(); | 531 | //src: videojs.URL.createObjectURL(mediaSource), |
648 | } | 532 | //type: "video/flv" |
533 | //}]); | ||
534 | |||
535 | //if (player.options().autoplay) { | ||
536 | //player.play(); | ||
537 | //} | ||
649 | }; | 538 | }; |
650 | 539 | ||
651 | videojs.plugin('hls', function() { | 540 | var mpegurlRE = /^application\/(?:x-|vnd\.apple\.)mpegurl/i; |
652 | if (typeof Uint8Array === 'undefined') { | 541 | |
542 | videojs.Hls = videojs.Flash.extend({ | ||
543 | init: function(player, options, ready) { | ||
544 | videojs.Flash.call(this, player, options, ready); | ||
545 | player.hls = {}; | ||
546 | this.ready(function() { | ||
547 | console.log('ready!'); | ||
548 | //init.call(player, options); | ||
549 | }); | ||
550 | } | ||
551 | }); | ||
552 | |||
553 | //for (var prop in videojs.Flash) { | ||
554 | //videojs.Hls[prop] = videojs.Flash[prop]; | ||
555 | //} | ||
556 | //for (prop in videojs.Flash.prototype) { | ||
557 | //videojs.Hls.prototype[prop] = videojs.Flash[prop]; | ||
558 | //} | ||
559 | |||
560 | videojs.Hls.isSupported = function() { | ||
561 | return videojs.Flash.isSupported() && videojs.MediaSource; | ||
562 | } | ||
563 | |||
564 | videojs.Hls.canPlaySource = function(srcObj) { | ||
565 | return mpegurlRE.test(srcObj.type) || videojs.Flash.canPlaySource.call(this, srcObj); | ||
566 | }; | ||
567 | |||
568 | videojs.Hls.supportsNativeHls = (function() { | ||
569 | var | ||
570 | video = document.createElement('video'), | ||
571 | xMpegUrl, | ||
572 | vndMpeg; | ||
573 | |||
574 | // native HLS is definitely not supported if HTML5 video isn't | ||
575 | if (!videojs.Html5.isSupported()) { | ||
576 | return false; | ||
577 | } | ||
578 | |||
579 | xMpegUrl = video.canPlayType('application/x-mpegURL'); | ||
580 | vndMpeg = video.canPlayType('application/vnd.apple.mpegURL'); | ||
581 | return (/probably|maybe/).test(xMpegUrl) || | ||
582 | (/probably|maybe/).test(vndMpeg); | ||
583 | })(); | ||
584 | |||
585 | /** | ||
586 | * Creates and sends an XMLHttpRequest. | ||
587 | * @param options {string | object} if this argument is a string, it | ||
588 | * is intrepreted as a URL and a simple GET request is | ||
589 | * inititated. If it is an object, it should contain a `url` | ||
590 | * property that indicates the URL to request and optionally a | ||
591 | * `method` which is the type of HTTP request to send. | ||
592 | * @param callback (optional) {function} a function to call when the | ||
593 | * request completes. If the request was not successful, the first | ||
594 | * argument will be falsey. | ||
595 | * @return {object} the XMLHttpRequest that was initiated. | ||
596 | */ | ||
597 | xhr = videojs.Hls.xhr = function(url, callback) { | ||
598 | var | ||
599 | options = { | ||
600 | method: 'GET' | ||
601 | }, | ||
602 | request; | ||
603 | |||
604 | if (typeof callback !== 'function') { | ||
605 | callback = function() {}; | ||
606 | } | ||
607 | |||
608 | if (typeof url === 'object') { | ||
609 | options = videojs.util.mergeOptions(options, url); | ||
610 | url = options.url; | ||
611 | } | ||
612 | |||
613 | request = new window.XMLHttpRequest(); | ||
614 | request.open(options.method, url); | ||
615 | |||
616 | if (options.responseType) { | ||
617 | request.responseType = options.responseType; | ||
618 | } | ||
619 | if (options.withCredentials) { | ||
620 | request.withCredentials = true; | ||
621 | } | ||
622 | |||
623 | request.onreadystatechange = function() { | ||
624 | // wait until the request completes | ||
625 | if (this.readyState !== 4) { | ||
653 | return; | 626 | return; |
654 | } | 627 | } |
655 | 628 | ||
656 | var initialize = function() { | 629 | // request error |
657 | return function() { | 630 | if (this.status >= 400 || this.status === 0) { |
658 | this.hls = initialize(); | 631 | return callback.call(this, true, url); |
659 | init.apply(this, arguments); | 632 | } |
660 | }; | 633 | |
634 | return callback.call(this, false, url); | ||
661 | }; | 635 | }; |
662 | initialize().apply(this, arguments); | 636 | request.send(null); |
663 | }); | 637 | return request; |
638 | }; | ||
639 | |||
640 | /** | ||
641 | * Constructs a new URI by interpreting a path relative to another | ||
642 | * URI. | ||
643 | * @param basePath {string} a relative or absolute URI | ||
644 | * @param path {string} a path part to combine with the base | ||
645 | * @return {string} a URI that is equivalent to composing `base` | ||
646 | * with `path` | ||
647 | * @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue | ||
648 | */ | ||
649 | resolveUrl = videojs.Hls.resolveUrl = function(basePath, path) { | ||
650 | // use the base element to get the browser to handle URI resolution | ||
651 | var | ||
652 | oldBase = document.querySelector('base'), | ||
653 | docHead = document.querySelector('head'), | ||
654 | a = document.createElement('a'), | ||
655 | base = oldBase, | ||
656 | oldHref, | ||
657 | result; | ||
658 | |||
659 | // prep the document | ||
660 | if (oldBase) { | ||
661 | oldHref = oldBase.href; | ||
662 | } else { | ||
663 | base = docHead.appendChild(document.createElement('base')); | ||
664 | } | ||
665 | |||
666 | base.href = basePath; | ||
667 | a.href = path; | ||
668 | result = a.href; | ||
669 | |||
670 | // clean up | ||
671 | if (oldBase) { | ||
672 | oldBase.href = oldHref; | ||
673 | } else { | ||
674 | docHead.removeChild(base); | ||
675 | } | ||
676 | return result; | ||
677 | }; | ||
678 | |||
679 | //videojs.Hls.onReady = videojs.Flash.onReady; | ||
680 | //videojs.Hls.onEvent = videojs.Flash.onEvent; | ||
681 | //videojs.Hls.onError = videojs.Flash.onError; | ||
664 | 682 | ||
665 | })(window, window.videojs, document); | 683 | })(window, window.videojs, document); | ... | ... |
-
Please register or sign in to post a comment