diff --git a/trunk/research/players/js/srs.log.js b/trunk/research/players/js/srs.log.js old mode 100644 new mode 100755 index c3ffde5f5..eb7d27d3b --- a/trunk/research/players/js/srs.log.js +++ b/trunk/research/players/js/srs.log.js @@ -7,18 +7,31 @@ 日志内容 */ +var srs_log_disabled = false; function info(desc) { + if (srs_log_disabled) { + return; + } + $("#txt_log").addClass("alert-info").removeClass("alert-error").removeClass("alert-warn"); $("#txt_log_title").text("Info:"); - $("#txt_log_msg").text(desc); + $("#txt_log_msg").html(desc); } function warn(code, desc) { + if (srs_log_disabled) { + return; + } + $("#txt_log").removeClass("alert-info").removeClass("alert-error").addClass("alert-warn"); $("#txt_log_title").text("Warn:"); - $("#txt_log_msg").text("code: " + code + ", " + desc); + $("#txt_log_msg").html("code: " + code + ", " + desc); } function error(code, desc) { + if (srs_log_disabled) { + return; + } + $("#txt_log").removeClass("alert-info").addClass("alert-error").removeClass("alert-warn"); $("#txt_log_title").text("Error:"); - $("#txt_log_msg").text("code: " + code + ", " + desc); + $("#txt_log_msg").html("code: " + code + ", " + desc); } diff --git a/trunk/research/players/js/srs.page.js b/trunk/research/players/js/srs.page.js index 322286eae..165b8d8b7 100755 --- a/trunk/research/players/js/srs.page.js +++ b/trunk/research/players/js/srs.page.js @@ -10,7 +10,7 @@ function srs_get_player_width() { return srs_get_player_modal() - 30; } function srs_get_player_height() { return srs_get_player_width() * 9 / 19; } // to query the swf anti cache. -function srs_get_version_code() { return "1.13"; } +function srs_get_version_code() { return "1.15"; } // get the default vhost for players. function srs_get_player_vhost() { return "players"; } // the api server port, for chat room. @@ -139,6 +139,21 @@ function srs_init_publish(rtmp_url) { } } +// check whether can republish +function srs_can_republish() { + var browser = get_browser_agents(); + + if (browser.Chrome || browser.Firefox) { + return true; + } + + if (browser.MSIE || browser.QQBrowser) { + return false; + } + + return false; +} + // without default values set. function srs_initialize_codec_page( cameras, microphones, diff --git a/trunk/research/players/js/srs.publisher.js b/trunk/research/players/js/srs.publisher.js index 3dac341ec..50363e7d5 100755 --- a/trunk/research/players/js/srs.publisher.js +++ b/trunk/research/players/js/srs.publisher.js @@ -54,6 +54,8 @@ SrsPublisher.prototype.start = function() { // embed the flash. var flashvars = {}; flashvars.id = this.id; + flashvars.width = this.width; + flashvars.height = this.height; flashvars.on_publisher_ready = "__srs_on_publisher_ready"; flashvars.on_publisher_error = "__srs_on_publisher_error"; flashvars.on_publisher_warn = "__srs_on_publisher_warn"; diff --git a/trunk/research/players/js/srs.utility.js b/trunk/research/players/js/srs.utility.js old mode 100644 new mode 100755 index 19b715859..1f2bb1eeb --- a/trunk/research/players/js/srs.utility.js +++ b/trunk/research/players/js/srs.utility.js @@ -81,3 +81,54 @@ function srs_parse_rtmp_url(rtmp_url) { return ret; } + +/** +* get the agent. +* @return an object specifies some browser. +* for example, get_browser_agents().MSIE +*/ +function get_browser_agents() { + var agent = navigator.userAgent; + + /** + WindowsPC platform, Win7: + chrome 31.0.1650.63: + Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 + (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 + firefox 23.0.1: + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 + Firefox/23.0 + safari 5.1.7(7534.57.2): + Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 + (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2 + opera 15.0.1147.153: + Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 + (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 + OPR/15.0.1147.153 + 360 6.2.1.272: + Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; + Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; + .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; + .NET4.0E) + IE 10.0.9200.16750(update: 10.0.12): + Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; + Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; + .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; + .NET4.0E) + */ + + return { + // platform + Android: agent.indexOf("Android") != -1, + Windows: agent.indexOf("Windows") != -1, + iPhone: agent.indexOf("iPhone") != -1, + // Windows Browsers + Chrome: agent.indexOf("Chrome") != -1, + Firefox: agent.indexOf("Firefox") != -1, + QQBrowser: agent.indexOf("QQBrowser") != -1, + MSIE: agent.indexOf("MSIE") != -1, + // Android Browsers + Opera: agent.indexOf("Presto") != -1, + MQQBrowser: agent.indexOf("MQQBrowser") != -1 + }; +} diff --git a/trunk/research/players/srs_chat.html b/trunk/research/players/srs_chat.html index 09839a09b..804f7efa5 100755 --- a/trunk/research/players/srs_chat.html +++ b/trunk/research/players/srs_chat.html @@ -27,18 +27,23 @@ var previous_chats = []; var no_play = false; + var query = parse_query_string(); $(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 // url set to: rtmp://demo:1935/live/livestream srs_init_publish("#txt_url"); + if (query.agent == "true") { + document.write(navigator.userAgent); + return; + } + $("#realtime_player_url").tooltip({ title: "右键复制RTMP地址" }); // if no play specified, donot show the player, for debug the publisher. - var query = parse_query_string(); if (query.no_play == "true") { no_play = true; } @@ -65,6 +70,10 @@ ); }; srs_publisher.on_publisher_error = function(code, desc) { + if (!on_publish_stop()) { + return; + } + error(code, desc + "请重试。"); }; srs_publisher.on_publisher_warn = function(code, desc) { @@ -107,6 +116,18 @@ refresh(); }); + function on_publish_stop() { + if (!srs_can_republish()) { + $("#btn_join").attr("disabled", true); + error(0, "您使用的浏览器很弱,请关闭页面后重新打开页面(刷新也不管用)。
推荐使用Chrome/Firefox/Safari/Opera浏览器,支持重试"); + + srs_log_disabled = true; + return false; + } + + return true; + } + function update_play_url() { var url = $("#txt_url").val(); @@ -432,6 +453,10 @@ data : "", dataType : "json", complete : function() { + if (!on_publish_stop()) { + return; + } + $("#btn_join").attr("disabled", false); if (complete_pfn) { complete_pfn(); diff --git a/trunk/research/players/srs_publisher.html b/trunk/research/players/srs_publisher.html index a40382c68..3f90e8983 100755 --- a/trunk/research/players/srs_publisher.html +++ b/trunk/research/players/srs_publisher.html @@ -23,12 +23,18 @@ var remote_player = null; var realtime_player = null; + var query = parse_query_string(); $(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 // url set to: rtmp://demo:1935/live/livestream srs_init("#txt_url", null, null); + if (query.agent == "true") { + document.write(navigator.userAgent); + return; + } + $("#btn_video_settings").click(function(){ $("#video_modal").modal({show:true}); }); @@ -65,6 +71,9 @@ ); }; srs_publisher.on_publisher_error = function(code, desc) { + if (!on_publish_stop()) { + return; + } error(code, desc + "请重试。"); }; srs_publisher.on_publisher_warn = function(code, desc) { @@ -75,7 +84,6 @@ update_play_url(); // if no play specified, donot show the player, for debug the publisher. - var query = parse_query_string(); if (query.no_play != "true") { // start the normal player with HLS supported. remote_player = new SrsPlayer("remote_player", 430, 185); @@ -101,6 +109,18 @@ } }); + function on_publish_stop() { + if (!srs_can_republish()) { + $("#btn_join").attr("disabled", true); + error(0, "您使用的浏览器很弱,请关闭页面后重新打开页面(刷新也不管用)。
推荐使用Chrome/Firefox/Safari/Opera浏览器,支持重试"); + + srs_log_disabled = true; + return false; + } + + return true; + } + /** * we generate the transcoded stream url for flash publish donot support HLS * which requires aac, so the publish vhost maybe players for example, we @@ -112,7 +132,6 @@ function update_play_url() { var url = $("#txt_url").val(); var ret = srs_parse_rtmp_url(url); - var query = parse_query_string(); var remote_url = "rtmp://" + ret.server + ":" + ret.port + "/" + ret.app + "...vhost..." + srs_get_player_publish_vhost(ret.vhost) + "/" + ret.stream; $("#realtime_player_url").attr("href", url).attr("target", "_blank"); @@ -147,6 +166,10 @@ //$("#remote_player_url").attr("href", "#").attr("target", "_self"); //$("#txt_play_hls").text("HLS-m3u8(请发布视频)").attr("href", "#").attr("target", "_self"); //$("#txt_play_jwplayer").text("HLS-JWPlayer(请发布视频)").attr("href", "#").attr("target", "_self"); + + if (!on_publish_stop()) { + return; + } return; } diff --git a/trunk/research/players/srs_publisher/release/srs_publisher.swf b/trunk/research/players/srs_publisher/release/srs_publisher.swf index 0c22b9c95..c7c7b5805 100755 Binary files a/trunk/research/players/srs_publisher/release/srs_publisher.swf and b/trunk/research/players/srs_publisher/release/srs_publisher.swf differ diff --git a/trunk/research/players/srs_publisher/src/srs_publisher.as b/trunk/research/players/srs_publisher/src/srs_publisher.as index db889437a..d9141b4ce 100755 --- a/trunk/research/players/srs_publisher/src/srs_publisher.as +++ b/trunk/research/players/srs_publisher/src/srs_publisher.as @@ -16,6 +16,8 @@ package import flash.media.Video; import flash.net.NetConnection; import flash.net.NetStream; + import flash.system.Security; + import flash.system.SecurityPanel; import flash.ui.ContextMenu; import flash.ui.ContextMenuItem; import flash.utils.setTimeout; @@ -84,6 +86,18 @@ package this.js_on_publisher_error = flashvars.on_publisher_error; this.js_on_publisher_warn = flashvars.on_publisher_warn; + // initialized size. + this.user_w = flashvars.width; + this.user_h = flashvars.height; + + // try to get the camera, if muted, alert the security and requires user to open it. + var c:Camera = Camera.getCamera(); + if (c.muted) { + Security.showSettings(SecurityPanel.PRIVACY); + } + + __show_local_camera(c); + flash.utils.setTimeout(this.system_on_js_ready, 0); } @@ -221,17 +235,7 @@ package var streamName:String = url.substr(url.lastIndexOf("/")); media_stream.publish(streamName); - media_video = new Video(); - media_video.width = _width; - media_video.height = _height; - media_video.attachCamera(media_camera); - media_video.smoothing = true; - addChild(media_video); - - //__draw_black_background(_width, _height); - - // lowest layer, for mask to cover it. - setChildIndex(media_video, 0); + __show_local_camera(media_camera); }); var tcUrl:String = this.user_url.substr(0, this.user_url.lastIndexOf("/")); @@ -242,11 +246,6 @@ package * function for js to call: to stop the stream. ignore if not publish. */ private function js_call_stop():void { - if (this.media_video) { - this.media_video.attachCamera(null); - this.removeChild(this.media_video); - this.media_video = null; - } if (this.media_stream) { this.media_stream.attachAudio(null); this.media_stream.attachCamera(null); @@ -363,5 +362,52 @@ package // quality=1 is lowest quality, 100 is highest quality. c.setQuality(cameraBitrate / 8.0 * 1000, cameraQuality); } + + private function __show_local_camera(c:Camera):void { + if (this.media_video) { + this.media_video.attachCamera(null); + this.removeChild(this.media_video); + this.media_video = null; + } + + // show local camera + media_video = new Video(); + media_video.attachCamera(c); + media_video.smoothing = true; + addChild(media_video); + + // rescale the local camera. + var cw:Number = user_h * c.width / c.height; + if (cw > user_w) { + var ch:Number = user_w * c.height / c.width; + media_video.width = user_w; + media_video.height = ch; + } else { + media_video.width = cw; + media_video.height = user_h; + } + media_video.x = (user_w - media_video.width) / 2; + media_video.y = (user_h - media_video.height) / 2; + + __draw_black_background(user_w, user_h); + + // lowest layer, for mask to cover it. + setChildIndex(media_video, 0); + } + + /** + * draw black background and draw the fullscreen mask. + */ + 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.control_fs_mask.graphics.beginFill(0xff0000, 0); + //this.control_fs_mask.graphics.drawRect(0, 0, _width, _height); + //this.control_fs_mask.graphics.endFill(); + } } } \ No newline at end of file