From 065cbbe4aa25ec5c554ec714a70182497d65b723 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 21 Dec 2013 01:04:29 +0800 Subject: [PATCH] add fullscreen event and rescale --- trunk/research/players/img/tooltip.png | Bin 0 -> 783 bytes trunk/research/players/js/srs.js | 154 ++++++++++ trunk/research/players/srs_player.html | 282 +++++++----------- .../players/srs_player/release/srs_player.swf | Bin 3443 -> 4709 bytes .../players/srs_player/src/srs_player.as | 274 ++++++++++++++--- 5 files changed, 485 insertions(+), 225 deletions(-) create mode 100644 trunk/research/players/img/tooltip.png diff --git a/trunk/research/players/img/tooltip.png b/trunk/research/players/img/tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..eaee2aebc03a3c16b46da3b0f3b15d81f5a7709d GIT binary patch literal 783 zcmV+q1MvKbP)kuzP_D z!vCXzqeqXz*>~^W{Q`2cDgzp@va*7+1qB7!K#E#`K5c^r0}6QZ5>DGeFo(48ki$Np#%!# zA3uJ8`A{D-Fq}Vs{sX%2wr$%6X9EqXXZZE&*I#4>GiT03(Ev&WOphKt`iAVIw6rvI zPu^y_cJ101WRbIH&%)V%|NaGqO9MDsPM$pZ?mrf=Y15|XAcup4;OWz+LLdP-IXO;X zq_P6j)VH^9-%bPtG)NvGz>otI1muA@4yZ6sT3VVzNJxmCmzNi8(C5#e|GaPp{*vJNP0R#Q6p`jtajEoE?0}%k|!ta+aU;h04`*(AoVGlqC$#8RX zpLKS27Db9Vcwhk2C!8%NCdT0C=!gFM#I8v+8x#>NaPDk@<1 z&!0aTw6(QSBVKI8Z?dN;^RO9;OhMjsRl+0wh|!dzAnH N002ovPDHLkV1mJQQ8)kq literal 0 HcmV?d00001 diff --git a/trunk/research/players/js/srs.js b/trunk/research/players/js/srs.js index 47b9bcf7c..13b3acc0e 100755 --- a/trunk/research/players/js/srs.js +++ b/trunk/research/players/js/srs.js @@ -1,3 +1,6 @@ +/** +* update the navigator, add same query string. +*/ function update_nav() { $("#nav_srs_player").attr("href", "srs_player.html" + window.location.search); $("#nav_srs_publisher").attr("href", "srs_publisher.html" + window.location.search); @@ -7,6 +10,9 @@ function update_nav() { $("#nav_vlc").attr("href", "vlc.html" + window.location.search); } +/** +* parse the query string to object. +*/ function parse_query_string(){ var query_string = String(window.location.search).replace(" ", "").split("?")[1]; if(query_string == undefined){ @@ -60,6 +66,11 @@ function build_default_hls_url() { return "http://" + vhost + ":" + port + "/" + app + "/" + stream + ".m3u8"; } +/** +* initialize the page. +* @param rtmp_url the rtmp stream url to play +* @param hls_url the hls stream url to play +*/ function srs_init(rtmp_url, hls_url) { update_nav(); @@ -70,3 +81,146 @@ function srs_init(rtmp_url, hls_url) { $(hls_url).val(build_default_hls_url()); } } + +////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////// +/** +* the SrsPlayer object. +*/ +function SrsPlayer(container, stream_url, width, height, buffer_time) { + if (!SrsPlayer.__id) { + SrsPlayer.__id = 100; + } + if (!SrsPlayer.__players) { + SrsPlayer.__players = []; + } + + SrsPlayer.__players.push(this); + + this.container = container; + this.stream_url = stream_url; + this.width = width; + this.height = height; + this.buffer_time = buffer_time; + this.id = SrsPlayer.__id++; + this.callbackObj = null; + + // callback set the following values. + this.meatadata = {}; // for on_player_metadata +} +/** +* user can set some callback, then start the player. +* callbacks: +* on_player_ready():int, when srs player ready, user can play. +* on_player_metadata(metadata:Object):int, when srs player get metadata. +*/ +SrsPlayer.prototype.start = function() { + // embed the flash. + var flashvars = {}; + flashvars.id = this.id; + flashvars.on_player_ready = "__srs_on_player_ready"; + flashvars.on_player_metadata = "__srs_on_player_metadata"; + + var params = {}; + params.wmode = "opaque"; + params.allowFullScreen = "true"; + params.allowScriptAccess = "always"; + + var attributes = {}; + + var self = this; + + swfobject.embedSWF( + "srs_player/release/srs_player.swf", this.container, + this.width, this.height, + "11.1", "js/AdobeFlashPlayerInstall.swf", + flashvars, params, attributes, + function(callbackObj){ + self.callbackObj = callbackObj; + } + ); + + return this; +} +SrsPlayer.prototype.play = function() { + return this.callbackObj.ref.__play(this.stream_url, this.width, this.height, this.buffer_time); +} +SrsPlayer.prototype.stop = function() { + for (var i = 0; i < SrsPlayer.__players.length; i++) { + var player = SrsPlayer.__players[i]; + + if (player.id != this.id) { + continue; + } + + SrsPlayer.__players.splice(i, 1); + break; + } + return this.callbackObj.ref.__stop(); +} +SrsPlayer.prototype.pause = function() { + return this.callbackObj.ref.__pause(); +} +SrsPlayer.prototype.resume = function() { + return this.callbackObj.ref.__resume(); +} +/** +* to set the DAR, for example, DAR=16:9 +* @param num, for example, 9. +* use metadata height if 0. +* use user specified height if -1. +* @param den, for example, 16. +* use metadata width if 0. +* use user specified width if -1. +*/ +SrsPlayer.prototype.dar = function(num, den) { + return this.callbackObj.ref.__dar(num, den); +} +/** +* set the fullscreen size data. +* @refer the refer fullscreen mode. it can be: +* video: use video orignal size. +* screen: use screen size to rescale video. +* @param percent, the rescale percent, where +* 100 means 100%. +*/ +SrsPlayer.prototype.set_fs = function(refer, percent) { + return this.callbackObj.ref.__set_fs(refer, percent); +} +SrsPlayer.prototype.on_player_ready = function() { + return this.play(); +} +SrsPlayer.prototype.on_player_metadata = function(metadata) { + return 0; +} +function __srs_on_player_ready(id) { + for (var i = 0; i < SrsPlayer.__players.length; i++) { + var player = SrsPlayer.__players[i]; + + if (player.id != id) { + continue; + } + + return player.on_player_ready(); + } + + throw new Error("player not found. id=" + id); +} +function __srs_on_player_metadata(id, metadata) { + for (var i = 0; i < SrsPlayer.__players.length; i++) { + var player = SrsPlayer.__players[i]; + + if (player.id != id) { + continue; + } + + // user may override the on_player_metadata, + // so set the data before invoke it. + player.metadata = metadata; + + return player.on_player_metadata(metadata); + } + + throw new Error("player not found. id=" + id); +} diff --git a/trunk/research/players/srs_player.html b/trunk/research/players/srs_player.html index 988ae3ba4..2ec9c81ed 100755 --- a/trunk/research/players/srs_player.html +++ b/trunk/research/players/srs_player.html @@ -14,13 +14,30 @@ } @@ -278,17 +184,37 @@
diff --git a/trunk/research/players/srs_player/release/srs_player.swf b/trunk/research/players/srs_player/release/srs_player.swf index 69e20cfb17e935cb9f55d65932620f182611ad76..02f1ae84c6f91f85b0789fc6ad03b410a37b80a7 100755 GIT binary patch literal 4709 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 literal 3443 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 V2!ny 0 && den > 0 && this.video.width > 0) { - // set DAR. - // calc the height by DAR - var _height:int = this.w * num / den; - if (_height <= this.h) { - this.video.width = this.w; - this.video.height = _height; - } else { - // height overflow, calc the width by DAR - var _width:int = this.h * den / num; - - this.video.width = _width; - this.video.height = this.h; - } - - // align center. - this.video.y = (this.h - this.video.height) / 2; - this.video.x = (this.w - this.video.width) / 2; + private function on_user_click_video(evt:MouseEvent):void { + if (!this.stage.allowsFullScreen) { + trace("donot allow fullscreen."); + return; + } + + // enter fullscreen to get the fullscreen size correctly. + if (this.stage.displayState == StageDisplayState.FULL_SCREEN) { + this.stage.displayState = StageDisplayState.NORMAL; + } else { + this.stage.displayState = StageDisplayState.FULL_SCREEN; } - return 0; } - public function js_call_stop():int { + private function js_call_stop():int { if (this.stream) { this.stream.close(); this.stream = null; @@ -143,17 +193,24 @@ package return 0; } - public function js_call_play(url:String, _width:int, _height:int, _buffer_time:Number):int { + private function draw_black_background(_width:int, _height:int):void { + // draw black bg. + this.graphics.beginFill(0x00, 1.0); + this.graphics.drawRect(0, 0, _width, _height); + this.graphics.endFill(); + + // draw the fs mask. + this.fs_mask.graphics.beginFill(0xff0000, 0); + this.fs_mask.graphics.drawRect(0, 0, _width, _height); + this.fs_mask.graphics.endFill(); + } + + private function js_call_play(url:String, _width:int, _height:int, _buffer_time:Number):int { this.url = url; this.w = _width; this.h = _height; trace("start to play url: " + this.url + ", w=" + this.w + ", h=" + this.h); - // draw black bg. - this.graphics.beginFill(0x00, 1.0); - this.graphics.drawRect(0, 0, this.w, this.h); - this.graphics.endFill(); - js_call_stop(); this.conn = new NetConnection(); @@ -184,6 +241,11 @@ package video.attachNetStream(stream); video.smoothing = true; addChild(video); + + draw_black_background(_width, _height); + + // lowest layer, for mask to cover it. + setChildIndex(video, 0); }); this.conn.connect(this.url.substr(0, this.url.lastIndexOf("/"))); @@ -204,13 +266,37 @@ package contextMenu.customItems = customItems; // for js. + var obj:Object = get_video_size_object(); + + obj.server = 'srs'; + obj.contributor = 'winlin'; + + if (metadata.hasOwnProperty("server")) { + obj.server = metadata.server; + } + if (metadata.hasOwnProperty("contributor")) { + obj.contributor = metadata.contributor; + } + + var code:int = flash.external.ExternalInterface.call(on_player_metadata, id, obj); + if (code != 0) { + throw new Error("callback on_player_metadata failed. code=" + code); + } + } + + /** + * get the "right" size of video, + * 1. initialize with the original video object size. + * 2. override with metadata size if specified. + * 3. override with codec size if specified. + */ + private function get_video_size_object():Object { var obj:Object = { width: video.width, - height: video.height, - server: 'srs', - contributor: 'winlin' + height: video.height }; + // override with metadata size. if (metadata.hasOwnProperty("width")) { obj.width = metadata.width; } @@ -218,6 +304,7 @@ package obj.height = metadata.height; } + // override with codec size. if (video.videoWidth > 0) { obj.width = video.videoWidth; } @@ -225,17 +312,110 @@ package obj.height = video.videoHeight; } - if (metadata.hasOwnProperty("server")) { - obj.server = metadata.server; + return obj; + } + + /** + * execute the enter fullscreen action. + */ + private function execute_user_enter_fullscreen():void { + if (!fs_refer || fs_percent <= 0) { + return; } - if (metadata.hasOwnProperty("contributor")) { - obj.contributor = metadata.contributor; + + // change to video size if refer to video. + var obj:Object = get_video_size_object(); + + // get the DAR + var num:int = dar_num; + var den:int = dar_den; + + if (num == 0) { + num = obj.height; + } + if (num == -1) { + num = this.stage.fullScreenHeight; } - var code:int = flash.external.ExternalInterface.call(on_player_metadata, id, obj); - if (code != 0) { - throw new Error("callback on_player_metadata failed. code=" + code); + if (den == 0) { + den = obj.width; + } + if (den == -1) { + den = this.stage.fullScreenWidth; + } + + // for refer is screen. + if (fs_refer == "screen") { + obj = { + width: this.stage.fullScreenWidth, + height: this.stage.fullScreenHeight + }; } + + // rescale to fs + update_video_size(num, den, obj.width * fs_percent / 100, obj.height * fs_percent / 100, this.stage.fullScreenWidth, this.stage.fullScreenHeight); + } + + /** + * for user set dar, or leave fullscreen to recover the dar. + */ + private function execute_user_set_dar():void { + // get the DAR + var num:int = dar_num; + var den:int = dar_den; + + var obj:Object = get_video_size_object(); + + if (num == 0) { + num = obj.height; + } + if (num == -1) { + num = this.h; + } + + if (den == 0) { + den = obj.width; + } + if (den == -1) { + den = this.w; + } + + update_video_size(num, den, this.w, this.h, this.w, this.h); + } + + /** + * update the video width and height, + * according to the specifies DAR(den:num) and max size(w:h). + * set the position of video(x,y) specifies by size(sw:sh), + * and update the bg to size(sw:sh). + * @param _num/_den the DAR. use to rescale the player together with paper size. + * @param _w/_h the video draw paper size. used to rescale the player together with DAR. + * @param _sw/_wh the stage size, >= paper size. used to center the player. + */ + private function update_video_size(_num:int, _den:int, _w:int, _h:int, _sw:int, _sh:int):void { + if (!this.video || _num <= 0 || _den <= 0) { + return; + } + + // set DAR. + // calc the height by DAR + var _height:int = _w * _num / _den; + if (_height <= _h) { + this.video.width = _w; + this.video.height = _height; + } else { + // height overflow, calc the width by DAR + var _width:int = _h * _den / _num; + + this.video.width = _width; + this.video.height = _h; + } + + // align center. + this.video.x = (_sw - this.video.width) / 2; + this.video.y = (_sh - this.video.height) / 2; + + draw_black_background(_sw, _sh); } } } \ No newline at end of file