wenjiegit

add linux version of band check app; add web version of band check app

@@ -82,7 +82,7 @@ function error(code, desc) { @@ -82,7 +82,7 @@ function error(code, desc) {
82 */ 82 */
83 function parse_query_string(){ 83 function parse_query_string(){
84 var obj = {}; 84 var obj = {};
85 - 85 +
86 // parse the host(hostname:http_port), pathname(dir/filename) 86 // parse the host(hostname:http_port), pathname(dir/filename)
87 obj.host = window.location.host; 87 obj.host = window.location.host;
88 obj.hostname = window.location.hostname; 88 obj.hostname = window.location.hostname;
@@ -95,19 +95,19 @@ function parse_query_string(){ @@ -95,19 +95,19 @@ function parse_query_string(){
95 obj.dir = obj.pathname.substr(0, obj.pathname.lastIndexOf("/")); 95 obj.dir = obj.pathname.substr(0, obj.pathname.lastIndexOf("/"));
96 obj.filename = obj.pathname.substr(obj.pathname.lastIndexOf("/")); 96 obj.filename = obj.pathname.substr(obj.pathname.lastIndexOf("/"));
97 } 97 }
98 - 98 +
99 // parse the query string. 99 // parse the query string.
100 var query_string = String(window.location.search).replace(" ", "").split("?")[1]; 100 var query_string = String(window.location.search).replace(" ", "").split("?")[1];
101 if(query_string == undefined){ 101 if(query_string == undefined){
102 return obj; 102 return obj;
103 } 103 }
104 - 104 +
105 var queries = query_string.split("&"); 105 var queries = query_string.split("&");
106 $(queries).each(function(){ 106 $(queries).each(function(){
107 var query = this.split("="); 107 var query = this.split("=");
108 obj[query[0]] = query[1]; 108 obj[query[0]] = query[1];
109 }); 109 });
110 - 110 +
111 return obj; 111 return obj;
112 } 112 }
113 113
@@ -169,7 +169,7 @@ function build_default_hls_url() { @@ -169,7 +169,7 @@ function build_default_hls_url() {
169 } else if (query.hls_vhost != undefined) { 169 } else if (query.hls_vhost != undefined) {
170 server = query.hls_vhost; 170 server = query.hls_vhost;
171 } 171 }
172 - 172 +
173 var port = (query.hls_port == undefined)? window.location.port:query.hls_port; 173 var port = (query.hls_port == undefined)? window.location.port:query.hls_port;
174 var app = (query.app == undefined)? "live":query.app; 174 var app = (query.app == undefined)? "live":query.app;
175 var stream = (query.stream == undefined)? "livestream":query.stream; 175 var stream = (query.stream == undefined)? "livestream":query.stream;
@@ -177,7 +177,7 @@ function build_default_hls_url() { @@ -177,7 +177,7 @@ function build_default_hls_url() {
177 if (port == "" || port == null || port == undefined) { 177 if (port == "" || port == null || port == undefined) {
178 port = 80; 178 port = 80;
179 } 179 }
180 - 180 +
181 return "http://" + server + ":" + port + "/" + app + "/" + stream + ".m3u8"; 181 return "http://" + server + ":" + port + "/" + app + "/" + stream + ".m3u8";
182 } 182 }
183 183
@@ -190,7 +190,7 @@ function srs_parse_rtmp_url(rtmp_url) { @@ -190,7 +190,7 @@ function srs_parse_rtmp_url(rtmp_url) {
190 // @see: http://stackoverflow.com/questions/10469575/how-to-use-location-object-to-parse-url-without-redirecting-the-page-in-javascri 190 // @see: http://stackoverflow.com/questions/10469575/how-to-use-location-object-to-parse-url-without-redirecting-the-page-in-javascri
191 var a = document.createElement("a"); 191 var a = document.createElement("a");
192 a.href = rtmp_url.replace("rtmp://", "http://"); 192 a.href = rtmp_url.replace("rtmp://", "http://");
193 - 193 +
194 var vhost = a.hostname; 194 var vhost = a.hostname;
195 var port = (a.port == "")? "1935":a.port; 195 var port = (a.port == "")? "1935":a.port;
196 var app = a.pathname.substr(1, a.pathname.lastIndexOf("/") - 1); 196 var app = a.pathname.substr(1, a.pathname.lastIndexOf("/") - 1);
@@ -201,7 +201,7 @@ function srs_parse_rtmp_url(rtmp_url) { @@ -201,7 +201,7 @@ function srs_parse_rtmp_url(rtmp_url) {
201 if (app.indexOf("?") >= 0) { 201 if (app.indexOf("?") >= 0) {
202 var params = app.substr(app.indexOf("?")); 202 var params = app.substr(app.indexOf("?"));
203 app = app.substr(0, app.indexOf("?")); 203 app = app.substr(0, app.indexOf("?"));
204 - 204 +
205 if (params.indexOf("vhost=") > 0) { 205 if (params.indexOf("vhost=") > 0) {
206 vhost = params.substr(params.indexOf("vhost=") + "vhost=".length); 206 vhost = params.substr(params.indexOf("vhost=") + "vhost=".length);
207 if (vhost.indexOf("&") > 0) { 207 if (vhost.indexOf("&") > 0) {
@@ -209,12 +209,12 @@ function srs_parse_rtmp_url(rtmp_url) { @@ -209,12 +209,12 @@ function srs_parse_rtmp_url(rtmp_url) {
209 } 209 }
210 } 210 }
211 } 211 }
212 - 212 +
213 var ret = { 213 var ret = {
214 - server: a.hostname, port: port, 214 + server: a.hostname, port: port,
215 vhost: vhost, app: app, stream: stream 215 vhost: vhost, app: app, stream: stream
216 }; 216 };
217 - 217 +
218 return ret; 218 return ret;
219 } 219 }
220 220
@@ -226,7 +226,7 @@ function srs_parse_rtmp_url(rtmp_url) { @@ -226,7 +226,7 @@ function srs_parse_rtmp_url(rtmp_url) {
226 */ 226 */
227 function srs_init(rtmp_url, hls_url, modal_player) { 227 function srs_init(rtmp_url, hls_url, modal_player) {
228 update_nav(); 228 update_nav();
229 - 229 +
230 if (rtmp_url) { 230 if (rtmp_url) {
231 $(rtmp_url).val(build_default_rtmp_url()); 231 $(rtmp_url).val(build_default_rtmp_url());
232 } 232 }
@@ -238,15 +238,44 @@ function srs_init(rtmp_url, hls_url, modal_player) { @@ -238,15 +238,44 @@ function srs_init(rtmp_url, hls_url, modal_player) {
238 $(modal_player).css("margin-left", "-" + srs_get_player_modal() / 2 +"px"); 238 $(modal_player).css("margin-left", "-" + srs_get_player_modal() / 2 +"px");
239 } 239 }
240 } 240 }
  241 +
241 // for the chat to init the publish url. 242 // for the chat to init the publish url.
242 function srs_init_publish(rtmp_url) { 243 function srs_init_publish(rtmp_url) {
243 update_nav(); 244 update_nav();
244 - 245 +
245 if (rtmp_url) { 246 if (rtmp_url) {
246 $(rtmp_url).val(build_default_publish_rtmp_url()); 247 $(rtmp_url).val(build_default_publish_rtmp_url());
247 } 248 }
248 } 249 }
249 250
  251 +// for bw to init url
  252 +// url: scheme://host:port/path?query#fragment
  253 +function srs_init_bwt(rtmp_url, hls_url) {
  254 + update_nav();
  255 +
  256 + if (rtmp_url) {
  257 + //var query = parse_query_string();
  258 + var search_filed = String(window.location.search).replace(" ", "").split("?")[1];
  259 + $(rtmp_url).val("rtmp://" + window.location.host + ":" + 1935 + "/app?" + search_filed);
  260 + }
  261 + if (hls_url) {
  262 + $(hls_url).val(build_default_hls_url());
  263 + }
  264 +}
  265 +
  266 +function srs_bwt_check_url(url) {
  267 + if (url.indexOf("key") != -1 && url.indexOf("vhost") != -1) {
  268 + return true;
  269 + }
  270 +
  271 + return false;
  272 +}
  273 +
  274 +function srs_bwt_build_default_url() {
  275 + var url_default = "rtmp://" + window.location.host + ":" + 1935 + "/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com";
  276 + return url_default;
  277 +}
  278 +
250 /** 279 /**
251 * when publisher ready, init the page elements. 280 * when publisher ready, init the page elements.
252 */ 281 */
@@ -265,59 +294,59 @@ function srs_publisher_initialize_page( @@ -265,59 +294,59 @@ function srs_publisher_initialize_page(
265 break; 294 break;
266 } 295 }
267 } 296 }
268 - 297 +
269 $(sl_microphones).empty(); 298 $(sl_microphones).empty();
270 for (var i = 0; i < microphones.length; i++) { 299 for (var i = 0; i < microphones.length; i++) {
271 $(sl_microphones).append("<option value='" + i + "'>" + microphones[i] + "</option"); 300 $(sl_microphones).append("<option value='" + i + "'>" + microphones[i] + "</option");
272 } 301 }
273 - 302 +
274 $(sl_vcodec).empty(); 303 $(sl_vcodec).empty();
275 var vcodecs = ["h264", "vp6"]; 304 var vcodecs = ["h264", "vp6"];
276 for (var i = 0; i < vcodecs.length; i++) { 305 for (var i = 0; i < vcodecs.length; i++) {
277 $(sl_vcodec).append("<option value='" + vcodecs[i] + "'>" + vcodecs[i] + "</option"); 306 $(sl_vcodec).append("<option value='" + vcodecs[i] + "'>" + vcodecs[i] + "</option");
278 } 307 }
279 - 308 +
280 $(sl_profile).empty(); 309 $(sl_profile).empty();
281 var profiles = ["baseline", "main"]; 310 var profiles = ["baseline", "main"];
282 for (var i = 0; i < profiles.length; i++) { 311 for (var i = 0; i < profiles.length; i++) {
283 $(sl_profile).append("<option value='" + profiles[i] + "'>" + profiles[i] + "</option"); 312 $(sl_profile).append("<option value='" + profiles[i] + "'>" + profiles[i] + "</option");
284 } 313 }
285 $(sl_profile + " option[value='main']").attr("selected", true); 314 $(sl_profile + " option[value='main']").attr("selected", true);
286 - 315 +
287 $(sl_level).empty(); 316 $(sl_level).empty();
288 - var levels = ["1", "1b", "1.1", "1.2", "1.3", 317 + var levels = ["1", "1b", "1.1", "1.2", "1.3",
289 "2", "2.1", "2.2", "3", "3.1", "3.2", "4", "4.1", "4.2", "5", "5.1"]; 318 "2", "2.1", "2.2", "3", "3.1", "3.2", "4", "4.1", "4.2", "5", "5.1"];
290 for (var i = 0; i < levels.length; i++) { 319 for (var i = 0; i < levels.length; i++) {
291 $(sl_level).append("<option value='" + levels[i] + "'>" + levels[i] + "</option"); 320 $(sl_level).append("<option value='" + levels[i] + "'>" + levels[i] + "</option");
292 } 321 }
293 $(sl_level + " option[value='4.1']").attr("selected", true); 322 $(sl_level + " option[value='4.1']").attr("selected", true);
294 - 323 +
295 $(sl_gop).empty(); 324 $(sl_gop).empty();
296 - var gops = ["0.3", "0.5", "1", "2", "3", "4", 325 + var gops = ["0.3", "0.5", "1", "2", "3", "4",
297 "5", "6", "7", "8", "9", "10", "15", "20"]; 326 "5", "6", "7", "8", "9", "10", "15", "20"];
298 for (var i = 0; i < gops.length; i++) { 327 for (var i = 0; i < gops.length; i++) {
299 $(sl_gop).append("<option value='" + gops[i] + "'>" + gops[i] + "秒</option"); 328 $(sl_gop).append("<option value='" + gops[i] + "'>" + gops[i] + "秒</option");
300 } 329 }
301 $(sl_gop + " option[value='10']").attr("selected", true); 330 $(sl_gop + " option[value='10']").attr("selected", true);
302 - 331 +
303 $(sl_size).empty(); 332 $(sl_size).empty();
304 - var sizes = ["176x144", "320x240", "352x240",  
305 - "352x288", "460x240", "640x480", "720x480", "720x576", "800x600", 333 + var sizes = ["176x144", "320x240", "352x240",
  334 + "352x288", "460x240", "640x480", "720x480", "720x576", "800x600",
306 "1024x768", "1280x720", "1360x768", "1920x1080"]; 335 "1024x768", "1280x720", "1360x768", "1920x1080"];
307 for (i = 0; i < sizes.length; i++) { 336 for (i = 0; i < sizes.length; i++) {
308 $(sl_size).append("<option value='" + sizes[i] + "'>" + sizes[i] + "</option"); 337 $(sl_size).append("<option value='" + sizes[i] + "'>" + sizes[i] + "</option");
309 } 338 }
310 $(sl_size + " option[value='640x480']").attr("selected", true); 339 $(sl_size + " option[value='640x480']").attr("selected", true);
311 - 340 +
312 $(sl_fps).empty(); 341 $(sl_fps).empty();
313 var fpses = ["5", "10", "15", "20", "24", "25", "29.97", "30"]; 342 var fpses = ["5", "10", "15", "20", "24", "25", "29.97", "30"];
314 for (i = 0; i < fpses.length; i++) { 343 for (i = 0; i < fpses.length; i++) {
315 $(sl_fps).append("<option value='" + fpses[i] + "'>" + Number(fpses[i]).toFixed(2) + " 帧/秒</option"); 344 $(sl_fps).append("<option value='" + fpses[i] + "'>" + Number(fpses[i]).toFixed(2) + " 帧/秒</option");
316 } 345 }
317 $(sl_fps + " option[value='20']").attr("selected", true); 346 $(sl_fps + " option[value='20']").attr("selected", true);
318 - 347 +
319 $(sl_bitrate).empty(); 348 $(sl_bitrate).empty();
320 - var bitrates = ["50", "200", "350", "500", "650", "800", 349 + var bitrates = ["50", "200", "350", "500", "650", "800",
321 "950", "1000", "1200", "1500", "1800", "2000", "3000", "5000"]; 350 "950", "1000", "1200", "1500", "1800", "2000", "3000", "5000"];
322 for (i = 0; i < bitrates.length; i++) { 351 for (i = 0; i < bitrates.length; i++) {
323 $(sl_bitrate).append("<option value='" + bitrates[i] + "'>" + bitrates[i] + " kbps</option"); 352 $(sl_bitrate).append("<option value='" + bitrates[i] + "'>" + bitrates[i] + " kbps</option");
@@ -342,59 +371,59 @@ function srs_chat_initialize_page( @@ -342,59 +371,59 @@ function srs_chat_initialize_page(
342 break; 371 break;
343 } 372 }
344 } 373 }
345 - 374 +
346 $(sl_microphones).empty(); 375 $(sl_microphones).empty();
347 for (var i = 0; i < microphones.length; i++) { 376 for (var i = 0; i < microphones.length; i++) {
348 $(sl_microphones).append("<option value='" + i + "'>" + microphones[i] + "</option"); 377 $(sl_microphones).append("<option value='" + i + "'>" + microphones[i] + "</option");
349 } 378 }
350 - 379 +
351 $(sl_vcodec).empty(); 380 $(sl_vcodec).empty();
352 var vcodecs = ["h264", "vp6"]; 381 var vcodecs = ["h264", "vp6"];
353 for (var i = 0; i < vcodecs.length; i++) { 382 for (var i = 0; i < vcodecs.length; i++) {
354 $(sl_vcodec).append("<option value='" + vcodecs[i] + "'>" + vcodecs[i] + "</option"); 383 $(sl_vcodec).append("<option value='" + vcodecs[i] + "'>" + vcodecs[i] + "</option");
355 } 384 }
356 - 385 +
357 $(sl_profile).empty(); 386 $(sl_profile).empty();
358 var profiles = ["baseline", "main"]; 387 var profiles = ["baseline", "main"];
359 for (var i = 0; i < profiles.length; i++) { 388 for (var i = 0; i < profiles.length; i++) {
360 $(sl_profile).append("<option value='" + profiles[i] + "'>" + profiles[i] + "</option"); 389 $(sl_profile).append("<option value='" + profiles[i] + "'>" + profiles[i] + "</option");
361 } 390 }
362 $(sl_profile + " option[value='baseline']").attr("selected", true); 391 $(sl_profile + " option[value='baseline']").attr("selected", true);
363 - 392 +
364 $(sl_level).empty(); 393 $(sl_level).empty();
365 - var levels = ["1", "1b", "1.1", "1.2", "1.3", 394 + var levels = ["1", "1b", "1.1", "1.2", "1.3",
366 "2", "2.1", "2.2", "3", "3.1", "3.2", "4", "4.1", "4.2", "5", "5.1"]; 395 "2", "2.1", "2.2", "3", "3.1", "3.2", "4", "4.1", "4.2", "5", "5.1"];
367 for (var i = 0; i < levels.length; i++) { 396 for (var i = 0; i < levels.length; i++) {
368 $(sl_level).append("<option value='" + levels[i] + "'>" + levels[i] + "</option"); 397 $(sl_level).append("<option value='" + levels[i] + "'>" + levels[i] + "</option");
369 } 398 }
370 $(sl_level + " option[value='3.1']").attr("selected", true); 399 $(sl_level + " option[value='3.1']").attr("selected", true);
371 - 400 +
372 $(sl_gop).empty(); 401 $(sl_gop).empty();
373 - var gops = ["0.3", "0.5", "1", "2", "3", "4", 402 + var gops = ["0.3", "0.5", "1", "2", "3", "4",
374 "5", "6", "7", "8", "9", "10", "15", "20"]; 403 "5", "6", "7", "8", "9", "10", "15", "20"];
375 for (var i = 0; i < gops.length; i++) { 404 for (var i = 0; i < gops.length; i++) {
376 $(sl_gop).append("<option value='" + gops[i] + "'>" + gops[i] + "秒</option"); 405 $(sl_gop).append("<option value='" + gops[i] + "'>" + gops[i] + "秒</option");
377 } 406 }
378 $(sl_gop + " option[value='0.5']").attr("selected", true); 407 $(sl_gop + " option[value='0.5']").attr("selected", true);
379 - 408 +
380 $(sl_size).empty(); 409 $(sl_size).empty();
381 - var sizes = ["176x144", "320x240", "352x240",  
382 - "352x288", "460x240", "640x480", "720x480", "720x576", "800x600", 410 + var sizes = ["176x144", "320x240", "352x240",
  411 + "352x288", "460x240", "640x480", "720x480", "720x576", "800x600",
383 "1024x768", "1280x720", "1360x768", "1920x1080"]; 412 "1024x768", "1280x720", "1360x768", "1920x1080"];
384 for (i = 0; i < sizes.length; i++) { 413 for (i = 0; i < sizes.length; i++) {
385 $(sl_size).append("<option value='" + sizes[i] + "'>" + sizes[i] + "</option"); 414 $(sl_size).append("<option value='" + sizes[i] + "'>" + sizes[i] + "</option");
386 } 415 }
387 $(sl_size + " option[value='460x240']").attr("selected", true); 416 $(sl_size + " option[value='460x240']").attr("selected", true);
388 - 417 +
389 $(sl_fps).empty(); 418 $(sl_fps).empty();
390 var fpses = ["5", "10", "15", "20", "24", "25", "29.97", "30"]; 419 var fpses = ["5", "10", "15", "20", "24", "25", "29.97", "30"];
391 for (i = 0; i < fpses.length; i++) { 420 for (i = 0; i < fpses.length; i++) {
392 $(sl_fps).append("<option value='" + fpses[i] + "'>" + Number(fpses[i]).toFixed(2) + " 帧/秒</option"); 421 $(sl_fps).append("<option value='" + fpses[i] + "'>" + Number(fpses[i]).toFixed(2) + " 帧/秒</option");
393 } 422 }
394 $(sl_fps + " option[value='15']").attr("selected", true); 423 $(sl_fps + " option[value='15']").attr("selected", true);
395 - 424 +
396 $(sl_bitrate).empty(); 425 $(sl_bitrate).empty();
397 - var bitrates = ["50", "200", "350", "500", "650", "800", 426 + var bitrates = ["50", "200", "350", "500", "650", "800",
398 "950", "1000", "1200", "1500", "1800", "2000", "3000", "5000"]; 427 "950", "1000", "1200", "1500", "1800", "2000", "3000", "5000"];
399 for (i = 0; i < bitrates.length; i++) { 428 for (i = 0; i < bitrates.length; i++) {
400 $(sl_bitrate).append("<option value='" + bitrates[i] + "'>" + bitrates[i] + " kbps</option"); 429 $(sl_bitrate).append("<option value='" + bitrates[i] + "'>" + bitrates[i] + " kbps</option");
@@ -410,10 +439,10 @@ function srs_publiser_get_codec( @@ -410,10 +439,10 @@ function srs_publiser_get_codec(
410 ) { 439 ) {
411 acodec.device_code = $(sl_microphones).val(); 440 acodec.device_code = $(sl_microphones).val();
412 acodec.device_name = $(sl_microphones).text(); 441 acodec.device_name = $(sl_microphones).text();
413 - 442 +
414 vcodec.device_code = $(sl_cameras).find("option:selected").val(); 443 vcodec.device_code = $(sl_cameras).find("option:selected").val();
415 vcodec.device_name = $(sl_cameras).find("option:selected").text(); 444 vcodec.device_name = $(sl_cameras).find("option:selected").text();
416 - 445 +
417 vcodec.codec = $(sl_vcodec).find("option:selected").val(); 446 vcodec.codec = $(sl_vcodec).find("option:selected").val();
418 vcodec.profile = $(sl_profile).find("option:selected").val(); 447 vcodec.profile = $(sl_profile).find("option:selected").val();
419 vcodec.level = $(sl_level).find("option:selected").val(); 448 vcodec.level = $(sl_level).find("option:selected").val();
@@ -431,7 +460,7 @@ function srs_publiser_get_codec( @@ -431,7 +460,7 @@ function srs_publiser_get_codec(
431 * @param container the html container id. 460 * @param container the html container id.
432 * @param width a float value specifies the width of player. 461 * @param width a float value specifies the width of player.
433 * @param height a float value specifies the height of player. 462 * @param height a float value specifies the height of player.
434 -* @param private_object [optional] an object that used as private object, 463 +* @param private_object [optional] an object that used as private object,
435 * for example, the logic chat object which owner this player. 464 * for example, the logic chat object which owner this player.
436 */ 465 */
437 function SrsPlayer(container, width, height, private_object) { 466 function SrsPlayer(container, width, height, private_object) {
@@ -441,9 +470,9 @@ function SrsPlayer(container, width, height, private_object) { @@ -441,9 +470,9 @@ function SrsPlayer(container, width, height, private_object) {
441 if (!SrsPlayer.__players) { 470 if (!SrsPlayer.__players) {
442 SrsPlayer.__players = []; 471 SrsPlayer.__players = [];
443 } 472 }
444 - 473 +
445 SrsPlayer.__players.push(this); 474 SrsPlayer.__players.push(this);
446 - 475 +
447 this.private_object = private_object; 476 this.private_object = private_object;
448 this.container = container; 477 this.container = container;
449 this.width = width; 478 this.width = width;
@@ -452,7 +481,7 @@ function SrsPlayer(container, width, height, private_object) { @@ -452,7 +481,7 @@ function SrsPlayer(container, width, height, private_object) {
452 this.stream_url = null; 481 this.stream_url = null;
453 this.buffer_time = 0.8; // default to 0.8 482 this.buffer_time = 0.8; // default to 0.8
454 this.callbackObj = null; 483 this.callbackObj = null;
455 - 484 +
456 // callback set the following values. 485 // callback set the following values.
457 this.meatadata = {}; // for on_player_metadata 486 this.meatadata = {}; // for on_player_metadata
458 this.time = 0; // current stream time. 487 this.time = 0; // current stream time.
@@ -469,25 +498,25 @@ SrsPlayer.prototype.start = function(url) { @@ -469,25 +498,25 @@ SrsPlayer.prototype.start = function(url) {
469 if (url) { 498 if (url) {
470 this.stream_url = url; 499 this.stream_url = url;
471 } 500 }
472 - 501 +
473 // embed the flash. 502 // embed the flash.
474 var flashvars = {}; 503 var flashvars = {};
475 flashvars.id = this.id; 504 flashvars.id = this.id;
476 flashvars.on_player_ready = "__srs_on_player_ready"; 505 flashvars.on_player_ready = "__srs_on_player_ready";
477 flashvars.on_player_metadata = "__srs_on_player_metadata"; 506 flashvars.on_player_metadata = "__srs_on_player_metadata";
478 flashvars.on_player_timer = "__srs_on_player_timer"; 507 flashvars.on_player_timer = "__srs_on_player_timer";
479 - 508 +
480 var params = {}; 509 var params = {};
481 params.wmode = "opaque"; 510 params.wmode = "opaque";
482 params.allowFullScreen = "true"; 511 params.allowFullScreen = "true";
483 params.allowScriptAccess = "always"; 512 params.allowScriptAccess = "always";
484 - 513 +
485 var attributes = {}; 514 var attributes = {};
486 - 515 +
487 var self = this; 516 var self = this;
488 - 517 +
489 swfobject.embedSWF( 518 swfobject.embedSWF(
490 - "srs_player/release/srs_player.swf?_version="+srs_get_version_code(), 519 + "srs_player/release/srs_player.swf?_version="+srs_get_version_code(),
491 this.container, 520 this.container,
492 this.width, this.height, 521 this.width, this.height,
493 "11.1", "js/AdobeFlashPlayerInstall.swf", 522 "11.1", "js/AdobeFlashPlayerInstall.swf",
@@ -496,7 +525,7 @@ SrsPlayer.prototype.start = function(url) { @@ -496,7 +525,7 @@ SrsPlayer.prototype.start = function(url) {
496 self.callbackObj = callbackObj; 525 self.callbackObj = callbackObj;
497 } 526 }
498 ); 527 );
499 - 528 +
500 return this; 529 return this;
501 } 530 }
502 /** 531 /**
@@ -512,15 +541,15 @@ SrsPlayer.prototype.play = function(url) { @@ -512,15 +541,15 @@ SrsPlayer.prototype.play = function(url) {
512 SrsPlayer.prototype.stop = function() { 541 SrsPlayer.prototype.stop = function() {
513 for (var i = 0; i < SrsPlayer.__players.length; i++) { 542 for (var i = 0; i < SrsPlayer.__players.length; i++) {
514 var player = SrsPlayer.__players[i]; 543 var player = SrsPlayer.__players[i];
515 - 544 +
516 if (player.id != this.id) { 545 if (player.id != this.id) {
517 continue; 546 continue;
518 } 547 }
519 - 548 +
520 SrsPlayer.__players.splice(i, 1); 549 SrsPlayer.__players.splice(i, 1);
521 break; 550 break;
522 } 551 }
523 - 552 +
524 this.callbackObj.ref.__stop(); 553 this.callbackObj.ref.__stop();
525 } 554 }
526 SrsPlayer.prototype.pause = function() { 555 SrsPlayer.prototype.pause = function() {
@@ -531,10 +560,10 @@ SrsPlayer.prototype.resume = function() { @@ -531,10 +560,10 @@ SrsPlayer.prototype.resume = function() {
531 } 560 }
532 /** 561 /**
533 * to set the DAR, for example, DAR=16:9 562 * to set the DAR, for example, DAR=16:9
534 -* @param num, for example, 9. 563 +* @param num, for example, 9.
535 * use metadata height if 0. 564 * use metadata height if 0.
536 * use user specified height if -1. 565 * use user specified height if -1.
537 -* @param den, for example, 16. 566 +* @param den, for example, 16.
538 * use metadata width if 0. 567 * use metadata width if 0.
539 * use user specified width if -1. 568 * use user specified width if -1.
540 */ 569 */
@@ -571,14 +600,14 @@ SrsPlayer.prototype.on_player_timer = function(time, buffer_length) { @@ -571,14 +600,14 @@ SrsPlayer.prototype.on_player_timer = function(time, buffer_length) {
571 function __srs_find_player(id) { 600 function __srs_find_player(id) {
572 for (var i = 0; i < SrsPlayer.__players.length; i++) { 601 for (var i = 0; i < SrsPlayer.__players.length; i++) {
573 var player = SrsPlayer.__players[i]; 602 var player = SrsPlayer.__players[i];
574 - 603 +
575 if (player.id != id) { 604 if (player.id != id) {
576 continue; 605 continue;
577 } 606 }
578 - 607 +
579 return player; 608 return player;
580 } 609 }
581 - 610 +
582 throw new Error("player not found. id=" + id); 611 throw new Error("player not found. id=" + id);
583 } 612 }
584 function __srs_on_player_ready(id) { 613 function __srs_on_player_ready(id) {
@@ -587,26 +616,26 @@ function __srs_on_player_ready(id) { @@ -587,26 +616,26 @@ function __srs_on_player_ready(id) {
587 } 616 }
588 function __srs_on_player_metadata(id, metadata) { 617 function __srs_on_player_metadata(id, metadata) {
589 var player = __srs_find_player(id); 618 var player = __srs_find_player(id);
590 -  
591 - // user may override the on_player_metadata, 619 +
  620 + // user may override the on_player_metadata,
592 // so set the data before invoke it. 621 // so set the data before invoke it.
593 player.metadata = metadata; 622 player.metadata = metadata;
594 - 623 +
595 player.on_player_metadata(metadata); 624 player.on_player_metadata(metadata);
596 } 625 }
597 function __srs_on_player_timer(id, time, buffer_length) { 626 function __srs_on_player_timer(id, time, buffer_length) {
598 var player = __srs_find_player(id); 627 var player = __srs_find_player(id);
599 - 628 +
600 buffer_length = Math.max(0, buffer_length); 629 buffer_length = Math.max(0, buffer_length);
601 buffer_length = Math.min(player.buffer_time, buffer_length); 630 buffer_length = Math.min(player.buffer_time, buffer_length);
602 - 631 +
603 time = Math.max(0, time); 632 time = Math.max(0, time);
604 -  
605 - // user may override the on_player_timer, 633 +
  634 + // user may override the on_player_timer,
606 // so set the data before invoke it. 635 // so set the data before invoke it.
607 player.time = time; 636 player.time = time;
608 player.buffer_length = buffer_length; 637 player.buffer_length = buffer_length;
609 - 638 +
610 player.on_player_timer(time, buffer_length); 639 player.on_player_timer(time, buffer_length);
611 } 640 }
612 641
@@ -618,7 +647,7 @@ function __srs_on_player_timer(id, time, buffer_length) { @@ -618,7 +647,7 @@ function __srs_on_player_timer(id, time, buffer_length) {
618 * @param container the html container id. 647 * @param container the html container id.
619 * @param width a float value specifies the width of publisher. 648 * @param width a float value specifies the width of publisher.
620 * @param height a float value specifies the height of publisher. 649 * @param height a float value specifies the height of publisher.
621 -* @param private_object [optional] an object that used as private object, 650 +* @param private_object [optional] an object that used as private object,
622 * for example, the logic chat object which owner this publisher. 651 * for example, the logic chat object which owner this publisher.
623 */ 652 */
624 function SrsPublisher(container, width, height, private_object) { 653 function SrsPublisher(container, width, height, private_object) {
@@ -628,31 +657,31 @@ function SrsPublisher(container, width, height, private_object) { @@ -628,31 +657,31 @@ function SrsPublisher(container, width, height, private_object) {
628 if (!SrsPublisher.__publishers) { 657 if (!SrsPublisher.__publishers) {
629 SrsPublisher.__publishers = []; 658 SrsPublisher.__publishers = [];
630 } 659 }
631 - 660 +
632 SrsPublisher.__publishers.push(this); 661 SrsPublisher.__publishers.push(this);
633 - 662 +
634 this.private_object = private_object; 663 this.private_object = private_object;
635 this.container = container; 664 this.container = container;
636 this.width = width; 665 this.width = width;
637 this.height = height; 666 this.height = height;
638 this.id = SrsPublisher.__id++; 667 this.id = SrsPublisher.__id++;
639 this.callbackObj = null; 668 this.callbackObj = null;
640 - 669 +
641 // set the values when publish. 670 // set the values when publish.
642 this.url = null; 671 this.url = null;
643 this.vcodec = {}; 672 this.vcodec = {};
644 this.acodec = {}; 673 this.acodec = {};
645 - 674 +
646 // callback set the following values. 675 // callback set the following values.
647 this.cameras = []; 676 this.cameras = [];
648 this.microphones = []; 677 this.microphones = [];
649 this.code = 0; 678 this.code = 0;
650 - 679 +
651 // error code defines. 680 // error code defines.
652 this.errors = { 681 this.errors = {
653 - "100": "无法获取指定的摄像头", //error_camera_get  
654 - "101": "无法获取指定的麦克风", //error_microphone_get  
655 - "102": "摄像头为禁用状态,推流时请允许flash访问摄像头", //error_camera_muted 682 + "100": "无法获取指定的摄像头", //error_camera_get
  683 + "101": "无法获取指定的麦克风", //error_microphone_get
  684 + "102": "摄像头为禁用状态,推流时请允许flash访问摄像头", //error_camera_muted
656 }; 685 };
657 } 686 }
658 /** 687 /**
@@ -669,18 +698,18 @@ SrsPublisher.prototype.start = function() { @@ -669,18 +698,18 @@ SrsPublisher.prototype.start = function() {
669 flashvars.on_publisher_ready = "__srs_on_publisher_ready"; 698 flashvars.on_publisher_ready = "__srs_on_publisher_ready";
670 flashvars.on_publisher_error = "__srs_on_publisher_error"; 699 flashvars.on_publisher_error = "__srs_on_publisher_error";
671 flashvars.on_publisher_warn = "__srs_on_publisher_warn"; 700 flashvars.on_publisher_warn = "__srs_on_publisher_warn";
672 - 701 +
673 var params = {}; 702 var params = {};
674 params.wmode = "opaque"; 703 params.wmode = "opaque";
675 params.allowFullScreen = "true"; 704 params.allowFullScreen = "true";
676 params.allowScriptAccess = "always"; 705 params.allowScriptAccess = "always";
677 - 706 +
678 var attributes = {}; 707 var attributes = {};
679 - 708 +
680 var self = this; 709 var self = this;
681 - 710 +
682 swfobject.embedSWF( 711 swfobject.embedSWF(
683 - "srs_publisher/release/srs_publisher.swf?_version="+srs_get_version_code(), 712 + "srs_publisher/release/srs_publisher.swf?_version="+srs_get_version_code(),
684 this.container, 713 this.container,
685 this.width, this.height, 714 this.width, this.height,
686 "11.1", "js/AdobeFlashPlayerInstall.swf", 715 "11.1", "js/AdobeFlashPlayerInstall.swf",
@@ -689,7 +718,7 @@ SrsPublisher.prototype.start = function() { @@ -689,7 +718,7 @@ SrsPublisher.prototype.start = function() {
689 self.callbackObj = callbackObj; 718 self.callbackObj = callbackObj;
690 } 719 }
691 ); 720 );
692 - 721 +
693 return this; 722 return this;
694 } 723 }
695 /** 724 /**
@@ -702,7 +731,7 @@ SrsPublisher.prototype.publish = function(url, vcodec, acodec) { @@ -702,7 +731,7 @@ SrsPublisher.prototype.publish = function(url, vcodec, acodec) {
702 this.url = url; 731 this.url = url;
703 this.vcodec = vcodec; 732 this.vcodec = vcodec;
704 this.acodec = acodec; 733 this.acodec = acodec;
705 - 734 +
706 this.callbackObj.ref.__publish(url, this.width, this.height, vcodec, acodec); 735 this.callbackObj.ref.__publish(url, this.width, this.height, vcodec, acodec);
707 } 736 }
708 SrsPublisher.prototype.stop = function() { 737 SrsPublisher.prototype.stop = function() {
@@ -729,36 +758,36 @@ SrsPublisher.prototype.on_publisher_warn = function(code, desc) { @@ -729,36 +758,36 @@ SrsPublisher.prototype.on_publisher_warn = function(code, desc) {
729 function __srs_find_publisher(id) { 758 function __srs_find_publisher(id) {
730 for (var i = 0; i < SrsPublisher.__publishers.length; i++) { 759 for (var i = 0; i < SrsPublisher.__publishers.length; i++) {
731 var publisher = SrsPublisher.__publishers[i]; 760 var publisher = SrsPublisher.__publishers[i];
732 - 761 +
733 if (publisher.id != id) { 762 if (publisher.id != id) {
734 continue; 763 continue;
735 } 764 }
736 - 765 +
737 return publisher; 766 return publisher;
738 } 767 }
739 - 768 +
740 throw new Error("publisher not found. id=" + id); 769 throw new Error("publisher not found. id=" + id);
741 } 770 }
742 function __srs_on_publisher_ready(id, cameras, microphones) { 771 function __srs_on_publisher_ready(id, cameras, microphones) {
743 var publisher = __srs_find_publisher(id); 772 var publisher = __srs_find_publisher(id);
744 - 773 +
745 publisher.cameras = cameras; 774 publisher.cameras = cameras;
746 publisher.microphones = microphones; 775 publisher.microphones = microphones;
747 - 776 +
748 publisher.on_publisher_ready(cameras, microphones); 777 publisher.on_publisher_ready(cameras, microphones);
749 } 778 }
750 function __srs_on_publisher_error(id, code) { 779 function __srs_on_publisher_error(id, code) {
751 var publisher = __srs_find_publisher(id); 780 var publisher = __srs_find_publisher(id);
752 - 781 +
753 publisher.code = code; 782 publisher.code = code;
754 - 783 +
755 publisher.on_publisher_error(code, publisher.errors[""+code]); 784 publisher.on_publisher_error(code, publisher.errors[""+code]);
756 } 785 }
757 function __srs_on_publisher_warn(id, code) { 786 function __srs_on_publisher_warn(id, code) {
758 var publisher = __srs_find_publisher(id); 787 var publisher = __srs_find_publisher(id);
759 - 788 +
760 publisher.code = code; 789 publisher.code = code;
761 - 790 +
762 publisher.on_publisher_warn(code, publisher.errors[""+code]); 791 publisher.on_publisher_warn(code, publisher.errors[""+code]);
763 } 792 }
764 793
@@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
53 // get the vhost and port to set the default url. 53 // get the vhost and port to set the default url.
54 // for example: http://192.168.1.213/players/jwplayer6.html?port=1935&vhost=demo 54 // for example: http://192.168.1.213/players/jwplayer6.html?port=1935&vhost=demo
55 // url set to: rtmp://demo:1935/live/livestream 55 // url set to: rtmp://demo:1935/live/livestream
56 - srs_init("#txt_url", null, "#main_modal"); 56 + //srs_init("#txt_url", null, "#main_modal");
57 57
58 $("#main_modal").on("hide", function(){ 58 $("#main_modal").on("hide", function(){
59 osmf_play("http://localhost"); 59 osmf_play("http://localhost");
@@ -12,11 +12,107 @@ @@ -12,11 +12,107 @@
12 body{ 12 body{
13 padding-top: 55px; 13 padding-top: 55px;
14 } 14 }
  15 + #main_modal {
  16 + width: 600px;
  17 + margin-left: -300px;
  18 + }
  19 + #check_status {
  20 + margin-left: 20px;
  21 + margin-top: -55px;
  22 + }
  23 + #pb_buffer_bg {
  24 + margin-top: 40px;
  25 + margin-bottom: 10px;
  26 + }
15 </style> 27 </style>
16 <script type="text/javascript"> 28 <script type="text/javascript">
  29 +
  30 + function update_progress(percent) {
  31 + $("#progress_bar").width(percent);
  32 + }
  33 +
  34 + function progress_reset() {
  35 + $("#progress_bar").width("0%");
  36 + }
  37 +
  38 + function update_status(text) {
  39 + $("#check_status").text(text);
  40 + }
  41 +
  42 + function get_swf_width() {
  43 + return 1;
  44 + }
  45 +
  46 + function get_swf_height() {
  47 + return 1;
  48 + }
  49 +
  50 + function show_modal() {
  51 + $("#main_modal").modal({show:true, keyboard:false});
  52 + }
  53 +
  54 + function band_check(url) {
  55 +
  56 + // remove flash contet
  57 + var bw_div = $("<div/>");
  58 + $(bw_div).attr("id", "bw_div");
  59 + $("#bw_center").append(bw_div);
  60 +
  61 + var flashvars = {};
  62 + flashvars.url = url;
  63 + flashvars.update_progress = "update_progress";
  64 + flashvars.progress_reset = "progress_reset";
  65 + flashvars.update_status = "update_status";
  66 +
  67 + var params = {};
  68 + params.allowFullScreen = true;
  69 +
  70 + var attributes = {};
  71 +
  72 + swfobject.embedSWF(
  73 + "srs_bwt/release/srs_bwt.swf", "bw_div",
  74 + get_swf_width(), get_swf_height(),
  75 + "11.1.0", "js/AdobeFlashPlayerInstall.swf",
  76 + flashvars, params, attributes
  77 + );
  78 + }
  79 +
17 $(function(){ 80 $(function(){
18 update_nav(); 81 update_nav();
19 - }); 82 + srs_init_bwt("#txt_url");
  83 +
  84 + var txt_input = $("#txt_url").val();
  85 + // if valid ?
  86 + if (!srs_bwt_check_url(txt_input)) {
  87 + $("#txt_url").val(srs_bwt_build_default_url());
  88 + }
  89 +
  90 + $("#main_modal").on(
  91 + "show",
  92 + function()
  93 + {
  94 + progress_reset();
  95 + update_status("");
  96 + var url = $("#txt_url").val();
  97 + /*!
  98 + url encode
  99 + */
  100 + url = escape(url);
  101 + band_check(url);
  102 + }
  103 + );
  104 +
  105 + $("#main_modal").on("hide", function(){
  106 + $("#bw_div").remove();
  107 + });
  108 +
  109 + $("#btn_play").click(
  110 + function()
  111 + {
  112 + $("#main_modal").modal({show:true, keyboard:false});
  113 + }
  114 + );
  115 + });
20 </script> 116 </script>
21 </head> 117 </head>
22 <body> 118 <body>
@@ -39,6 +135,34 @@ @@ -39,6 +135,34 @@
39 </div> 135 </div>
40 </div> 136 </div>
41 <div class="container"> 137 <div class="container">
  138 +
  139 + <div class="form-inline">
  140 + URL:
  141 + <input type="text" id="txt_url" class="input-xxlarge" value="" placeholder="例如:rtmp://host:port/app?key=xx&vhost=yy"></input>
  142 + <button class="btn btn-primary" id="btn_play">开始测速</button>
  143 + </div>
  144 +
  145 + <div id="main_modal" class="modal hide fade">
  146 + <div class="modal-header">
  147 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
  148 + <h3>SRS Band Check</h3>
  149 + </div>
  150 + <div class="modal-body">
  151 + <div id="player"></div>
  152 + <div class="progress progress-striped active" id="pb_buffer_bg">
  153 + <div class="bar" style="width: 50%;" id="progress_bar"></div>
  154 + </div>
  155 + </div>
  156 +
  157 + <div class="modal-body" id="bw_center">
  158 + </div>
  159 + <span id="check_status1"><font ><strong id="check_status">status</strong></font> </span>
  160 +
  161 + <div class="modal-footer">
  162 + <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true"> 关闭 </button>
  163 + </div>
  164 + </div>
  165 +
42 <hr> 166 <hr>
43 <footer> 167 <footer>
44 <p><a href="https://github.com/winlinvip/simple-rtmp-server">SRS Team &copy; 2013</a></p> 168 <p><a href="https://github.com/winlinvip/simple-rtmp-server">SRS Team &copy; 2013</a></p>
@@ -40,6 +40,8 @@ cat<<END @@ -40,6 +40,8 @@ cat<<END
40 http://$ip/players/srs_publisher.html?vhost=players 40 http://$ip/players/srs_publisher.html?vhost=players
41 视频会议(聊天室)应用演示: 41 视频会议(聊天室)应用演示:
42 http://$ip/players/srs_chat.html?vhost=players 42 http://$ip/players/srs_chat.html?vhost=players
  43 +默认的测速应用演示:
  44 + http://$ip/players/srs_bwt.html?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com
43 END 45 END
44 echo -e "${GREEN}演示地址:${BLACK}" 46 echo -e "${GREEN}演示地址:${BLACK}"
45 echo -e "${RED} http://$ip${BLACK}" 47 echo -e "${RED} http://$ip${BLACK}"