winlin

add low latecy player

@@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
16 <script type="text/javascript"> 16 <script type="text/javascript">
17 var srs_publisher = null; 17 var srs_publisher = null;
18 var remote_player = null; 18 var remote_player = null;
  19 + var realtime_player = null;
19 20
20 $(function(){ 21 $(function(){
21 // get the vhost and port to set the default url. 22 // get the vhost and port to set the default url.
@@ -33,6 +34,9 @@ @@ -33,6 +34,9 @@
33 $("#remote_tips").tooltip({ 34 $("#remote_tips").tooltip({
34 title: "为了支持HLS输出,FLASH编码器输出的流需要经过转码(VP6=>H264,MP3=>aac),所以会黑屏较长时间,请耐心等待" 35 title: "为了支持HLS输出,FLASH编码器输出的流需要经过转码(VP6=>H264,MP3=>aac),所以会黑屏较长时间,请耐心等待"
35 }); 36 });
  37 + $("#low_latecy_tips").tooltip({
  38 + title: "服务器不转码直接转发FLASH编码器的流,所以延迟比支持HLS的流要低很多"
  39 + });
36 40
37 $("#btn_publish").click(on_user_publish); 41 $("#btn_publish").click(on_user_publish);
38 42
@@ -120,11 +124,17 @@ @@ -120,11 +124,17 @@
120 }; 124 };
121 srs_publisher.start(); 125 srs_publisher.start();
122 126
123 - // start the player. 127 + // start the normal player with HLS supported.
124 remote_player = new SrsPlayer("remote_player", 430, 185); 128 remote_player = new SrsPlayer("remote_player", 430, 185);
125 remote_player.on_player_ready = function() { 129 remote_player.on_player_ready = function() {
126 }; 130 };
127 remote_player.start(); 131 remote_player.start();
  132 +
  133 + // start the realtime player.
  134 + realtime_player = new SrsPlayer("realtime_player", 430, 185);
  135 + realtime_player.on_player_ready = function() {
  136 + };
  137 + realtime_player.start();
128 }); 138 });
129 139
130 /** 140 /**
@@ -136,7 +146,8 @@ @@ -136,7 +146,8 @@
136 * players_pub enalbed HLS. 146 * players_pub enalbed HLS.
137 */ 147 */
138 function update_play_url() { 148 function update_play_url() {
139 - var ret = srs_parse_rtmp_url($("#txt_url").val()); 149 + var url = $("#txt_url").val();
  150 + var ret = srs_parse_rtmp_url(url);
140 var query = parse_query_string(); 151 var query = parse_query_string();
141 152
142 var srs_player_url = "http://" + query.host + query.dir + "/srs_player.html?"; 153 var srs_player_url = "http://" + query.host + query.dir + "/srs_player.html?";
@@ -149,17 +160,19 @@ @@ -149,17 +160,19 @@
149 160
150 var hls_url = "http://" + ret.server + ":" + query.http_port + "/" + ret.app + "/" + ret.stream + ".m3u8"; 161 var hls_url = "http://" + ret.server + ":" + query.http_port + "/" + ret.app + "/" + ret.stream + ".m3u8";
151 162
152 - $("#txt_play_url").text("点击或右键复制").attr("href", srs_player_url).attr("target", "_blank");  
153 - $("#txt_play_hls").text("点击或右键复制").attr("href", hls_url).attr("target", "_blank");  
154 - $("#txt_play_jwplayer").text("点击或右键复制").attr("href", jwplayer_url).attr("target", "_blank"); 163 + $("#txt_play_realtime").text("RTMP低延时(点击打开)").attr("href", url).attr("target", "_blank");
  164 + $("#txt_play_url").text("RTMP已转码(点击打开)").attr("href", srs_player_url).attr("target", "_blank");
  165 + $("#txt_play_hls").text("HLS-m3u8(点击打开或右键复制)").attr("href", hls_url).attr("target", "_blank");
  166 + $("#txt_play_jwplayer").text("HLS-JWPlayer(点击打开)").attr("href", jwplayer_url).attr("target", "_blank");
155 } 167 }
156 function on_user_publish() { 168 function on_user_publish() {
157 if ($("#btn_publish").text() == "停止发布") { 169 if ($("#btn_publish").text() == "停止发布") {
158 srs_publisher.stop(); 170 srs_publisher.stop();
159 $("#btn_publish").text("发布视频"); 171 $("#btn_publish").text("发布视频");
160 - $("#txt_play_url").text("请发布视频").attr("href", "#").attr("target", "_self");  
161 - $("#txt_play_hls").text("请发布视频").attr("href", "#").attr("target", "_self");  
162 - $("#txt_play_jwplayer").text("请发布视频").attr("href", "#").attr("target", "_self"); 172 + $("#txt_play_realtime").text("RTMP低延时(请发布视频)").attr("href", "#").attr("target", "_self");
  173 + $("#txt_play_url").text("RTMP已转码(请发布视频)").attr("href", "#").attr("target", "_self");
  174 + $("#txt_play_hls").text("HLS-m3u8(请发布视频)").attr("href", "#").attr("target", "_self");
  175 + $("#txt_play_jwplayer").text("HLS-JWPlayer(请发布视频)").attr("href", "#").attr("target", "_self");
163 return; 176 return;
164 } 177 }
165 178
@@ -188,7 +201,14 @@ @@ -188,7 +201,14 @@
188 info("开始推流到服务器"); 201 info("开始推流到服务器");
189 srs_publisher.publish(url, vcodec, acodec); 202 srs_publisher.publish(url, vcodec, acodec);
190 203
191 - // replay the url. 204 + // directly play the url for the realtime player.
  205 + realtime_player.stop();
  206 + realtime_player.play(url);
  207 +
  208 + // the normal player should play the transcoded stream in another vhost.
  209 + // for example, publish stream to vhost players,
  210 + // the realtime player play the vhost players, which may donot support HLS,
  211 + // the normal player play the vhost players_pub, which transcoded to h264/aac with HLS.
192 var ret = srs_parse_rtmp_url(url); 212 var ret = srs_parse_rtmp_url(url);
193 var pub_url = "rtmp://" + ret.server + ":" + ret.port + "/" + ret.app; 213 var pub_url = "rtmp://" + ret.server + ":" + ret.port + "/" + ret.app;
194 pub_url += "?vhost=" + srs_get_player_publish_vhost(ret.vhost) + "/" + ret.stream; 214 pub_url += "?vhost=" + srs_get_player_publish_vhost(ret.vhost) + "/" + ret.stream;
@@ -247,20 +267,11 @@ @@ -247,20 +267,11 @@
247 </div> 267 </div>
248 <div class="control-group"> 268 <div class="control-group">
249 <div class="form-inline"> 269 <div class="form-inline">
250 - 观看地址(rtmp地址):  
251 - <a id="txt_play_url" class="input-xxlarge" href="#">请发布视频</a>  
252 - </div>  
253 - </div>  
254 - <div class="control-group">  
255 - <div class="form-inline">  
256 - HLS地址(m3u8地址):  
257 - <a id="txt_play_hls" class="input-xxlarge" href="#">请发布视频</a>  
258 - </div>  
259 - </div>  
260 - <div class="control-group">  
261 - <div class="form-inline">  
262 - HLS地址(JWPlayer):  
263 - <a id="txt_play_jwplayer" class="input-xxlarge" href="#">请发布视频</a> 270 + 播放地址
  271 + 1.<a id="txt_play_realtime" class="input-xxlarge" href="#">RTMP低延时(请发布视频)</a>
  272 + 2.<a id="txt_play_url" class="input-xxlarge" href="#">RTMP已转码(请发布视频)</a>
  273 + 3.<a id="txt_play_hls" class="input-xxlarge" href="#">HLS-m3u8(请发布视频)</a>
  274 + 4.<a id="txt_play_jwplayer" class="input-xxlarge" href="#">HLS-JWPlayer(请发布视频)</a>
264 </div> 275 </div>
265 </div> 276 </div>
266 <div id="video_modal" class="modal hide fade"> 277 <div id="video_modal" class="modal hide fade">
@@ -423,7 +434,29 @@ @@ -423,7 +434,29 @@
423 </div> 434 </div>
424 </div> 435 </div>
425 </div> 436 </div>
426 - <hr> 437 + <div class="container">
  438 + <div class="row-fluid">
  439 + <div class="span6">
  440 + <div class="accordion-group">
  441 + <div class="accordion-heading">
  442 + <span class="accordion-toggle" data-toggle="collapse" href="#collapseOne">
  443 + <strong>远程服务器</strong>
  444 + <a id="low_latecy_tips" href="#" data-toggle="tooltip" data-placement="top" title="">
  445 + 低延时<img src="img/tooltip.png"/>
  446 + </a>
  447 + </span>
  448 + </div>
  449 + <div id="collapseOne" class="accordion-body collapse in">
  450 + <div class="accordion-inner">
  451 + <div id="realtime_player"></div>
  452 + </div>
  453 + </div>
  454 + </div>
  455 + </div>
  456 + <div class="span6">
  457 + </div>
  458 + </div>
  459 + </div>
427 <footer> 460 <footer>
428 <p><a href="https://github.com/winlinvip/simple-rtmp-server">SRS Team &copy; 2013</a></p> 461 <p><a href="https://github.com/winlinvip/simple-rtmp-server">SRS Team &copy; 2013</a></p>
429 </footer> 462 </footer>