winlin

change ui version to 1.15, fix the publiser bug, support chrome/firefox/safari/ie browsers.

... ... @@ -7,18 +7,31 @@
<span id="txt_log_msg">日志内容</span>
</div>
*/
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);
}
... ...
... ... @@ -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,
... ...
... ... @@ -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";
... ...
... ... @@ -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
};
}
... ...
... ... @@ -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, "您使用的浏览器很弱,请关闭页面后重新打开页面(刷新也不管用)。<br/>推荐使用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();
... ...
... ... @@ -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, "您使用的浏览器很弱,请关闭页面后重新打开页面(刷新也不管用)。<br/>推荐使用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;
}
... ...
... ... @@ -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
... ...