diff --git a/trunk/research/players/js/srs.js b/trunk/research/players/js/srs.js index 13b3acc0e..6ea8814b9 100755 --- a/trunk/research/players/js/srs.js +++ b/trunk/research/players/js/srs.js @@ -1,3 +1,16 @@ +/** +* padding the output. +* padding(3, 5, '0') is 00003 +* padding(3, 5, 'x') is xxxx3 +* @see http://blog.csdn.net/win_lin/article/details/12065413 +*/ +function padding(number, length, prefix) { + if(String(number).length >= length){ + return String(number); + } + return padding(prefix+number, length, prefix); +} + /** * update the navigator, add same query string. */ @@ -88,7 +101,7 @@ function srs_init(rtmp_url, hls_url) { /** * the SrsPlayer object. */ -function SrsPlayer(container, stream_url, width, height, buffer_time) { +function SrsPlayer(container, stream_url, width, height) { if (!SrsPlayer.__id) { SrsPlayer.__id = 100; } @@ -102,12 +115,14 @@ function SrsPlayer(container, stream_url, width, height, buffer_time) { this.stream_url = stream_url; this.width = width; this.height = height; - this.buffer_time = buffer_time; this.id = SrsPlayer.__id++; this.callbackObj = null; + this.buffer_time = 0.8; // default to 0.8 // callback set the following values. this.meatadata = {}; // for on_player_metadata + this.time = 0; // current stream time. + this.buffer_length = 0; // current stream buffer length. } /** * user can set some callback, then start the player. @@ -121,6 +136,7 @@ SrsPlayer.prototype.start = function() { flashvars.id = this.id; flashvars.on_player_ready = "__srs_on_player_ready"; flashvars.on_player_metadata = "__srs_on_player_metadata"; + flashvars.on_player_timer = "__srs_on_player_timer"; var params = {}; params.wmode = "opaque"; @@ -144,7 +160,7 @@ SrsPlayer.prototype.start = function() { return this; } SrsPlayer.prototype.play = function() { - return this.callbackObj.ref.__play(this.stream_url, this.width, this.height, this.buffer_time); + 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++) { @@ -157,13 +173,14 @@ SrsPlayer.prototype.stop = function() { SrsPlayer.__players.splice(i, 1); break; } - return this.callbackObj.ref.__stop(); + + this.callbackObj.ref.__stop(); } SrsPlayer.prototype.pause = function() { - return this.callbackObj.ref.__pause(); + this.callbackObj.ref.__pause(); } SrsPlayer.prototype.resume = function() { - return this.callbackObj.ref.__resume(); + this.callbackObj.ref.__resume(); } /** * to set the DAR, for example, DAR=16:9 @@ -175,7 +192,7 @@ SrsPlayer.prototype.resume = function() { * use user specified width if -1. */ SrsPlayer.prototype.dar = function(num, den) { - return this.callbackObj.ref.__dar(num, den); + this.callbackObj.ref.__dar(num, den); } /** * set the fullscreen size data. @@ -186,13 +203,24 @@ SrsPlayer.prototype.dar = function(num, den) { * 100 means 100%. */ SrsPlayer.prototype.set_fs = function(refer, percent) { - return this.callbackObj.ref.__set_fs(refer, percent); + this.callbackObj.ref.__set_fs(refer, percent); +} +/** +* set the stream buffer time in seconds. +* @buffer_time the buffer time in seconds. +*/ +SrsPlayer.prototype.set_bt = function(buffer_time) { + this.buffer_time = buffer_time; + this.callbackObj.ref.__set_bt(buffer_time); } SrsPlayer.prototype.on_player_ready = function() { - return this.play(); + this.play(); } SrsPlayer.prototype.on_player_metadata = function(metadata) { - return 0; + // ignore. +} +SrsPlayer.prototype.on_player_timer = function(time, buffer_length) { + // ignore. } function __srs_on_player_ready(id) { for (var i = 0; i < SrsPlayer.__players.length; i++) { @@ -202,7 +230,8 @@ function __srs_on_player_ready(id) { continue; } - return player.on_player_ready(); + player.on_player_ready(); + return; } throw new Error("player not found. id=" + id); @@ -219,7 +248,30 @@ function __srs_on_player_metadata(id, metadata) { // so set the data before invoke it. player.metadata = metadata; - return player.on_player_metadata(metadata); + player.on_player_metadata(metadata); + return; + } + + throw new Error("player not found. id=" + id); +} +function __srs_on_player_timer(id, time, buffer_length) { + for (var i = 0; i < SrsPlayer.__players.length; i++) { + var player = SrsPlayer.__players[i]; + + if (player.id != id) { + continue; + } + + buffer_length = Math.max(0, buffer_length); + buffer_length = Math.min(player.buffer_time, buffer_length); + + // user may override the on_player_timer, + // so set the data before invoke it. + player.time = time; + player.buffer_length = buffer_length; + + player.on_player_timer(time, buffer_length); + return; } 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 2ec9c81ed..6d9076e5b 100755 --- a/trunk/research/players/srs_player.html +++ b/trunk/research/players/srs_player.html @@ -40,6 +40,18 @@ __active_size.addClass("active"); } + var __active_bt = null; + function select_buffer_time(bt_id, buffer_time) { + srs_player.set_bt(buffer_time); + + if (__active_bt) { + __active_bt.removeClass("active"); + } + + __active_bt = $(bt_id).parent(); + __active_bt.addClass("active"); + } + $(function(){ // get the vhost and port to set the default url. // for example: http://192.168.1.213/players/jwplayer6.html?port=1935&vhost=demo @@ -68,15 +80,38 @@ var url = $("#txt_url").val(); - srs_player = new SrsPlayer("player_id", url, 530, 300, 0.8); + srs_player = new SrsPlayer("player_id", url, 530, 300); srs_player.on_player_ready = function() { - return srs_player.play(); + srs_player.play(); } srs_player.on_player_metadata = function(metadata) { $("#btn_dar_original").text("视频原始比例" + "(" + metadata.width + ":" + metadata.height + ")"); select_dar("#btn_dar_original", 0, 0); select_fs_size("#btn_fs_size_screen_100", "screen", 100); - return 0; + select_buffer_time("#btn_bt_0_8", 0.8); + } + srs_player.on_player_timer = function(time, buffer_length) { + var buffer = buffer_length / srs_player.buffer_time * 100; + $("#pb_buffer").width(Number(buffer).toFixed(1) + "%"); + + $("#pb_buffer_bg").attr("title", + "缓冲区长度:" + Number(buffer_length).toFixed(1) + "秒(" + + Number(buffer).toFixed(1) + "%)"); + + var time_str = ""; + // day + time_str = padding(parseInt(time / 24 / 3600), 2, '0') + " "; + // hour + time = time % (24 * 3600); + time_str += padding(parseInt(time / 3600), 2, '0') + ":"; + // minute + time = time % (3600); + time_str += padding(parseInt(time / 60), 2, '0') + ":"; + // seconds + time = time % (60); + time_str += padding(parseInt(time), 2, '0'); + // show + $("#txt_time").val(time_str); } srs_player.start(); }); @@ -97,11 +132,11 @@ }); $("#btn_pause").click(function(){ - if ($("#btn_pause").text() == "暂停播放") { - $("#btn_pause").text("继续播放"); + if ($("#btn_pause").text() == "暂停") { + $("#btn_pause").text("继续"); srs_player.pause(); } else { - $("#btn_pause").text("暂停播放"); + $("#btn_pause").text("暂停"); srs_player.resume(); } }); @@ -144,6 +179,33 @@ select_fs_size("#btn_fs_size_screen_50", "screen", 50); }); } + + if (true) { + $("#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); + }); + } }); @@ -180,15 +242,23 @@

SrsPlayer

-