From b25c45c64377b3f758fdb3d2aa3669601339a31a Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 24 Aug 2015 07:55:30 +0800 Subject: [PATCH] refine srs player, support set the bufferTimeMax. --- trunk/research/players/js/srs.page.js | 2 +- trunk/research/players/js/srs.player.js | 64 +++++++- trunk/research/players/srs_player.html | 146 +++++++++++------- .../players/srs_player/release/srs_player.swf | Bin 6306 -> 6581 bytes .../players/srs_player/src/srs_player.as | 30 +++- 5 files changed, 184 insertions(+), 58 deletions(-) diff --git a/trunk/research/players/js/srs.page.js b/trunk/research/players/js/srs.page.js index 842db7f04..81942ebdd 100755 --- a/trunk/research/players/js/srs.page.js +++ b/trunk/research/players/js/srs.page.js @@ -3,7 +3,7 @@ ////////////////////////////////////////////////////////////////////////////////// // to query the swf anti cache. -function srs_get_version_code() { return "1.25"; } +function srs_get_version_code() { return "1.26"; } /** * player specified size. diff --git a/trunk/research/players/js/srs.player.js b/trunk/research/players/js/srs.player.js index 91dea7f16..c7dd9d972 100755 --- a/trunk/research/players/js/srs.player.js +++ b/trunk/research/players/js/srs.player.js @@ -23,6 +23,7 @@ function SrsPlayer(container, width, height, private_object) { this.id = SrsPlayer.__id++; this.stream_url = null; this.buffer_time = 0.3; // default to 0.3 + this.max_buffer_time = this.buffer_time * 3; // default to 3 x bufferTime. this.volume = 1.0; // default to 100% this.callbackObj = null; @@ -118,8 +119,11 @@ SrsPlayer.prototype.play = function(url, volume) { this.volume = volume; } - this.callbackObj.ref.__play(this.stream_url, this.width, this.height, this.buffer_time, this.volume); + this.callbackObj.ref.__play(this.stream_url, this.width, this.height, this.buffer_time, this.max_buffer_time, this.volume); } +/** + * stop play stream. + */ SrsPlayer.prototype.stop = function() { for (var i = 0; i < SrsPlayer.__players.length; i++) { var player = SrsPlayer.__players[i]; @@ -134,9 +138,15 @@ SrsPlayer.prototype.stop = function() { this.callbackObj.ref.__stop(); } +/** + * pause the play. + */ SrsPlayer.prototype.pause = function() { this.callbackObj.ref.__pause(); } +/** + * resume the play. + */ SrsPlayer.prototype.resume = function() { this.callbackObj.ref.__resume(); } @@ -180,23 +190,75 @@ SrsPlayer.prototype.set_fs = function(refer, percent) { * @buffer_time the buffer time in seconds. */ SrsPlayer.prototype.set_bt = function(buffer_time) { + if (this.buffer_time == buffer_time) { + return; + } + this.buffer_time = buffer_time; this.callbackObj.ref.__set_bt(buffer_time); + + // reset the max buffer time to 3 x buffer_time. + this.set_mbt(buffer_time * 3); } +/** + * set the stream max buffer time in seconds. + * @param max_buffer_time the max buffer time in seconds. + * @remark this is the key feature for realtime communication by flash. + */ +SrsPlayer.prototype.set_mbt = function(max_buffer_time) { + // we must atleast set the max buffer time to 0.6s. + max_buffer_time = Math.max(0.6, max_buffer_time); + // max buffer time always greater than buffer time. + max_buffer_time = Math.max(this.buffer_time, max_buffer_time); + + if (parseInt(this.max_buffer_time * 10) == parseInt(max_buffer_time * 10)) { + return; + } + + this.max_buffer_time = max_buffer_time; + this.callbackObj.ref.__set_mbt(max_buffer_time); +} +/** + * the callback when player is ready. + */ SrsPlayer.prototype.on_player_ready = function() { } +/** + * the callback when player got metadata. + * @param metadata the metadata which player got. + */ SrsPlayer.prototype.on_player_metadata = function(metadata) { // ignore. } +/** + * the callback when player timer event. + * @param time current stream time. + * @param buffer_length current buffer length. + * @param kbps current video plus audio bitrate in kbps. + * @param fps current video fps. + * @param rtime current relative time by flash.util.getTimer(). + */ SrsPlayer.prototype.on_player_timer = function(time, buffer_length, kbps, fps, rtime) { // ignore. } +/** + * the callback when player got NetStream.Buffer.Empty + * @param time current relative time by flash.util.getTimer(). + */ SrsPlayer.prototype.on_player_empty = function(time) { // ignore. } +/** + * the callback when player got NetStream.Buffer.Full + * @param time current relative time by flash.util.getTimer(). + */ SrsPlayer.prototype.on_player_full = function(time) { // ignore. } + +/** + * helpers. + */ function __srs_find_player(id) { for (var i = 0; i < SrsPlayer.__players.length; i++) { var player = SrsPlayer.__players[i]; diff --git a/trunk/research/players/srs_player.html b/trunk/research/players/srs_player.html index 6668e02c8..ca3ee0140 100755 --- a/trunk/research/players/srs_player.html +++ b/trunk/research/players/srs_player.html @@ -284,7 +284,7 @@
- +
+
+ 全屏
@@ -337,21 +352,25 @@ 由于安全原因,Flash全屏无法使用JS触发
+
+ @B + +
@F
@E - +
@F - +
@B - +
@T @@ -410,6 +429,17 @@ __active_size.addClass("active"); } + function select_buffer(buffer_time) { + var bt = buffer_time; + var bt_id = "#btn_bt_" + bt.toFixed(1).replace(".", "_"); + select_buffer_time(bt_id, bt); + } + function select_max_buffer(max_buffer_time) { + var mbt = max_buffer_time; + var mbt_id = "#btn_mbt_" + mbt.toFixed(1).replace(".", "_"); + select_max_buffer_time(mbt_id, mbt); + } + var __active_bt = null; function select_buffer_time(bt_id, buffer_time) { srs_player.set_bt(buffer_time); @@ -420,6 +450,20 @@ __active_bt = $(bt_id).parent(); __active_bt.addClass("active"); + + select_max_buffer(srs_player.max_buffer_time); + } + + var __active_mbt = null; + function select_max_buffer_time(mbt_id, max_buffer_time) { + srs_player.set_mbt(max_buffer_time); + + if (__active_mbt) { + __active_mbt.removeClass("active"); + } + + __active_mbt = $(mbt_id).parent(); + __active_mbt.addClass("active"); } $(function(){ @@ -447,7 +491,7 @@ srs_player = new SrsPlayer("player_id", srs_get_player_width(), srs_get_player_height()); srs_player.on_player_ready = function() { - select_buffer_time("#btn_bt_0_1", 0.1); + select_buffer(0.2); this.play(url); }; srs_player.on_player_metadata = function(metadata) { @@ -456,16 +500,21 @@ select_fs_size("#btn_fs_size_screen_100", "screen", 100); }; srs_player.on_player_timer = function(time, buffer_length, kbps, fps, rtime) { - var buffer = buffer_length / this.buffer_time * 100; + var buffer = buffer_length / this.max_buffer_time * 100; $("#pb_buffer").width(Number(buffer).toFixed(1) + "%"); $("#pb_buffer_bg").attr("title", - "缓冲区长度:" + Number(buffer_length).toFixed(1) + "秒(" - + Number(buffer).toFixed(1) + "%)"); + "缓冲区:" + buffer_length.toFixed(1) + "秒, 最大缓冲区:" + + this.max_buffer_time.toFixed(1) + "秒, 当前:" + + buffer.toFixed(1) + "%"); - $("#txt_bitrate").val(kbps.toFixed(1) + "kbps"); + var bts = this.buffer_time >= 1? this.buffer_time.toFixed(0) : this.buffer_time.toFixed(1); + var mbts = this.buffer_time >= 1? this.max_buffer_time.toFixed(0) : this.max_buffer_time.toFixed(1); + $("#txt_buffer").val(buffer_length.toFixed(1) + "/" + bts + "/" + mbts + "s"); + + $("#txt_bitrate").val(kbps.toFixed(0) + "kbps"); $("#txt_fps").val(fps.toFixed(1) + "fps"); - $("#txt_empty_count").val(srs_player.empty_count() + "次卡顿"); + $("#txt_empty_count").val(srs_player.empty_count() + "次"); $("#txt_fluency").val(srs_player.fluency().toFixed(2) + "%"); var time_str = ""; @@ -619,39 +668,32 @@ } if (true) { - $("#btn_bt_0_1").click(function(){ - select_buffer_time("#btn_bt_0_1", 0.1); - }); - $("#btn_bt_0_2").click(function(){ - select_buffer_time("#btn_bt_0_2", 0.2); - }); - $("#btn_bt_0_3").click(function(){ - select_buffer_time("#btn_bt_0_3", 0.3); - }); - $("#btn_bt_0_5").click(function(){ - select_buffer_time("#btn_bt_0_5", 0.5); - }); - $("#btn_bt_0_8").click(function(){ - select_buffer_time("#btn_bt_0_8", 0.8); - }); - $("#btn_bt_1").click(function(){ - select_buffer_time("#btn_bt_1", 1); - }); - $("#btn_bt_2").click(function(){ - select_buffer_time("#btn_bt_2", 2); - }); - $("#btn_bt_3").click(function(){ - select_buffer_time("#btn_bt_3", 3); - }); - $("#btn_bt_5").click(function(){ - select_buffer_time("#btn_bt_5", 5); - }); - $("#btn_bt_10").click(function(){ - select_buffer_time("#btn_bt_10", 10); - }); - $("#btn_bt_30").click(function(){ - select_buffer_time("#btn_bt_30", 30); - }); + var bts = [0.1, 0.2, 0.3, 0.5, 0.8, 1, 2, 3, 5, 10, 30]; + for (var i = 0; i < bts.length; i++) { + var bt = bts[i]; + var bt_id = "#btn_bt_" + bt.toFixed(1).replace(".", "_"); + + var bt_fun = function(id, v){ + $(bt_id).click(function(){ + select_buffer_time(id, v); + }); + }; + bt_fun(bt_id, bt); + } + } + if (true) { + var mbts = [0.6, 0.9, 1.5, 2.4, 3, 6, 9, 15, 30, 90]; + for (var i = 0; i < mbts.length; i++) { + var mbt = mbts[i]; + var mbt_id = "#btn_mbt_" + mbt.toFixed(1).replace(".", "_"); + + var mbt_fun = function(id, v){ + $(mbt_id).click(function(){ + select_max_buffer_time(id, v); + }); + }; + mbt_fun(mbt_id, mbt); + } } var query = parse_query_string(); diff --git a/trunk/research/players/srs_player/release/srs_player.swf b/trunk/research/players/srs_player/release/srs_player.swf index 20e7302bcf1267c6dedfa84cde5250ad588eb44e..5516be33bf23f664dcd9ef306ee06ad806aee836 100755 GIT binary patch literal 6581 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.5 + * @param max_buffer_time, the max buffer time in seconds. recommend to 3 x buffer_time. * @param volume, the volume, 0 is mute, 1 is 100%, 2 is 200%. */ - private function js_call_play(url:String, _width:int, _height:int, buffer_time:Number, volume:Number):void { + private function js_call_play(url:String, _width:int, _height:int, buffer_time:Number, max_buffer_time:Number, volume:Number):void { this.user_url = url; this.user_w = _width; this.user_h = _height; - log("start to play url: " + this.user_url + ", w=" + this.user_w + ", h=" + this.user_h); + log("start to play url: " + this.user_url + ", w=" + this.user_w + ", h=" + this.user_h + + ", buffer=" + buffer_time.toFixed(2) + "s, max_buffer=" + max_buffer_time.toFixed(2) + "s, volume=" + volume.toFixed(2) + ); js_call_stop(); @@ -349,7 +370,7 @@ package this.media_conn.client = {}; this.media_conn.client.onBWDone = function():void {}; this.media_conn.addEventListener(NetStatusEvent.NET_STATUS, function(evt:NetStatusEvent):void { - trace ("NetConnection: code=" + evt.info.code); + log("NetConnection: code=" + evt.info.code); if (evt.info.hasOwnProperty("data") && evt.info.data) { if (evt.info.data.hasOwnProperty("srs_server")) { @@ -381,10 +402,11 @@ package media_stream = new NetStream(media_conn); media_stream.soundTransform = new SoundTransform(volume); media_stream.bufferTime = buffer_time; + media_stream.bufferTimeMax = max_buffer_time; media_stream.client = {}; media_stream.client.onMetaData = system_on_metadata; media_stream.addEventListener(NetStatusEvent.NET_STATUS, function(evt:NetStatusEvent):void { - trace ("NetStream: code=" + evt.info.code); + log("NetStream: code=" + evt.info.code); if (evt.info.code == "NetStream.Video.DimensionChange") { system_on_metadata(media_metadata);