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