From c76e4c340c60b974b02f1ca1e62533382c93d506 Mon Sep 17 00:00:00 2001 From: Jeremy West Date: Thu, 27 Jun 2013 09:38:44 -0500 Subject: [PATCH 1/2] added RTMP support. fixes #559 --- src/js/media/flash.js | 74 ++++++++++++++++++++++++++++++++++++++---- src/swf/video-js.swf | Bin 14059 -> 14329 bytes 2 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/js/media/flash.js b/src/js/media/flash.js index 4d0e5c017c..09aa105c72 100644 --- a/src/js/media/flash.js +++ b/src/js/media/flash.js @@ -64,7 +64,14 @@ vjs.Flash = vjs.MediaTechController.extend({ // If source was supplied pass as a flash var. if (source) { - flashVars['src'] = encodeURIComponent(vjs.getAbsoluteURL(source.src)); + if (source.type && vjs.Flash.isStreamingType(source.type)) { + var parts = vjs.Flash.streamToParts(source.src); + flashVars['rtmpConnection'] = encodeURIComponent(parts.connection); + flashVars['rtmpStream'] = encodeURIComponent(parts.stream); + } + else { + flashVars['src'] = encodeURIComponent(vjs.getAbsoluteURL(source.src)); + } } // Add placeholder to player div @@ -227,10 +234,16 @@ vjs.Flash.prototype.pause = function(){ }; vjs.Flash.prototype.src = function(src){ - // Make sure source URL is abosolute. - src = vjs.getAbsoluteURL(src); - - this.el_.vjs_src(src); + if (vjs.Flash.isStreamingSrc(src)) { + src = vjs.Flash.streamToParts(src); + this.setRtmpConnection(src.connection); + this.setRtmpStream(src.stream); + } + else { + // Make sure source URL is abosolute. + src = vjs.getAbsoluteURL(src); + this.el_.vjs_src(src); + } // Currently the SWF doesn't autoplay if you load a source later. // e.g. Load player w/ no source, wait 2s, set src. @@ -240,6 +253,20 @@ vjs.Flash.prototype.src = function(src){ } }; +vjs.Flash.prototype.currentSrc = function(){ + var src = this.el_.vjs_getProperty("currentSrc"); + // no src, check and see if RTMP + if (src == null) { + var connection = this.rtmpConnection(), + stream = this.rtmpStream(); + + if (connection && stream) { + src = vjs.Flash.streamFromParts(connection, stream); + } + } + return src; +}; + vjs.Flash.prototype.load = function(){ this.el_.vjs_load(); }; @@ -304,7 +331,7 @@ vjs.Flash.isSupported = function(){ }; vjs.Flash.canPlaySource = function(srcObj){ - if (srcObj.type in vjs.Flash.formats) { return 'maybe'; } + if (srcObj.type in vjs.Flash.formats || srcObj.type in vjs.Flash.streamingFormats) { return 'maybe'; } }; vjs.Flash.formats = { @@ -314,6 +341,11 @@ vjs.Flash.formats = { 'video/m4v': 'MP4' }; +vjs.Flash.streamingFormats = { + 'rtmp/mp4': 'MP4', + 'rtmp/flv': 'FLV' +}; + vjs.Flash['onReady'] = function(currSwf){ var el = vjs.el(currSwf); @@ -357,6 +389,11 @@ vjs.Flash.checkReady = function(tech){ // Trigger events from the swf on the player vjs.Flash['onEvent'] = function(swfID, eventName){ var player = vjs.el(swfID)['player']; + // ugly, but it smooths over progress and + // time control manual timer issues + if (eventName === "ended") { + player.trigger("timeupdate"); + } player.trigger(eventName); }; @@ -453,3 +490,28 @@ vjs.Flash.getEmbedCode = function(swf, flashVars, params, attributes){ return objTag + attrsString + '>' + paramsString + ''; }; + +vjs.Flash.streamFromParts = function(connection, stream) { + return connection + "," + stream; +}; + +vjs.Flash.streamToParts = function(src) { + var parts = { + connection: '', + stream: '' + }; + if (src && src.indexOf(",") !== -1) { + src = src.split(","); + parts.connection = src[0]; + parts.stream = src[1]; + } + return parts; +}; + +vjs.Flash.isStreamingType = function(srcType) { + return srcType in vjs.Flash.streamingFormats; +}; + +vjs.Flash.isStreamingSrc = function(src) { + return src && src.indexOf(",") !== -1; +}; \ No newline at end of file diff --git a/src/swf/video-js.swf b/src/swf/video-js.swf index 61a6e347f1163a96ecbdee58077eaa3e3484bfa8..d15fbc3f141003f05a6da2dbae118705e19827c9 100644 GIT binary patch literal 14329 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 literal 14059 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 From 48039399c13653ebea202952dbaa8071f994a35d Mon Sep 17 00:00:00 2001 From: Brian Deitte Date: Thu, 11 Jul 2013 16:55:49 -0400 Subject: [PATCH 2/2] More changes for RTMP support. Switch the connection delimiter to & and allow for it to be missing. Add unit tests for changes. Add in the latest video SWF. --- src/js/media/flash.js | 29 ++++++++++++++++++++++++----- src/swf/video-js.swf | Bin 14329 -> 14382 bytes test/index.html | 3 ++- test/unit/flash.js | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 test/unit/flash.js diff --git a/src/js/media/flash.js b/src/js/media/flash.js index 09aa105c72..0b620c65f4 100644 --- a/src/js/media/flash.js +++ b/src/js/media/flash.js @@ -492,7 +492,7 @@ vjs.Flash.getEmbedCode = function(swf, flashVars, params, attributes){ }; vjs.Flash.streamFromParts = function(connection, stream) { - return connection + "," + stream; + return connection + "&" + stream; }; vjs.Flash.streamToParts = function(src) { @@ -500,11 +500,30 @@ vjs.Flash.streamToParts = function(src) { connection: '', stream: '' }; - if (src && src.indexOf(",") !== -1) { - src = src.split(","); - parts.connection = src[0]; - parts.stream = src[1]; + + if (! src) { + return parts; + } + + // Look for the normal URL separator we expect, '&'. + // If found, we split the URL into two pieces around the + // first '&'. + var connEnd = src.indexOf('&'); + var streamBegin; + if (connEnd !== -1) { + streamBegin = connEnd + 1; } + else { + // If there's not a '&', we use the last '/' as the delimiter. + connEnd = streamBegin = src.lastIndexOf('/') + 1; + if (connEnd === 0) { + // really, there's not a '/'? + connEnd = streamBegin = src.length; + } + } + parts.connection = src.substring(0, connEnd); + parts.stream = src.substring(streamBegin, src.length); + return parts; }; diff --git a/src/swf/video-js.swf b/src/swf/video-js.swf index d15fbc3f141003f05a6da2dbae118705e19827c9..7e071c56507da5d9972a6fa0662322eaf9571850 100644 GIT binary patch literal 14382 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 diff --git a/test/index.html b/test/index.html index 29ae4b15d0..592ce0ceea 100644 --- a/test/index.html +++ b/test/index.html @@ -29,7 +29,8 @@ 'test/unit/core.js', 'test/unit/media.html5.js', 'test/unit/controls.js', - 'test/unit/plugins.js' + 'test/unit/plugins.js', + 'test/unit/flash.js' ]; var projectRoot = '../'; diff --git a/test/unit/flash.js b/test/unit/flash.js new file mode 100644 index 0000000000..e3d8b0dd20 --- /dev/null +++ b/test/unit/flash.js @@ -0,0 +1,34 @@ +module('Flash'); + +var streamToPartsAndBack = function(url) { + var parts = vjs.Flash.streamToParts(url); + return vjs.Flash.streamFromParts(parts.connection, parts.stream); +}; + +test('test using both streamToParts and streamFromParts', function() { + ok('rtmp://myurl.com/&isthis' === streamToPartsAndBack('rtmp://myurl.com/isthis')); + ok('rtmp://myurl.com/&isthis' === streamToPartsAndBack('rtmp://myurl.com/&isthis')); + ok('rtmp://myurl.com/isthis/&andthis' === streamToPartsAndBack('rtmp://myurl.com/isthis/andthis')); +}); + +test('test streamToParts', function() { + var parts = vjs.Flash.streamToParts('http://myurl.com/streaming&/is/fun'); + ok(parts.connection === 'http://myurl.com/streaming'); + ok(parts.stream === '/is/fun'); + + parts = vjs.Flash.streamToParts('http://myurl.com/&streaming&/is/fun'); + ok(parts.connection === 'http://myurl.com/'); + ok(parts.stream === 'streaming&/is/fun'); + + parts = vjs.Flash.streamToParts('http://myurl.com/streaming/is/fun'); + ok(parts.connection === 'http://myurl.com/streaming/is/'); + ok(parts.stream === 'fun'); + + parts = vjs.Flash.streamToParts('whatisgoingonhere'); + ok(parts.connection === 'whatisgoingonhere'); + ok(parts.stream === ''); + + parts = vjs.Flash.streamToParts(); + ok(parts.connection === ''); + ok(parts.stream === ''); +});