From a6e2f19a0fe90027bab5edbd8c5f27106e171300 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 21 Dec 2013 19:25:43 +0800 Subject: [PATCH] support publish --- trunk/research/players/js/srs.js | 142 ++++++- trunk/research/players/jwplayer6.html | 11 +- trunk/research/players/osmf.html | 11 +- trunk/research/players/srs_player.html | 27 +- .../players/srs_player/release/srs_player.swf | Bin 5139 -> 5138 bytes .../players/srs_player/src/srs_player.as | 8 +- trunk/research/players/srs_publisher.html | 348 +++++++++++++++++- .../srs_publisher/release/srs_publisher.swf | Bin 691 -> 4244 bytes .../srs_publisher/src/srs_publisher.as | 313 ++++++++++++++++ 9 files changed, 825 insertions(+), 35 deletions(-) diff --git a/trunk/research/players/js/srs.js b/trunk/research/players/js/srs.js index ac1305112..beea0b633 100755 --- a/trunk/research/players/js/srs.js +++ b/trunk/research/players/js/srs.js @@ -116,11 +116,10 @@ function srs_init(rtmp_url, hls_url, modal_player) { /** * the SrsPlayer object. * @param container the html container id. -* @param stream_url the url of stream, rtmp or http. * @param width a float value specifies the width of player. * @param height a float value specifies the height of player. */ -function SrsPlayer(container, stream_url, width, height) { +function SrsPlayer(container, width, height) { if (!SrsPlayer.__id) { SrsPlayer.__id = 100; } @@ -131,12 +130,12 @@ function SrsPlayer(container, stream_url, width, height) { SrsPlayer.__players.push(this); this.container = container; - this.stream_url = stream_url; this.width = width; this.height = height; this.id = SrsPlayer.__id++; - this.callbackObj = null; + this.stream_url = null; this.buffer_time = 0.8; // default to 0.8 + this.callbackObj = null; // callback set the following values. this.meatadata = {}; // for on_player_metadata @@ -178,7 +177,12 @@ SrsPlayer.prototype.start = function() { return this; } -SrsPlayer.prototype.play = function() { +/** +* play the stream. +* @param stream_url the url of stream, rtmp or http. +*/ +SrsPlayer.prototype.play = function(url) { + this.stream_url = url; this.callbackObj.ref.__play(this.stream_url, this.width, this.height, this.buffer_time); } SrsPlayer.prototype.stop = function() { @@ -233,7 +237,6 @@ SrsPlayer.prototype.set_bt = function(buffer_time) { this.callbackObj.ref.__set_bt(buffer_time); } SrsPlayer.prototype.on_player_ready = function() { - this.play(); } SrsPlayer.prototype.on_player_metadata = function(metadata) { // ignore. @@ -286,4 +289,131 @@ function __srs_on_player_timer(id, time, buffer_length) { ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// +/** +* the SrsPublisher object. +* @param container the html container id. +* @param width a float value specifies the width of publisher. +* @param height a float value specifies the height of publisher. +*/ +function SrsPublisher(container, width, height) { + if (!SrsPublisher.__id) { + SrsPublisher.__id = 100; + } + if (!SrsPublisher.__publishers) { + SrsPublisher.__publishers = []; + } + + SrsPublisher.__publishers.push(this); + + this.container = container; + this.width = width; + this.height = height; + this.id = SrsPublisher.__id++; + this.callbackObj = null; + + // set the values when publish. + this.url = null; + this.vcodec = {}; + this.acodec = {}; + + // callback set the following values. + this.cameras = []; + this.microphones = []; + this.code = 0; + + // error code defines. + this.error_device_muted = 100; +} +/** +* user can set some callback, then start the publisher. +* callbacks: +* on_publisher_ready(cameras, microphones):int, when srs publisher ready, user can publish. +* on_publisher_error(code):int, when srs publisher error, callback this method. +*/ +SrsPublisher.prototype.start = function() { + // embed the flash. + var flashvars = {}; + flashvars.id = this.id; + flashvars.on_publisher_ready = "__srs_on_publisher_ready"; + flashvars.on_publisher_error = "__srs_on_publisher_error"; + + var params = {}; + params.wmode = "opaque"; + params.allowFullScreen = "true"; + params.allowScriptAccess = "always"; + + var attributes = {}; + + var self = this; + + swfobject.embedSWF( + "srs_publisher/release/srs_publisher.swf", this.container, + this.width, this.height, + "11.1", "js/AdobeFlashPlayerInstall.swf", + flashvars, params, attributes, + function(callbackObj){ + self.callbackObj = callbackObj; + } + ); + + return this; +} +/** +* publish stream to server. +* @param url a string indicates the rtmp url to publish. +* @param vcodec an object contains the video codec info. +* @param acodec an object contains the audio codec info. +*/ +SrsPublisher.prototype.publish = function(url, vcodec, acodec) { + this.url = url; + this.vcodec = vcodec; + this.acodec = acodec; + + this.callbackObj.ref.__publish(url, this.width, this.height, vcodec, acodec); +} +SrsPublisher.prototype.stop = function() { + this.callbackObj.ref.__stop(); +} +/** +* when publisher ready. +* @param cameras a string array contains the names of cameras. +* @param microphones a string array contains the names of microphones. +*/ +SrsPublisher.prototype.on_publisher_ready = function(cameras, microphones) { +} +/** +* when publisher error. +* @code the error code. +*/ +SrsPublisher.prototype.on_publisher_error = function(code) { + throw new Error("publisher error. code=" + code); +} +function __srs_find_publisher(id) { + for (var i = 0; i < SrsPublisher.__publishers.length; i++) { + var publisher = SrsPublisher.__publishers[i]; + + if (publisher.id != id) { + continue; + } + + return publisher; + } + + throw new Error("publisher not found. id=" + id); +} +function __srs_on_publisher_ready(id, cameras, microphones) { + var publisher = __srs_find_publisher(id); + + publisher.cameras = cameras; + publisher.microphones = microphones; + + publisher.on_publisher_ready(cameras, microphones); +} +function __srs_on_publisher_error(id, code) { + var publisher = __srs_find_publisher(id); + + publisher.code = code; + + publisher.on_publisher_error(code); +} diff --git a/trunk/research/players/jwplayer6.html b/trunk/research/players/jwplayer6.html index 793925939..946cdcfda 100755 --- a/trunk/research/players/jwplayer6.html +++ b/trunk/research/players/jwplayer6.html @@ -35,14 +35,13 @@ $("#main_modal").on("show", function(){ $("#div_container").remove(); - var obj = $("
"); - $(obj).attr("id", "div_container"); + var div_container = $("
"); + $(div_container).attr("id", "div_container"); + $("#player").append(div_container); var player = $("
"); - $(obj).append(player); - $(obj).attr("id", "player_id"); - - $("#player").append(obj); + $(player).attr("id", "player_id"); + $(div_container).append(player); var conf = { file: _url, diff --git a/trunk/research/players/osmf.html b/trunk/research/players/osmf.html index 97fa21333..0ad4eb520 100755 --- a/trunk/research/players/osmf.html +++ b/trunk/research/players/osmf.html @@ -21,14 +21,13 @@ function osmf_play(url) { $("#div_container").remove(); - var obj = $("
"); - $(obj).attr("id", "div_container"); + var div_container = $("
"); + $(div_container).attr("id", "div_container"); + $("#player").append(div_container); var player = $("
"); - $(obj).append(player); - $(obj).attr("id", "player_id"); - - $("#player").append(obj); + $(player).attr("id", "player_id"); + $(div_container).append(player); var flashvars = {}; flashvars.src = url; diff --git a/trunk/research/players/srs_player.html b/trunk/research/players/srs_player.html index 312633d7a..7d1b75987 100755 --- a/trunk/research/players/srs_player.html +++ b/trunk/research/players/srs_player.html @@ -80,28 +80,26 @@ $("#div_container").remove(); - var obj = $("
"); - $(obj).attr("id", "div_container"); + var div_container = $("
"); + $(div_container).attr("id", "div_container"); + $("#player").append(div_container); var player = $("
"); - $(obj).append(player); - $(obj).attr("id", "player_id"); - - $("#player").append(obj); + $(player).attr("id", "player_id"); + $(div_container).append(player); var url = $("#txt_url").val(); - srs_player = new SrsPlayer("player_id", url, - srs_get_player_width(), srs_get_player_height()); + 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_8", 0.8); - srs_player.play(); - } + srs_player.play(url); + }; 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); - } + }; 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) + "%"); @@ -124,7 +122,7 @@ time_str += padding(parseInt(time), 2, '0'); // show $("#txt_time").val(time_str); - } + }; srs_player.start(); }); @@ -218,6 +216,11 @@ select_buffer_time("#btn_bt_30", 30); }); } + + var query = parse_query_string(); + if (query.autostart == "true") { + $("#main_modal").modal({show:true, keyboard:false}); + } }); diff --git a/trunk/research/players/srs_player/release/srs_player.swf b/trunk/research/players/srs_player/release/srs_player.swf index a4076939e20c1bcfcb4da172b3257ee7e161e0bd..9db9c8ac66a2154ead01c6edde69a62061db7917 100755 GIT binary patch delta 5115 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 delta 5135 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 xAu @@ -38,6 +203,187 @@
+
+ + Usage: + 输入地址后点击发布按钮 +
+
+
+ + +
+
+
+
+ 发布地址: + + +
+
+
+
+ 观看地址: + srs_player.html +
+
+ + +
+
+
+
+
+ + 本地摄像头 + +
+
+
+
+
+
+
+
+
+
+
+ + 远程服务器 + +
+
+
+
+
+
+
+
+
+