srs_publisher.html 18.4 KB
<!DOCTYPE html>
<html>
<head>
    <title>SRS</title>   
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"/>
    <script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
    <script type="text/javascript" src="js/bootstrap.min.js"></script>
    <script type="text/javascript" src="js/swfobject.js"></script>
    <script type="text/javascript" src="js/srs.js"></script>
    <style>
        body{
            padding-top: 55px;
        }
    </style>
    <script type="text/javascript">
        var srs_publisher = null;
        var remote_player = null;
        var realtime_player = null;
        
        $(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);
            
            $("#btn_video_settings").click(function(){
                $("#video_modal").modal({show:true});
            });
            $("#btn_audio_settings").click(function(){
                $("#audio_modal").modal({show:true});
            });
            
            $("#remote_tips").tooltip({
                title: "为了支持HLS输出,FLASH编码器输出的流需要经过转码(VP6=>H264,MP3=>aac),所以会黑屏较长时间,请耐心等待"
            });
            $("#low_latecy_tips").tooltip({
                title: "服务器不转码直接转发FLASH编码器的流,所以延迟比支持HLS的流要低很多"
            });
            
            $("#btn_publish").click(on_user_publish);
            
            // for publish, we use randome stream name.
            $("#txt_url").val($("#txt_url").val() + "." + new Date().getTime());
            
            // start the publisher.
            srs_publisher = new SrsPublisher("local_publisher", 430, 185);
            srs_publisher.on_publisher_ready = function(cameras, microphones) {
                srs_publisher_initialize_page(
                    cameras, microphones,
                    "#sl_cameras", "#sl_microphones", 
                    "#sl_vcodec", "#sl_profile", "#sl_level", "#sl_gop", "#sl_size",
                    "#sl_fps", "#sl_bitrate"
                );
            };
            srs_publisher.on_publisher_error = function(code, desc) {
                error(code, desc);
            };
            srs_publisher.on_publisher_warn = function(code, desc) {
                warn(code, desc);
            };
            srs_publisher.start();
            
            // 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);
                remote_player.on_player_ready = function() {
                    remote_player.set_bt(0.8);
                    remote_player.set_fs("screen", 100);
                };
                remote_player.start();
                
                // start the realtime player.
                realtime_player = new SrsPlayer("realtime_player", 430, 185);
                realtime_player.on_player_ready = function() {
                    realtime_player.set_bt(0.8);
                    realtime_player.set_fs("screen", 100);
                };
                realtime_player.start();
            }
        });
        
        /**
        * we generate the transcoded stream url for flash publish donot support HLS
        * which requires aac, so the publish vhost maybe players for example, we
        * use players_pub vhost(transcoded stream to which) for all clients,
        * both players and players_pub are write HLS to the sample dir, 
        * it's ok for the players vhost disabled the HLS, only the 
        * players_pub enalbed HLS.
        */
        function update_play_url() {
            var url = $("#txt_url").val();
            var ret = srs_parse_rtmp_url(url);
            var query = parse_query_string();
            
            var srs_player_url = "http://" + query.host + query.dir + "/srs_player.html?";
            srs_player_url += "vhost=" + srs_get_player_publish_vhost(ret.vhost) + "&port=" + ret.port + "&app=" + ret.app + "&stream=" + ret.stream;
            srs_player_url += "&autostart=true";
            
            var srs_player_rt_url = "http://" + query.host + query.dir + "/srs_player.html?";
            srs_player_rt_url += "vhost=" + ret.vhost + "&port=" + ret.port + "&app=" + ret.app + "&stream=" + ret.stream;
            srs_player_rt_url += "&autostart=true";
            
            var jwplayer_url = "http://" + query.host + query.dir + "/jwplayer6.html?";
            jwplayer_url += "vhost=" + srs_get_player_publish_vhost(ret.vhost) + "&port=" + ret.port + "&app=" + ret.app + "&stream=" + ret.stream;
            jwplayer_url += "&hls_autostart=true";
            
            var hls_url = "http://" + ret.server + ":" + query.http_port + "/" + ret.app + "/" + ret.stream + ".m3u8";
            
            $("#txt_play_realtime").text("RTMP低延时(点击打开)").attr("href", srs_player_rt_url).attr("target", "_blank");
            $("#txt_play_url").text("RTMP已转码(点击打开)").attr("href", srs_player_url).attr("target", "_blank");
            $("#txt_play_hls").text("HLS-m3u8(点击打开或右键复制)").attr("href", hls_url).attr("target", "_blank");
            $("#txt_play_jwplayer").text("HLS-JWPlayer(点击打开)").attr("href", jwplayer_url).attr("target", "_blank");
        }
        function on_user_publish() {
            if ($("#btn_publish").text() == "停止发布") {
                srs_publisher.stop();
                $("#btn_publish").text("发布视频");
                $("#txt_play_realtime").text("RTMP低延时(请发布视频)").attr("href", "#").attr("target", "_self");
                $("#txt_play_url").text("RTMP已转码(请发布视频)").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");
                return;
            }
            
            $("#btn_publish").text("停止发布");
            
            update_play_url();
            
            var url = $("#txt_url").val();
            var vcodec = {};
            var acodec = {};
            srs_publiser_get_codec(
                vcodec, acodec,
                "#sl_cameras", "#sl_microphones", 
                "#sl_vcodec", "#sl_profile", "#sl_level", "#sl_gop", "#sl_size",
                "#sl_fps", "#sl_bitrate"
            );
            
            info("开始推流到服务器");
            srs_publisher.publish(url, vcodec, acodec);
            
            if (realtime_player) {
                // directly play the url for the realtime player.
                realtime_player.stop();
                realtime_player.play(url);
            }
            
            if (remote_player) {
                // the normal player should play the transcoded stream in another vhost.
                // for example, publish stream to vhost players,
                // the realtime player play the vhost players, which may donot support HLS,
                // the normal player play the vhost players_pub, which transcoded to h264/aac with HLS.
                var ret = srs_parse_rtmp_url(url);
                var pub_url = "rtmp://" + ret.server + ":" + ret.port + "/" + ret.app;
                pub_url += "?vhost=" + srs_get_player_publish_vhost(ret.vhost) + "/" + ret.stream;
                remote_player.stop();
                remote_player.play(pub_url);
            }
        }
    </script>
</head>
<body>
<div class="navbar navbar-fixed-top">
    <div class="navbar-inner">
        <div class="container">
        <a class="brand" href="index.html">SRS</a>
            <div class="nav-collapse collapse">
                <ul class="nav">
                    <li><a id="nav_srs_player" href="srs_player.html">SRS播放器</a></li>
                    <li class="active"><a id="nav_srs_publisher" href="srs_publisher.html">SRS编码器</a></li>
                    <li><a id="nav_srs_chat" href="srs_chat.html">SRS会议</a></li>
                    <li><a id="nav_srs_bwt" href="srs_bwt.html">SRS测网速</a></li>
                    <li><a id="nav_jwplayer6" href="jwplayer6.html">JWPlayer6播放器</a></li>
                    <li><a id="nav_osmf" href="osmf.html">AdobeOSMF播放器</a></li>
                    <li><a id="nav_vlc" href="vlc.html">VLC播放器</a></li>
                </ul>
            </div>
        </div>
    </div>
</div>
<div class="container">
    <div class="alert alert-info fade in" id="txt_log">
        <button type="button" class="close" data-dismiss="alert">×</button>
        <strong><span id="txt_log_title">Usage:</span></strong>
        <span id="txt_log_msg">设置编码参数,点“发布视频”,允许Flash访问摄像头即可推流</span>
    </div>
    <div class="control-group">
        <div class="form-inline">
            <button class="btn" id="btn_video_settings">视频编码配置</button>
            <button class="btn" id="btn_audio_settings">音频编码配置</button>
        </div>
    </div>
    <div class="control-group">
        <div class="form-inline">
            发布地址:
            <input type="text" id="txt_url" class="input-xxlarge" value=""></input>
            <button class="btn btn-primary" id="btn_publish">发布视频</button>
        </div>
    </div>
    <div class="control-group">
        <div class="form-inline">
            播放地址
            1.<a id="txt_play_realtime" class="input-xxlarge" href="#">RTMP低延时(请发布视频)</a>
            2.<a id="txt_play_url" class="input-xxlarge" href="#">RTMP已转码(请发布视频)</a>
            3.<a id="txt_play_hls" class="input-xxlarge" href="#">HLS-m3u8(请发布视频)</a>
            4.<a id="txt_play_jwplayer" class="input-xxlarge" href="#">HLS-JWPlayer(请发布视频)</a>
        </div>
    </div>
    <div id="video_modal" class="modal hide fade">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
            <h3>视频编码</h3>
        </div>
        <div class="modal-body">
            <div class="form-horizontal">
                <div class="control-group">
                    <label class="control-label" for="sl_cameras">
                        摄像头
                        <a id="sl_cameras_tips" href="#" data-toggle="tooltip" data-placement="right" title="">
                            <img src="img/tooltip.png"/>
                        </a>
                    </label>
                    <div class="controls">
                        <select class="span4" id="sl_cameras"></select>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="sl_vcodec">
                        Codec
                        <a id="sl_cameras_tips" href="#" data-toggle="tooltip" data-placement="right" title="">
                            <img src="img/tooltip.png"/>
                        </a>
                    </label>
                    <div class="controls">
                        <select class="span2" id="sl_vcodec"></select>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="sl_profile">
                        Profile
                        <a id="sl_profile_tips" href="#" data-toggle="tooltip" data-placement="right" title="">
                            <img src="img/tooltip.png"/>
                        </a>
                    </label>
                    <div class="controls">
                        <select class="span2" id="sl_profile"></select>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="sl_level">
                        Level
                        <a id="sl_level_tips" href="#" data-toggle="tooltip" data-placement="right" title="">
                            <img src="img/tooltip.png"/>
                        </a>
                    </label>
                    <div class="controls">
                        <select class="span2" id="sl_level"></select>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="sl_gop">
                        GOP
                        <a id="sl_gop_tips" href="#" data-toggle="tooltip" data-placement="right" title="">
                            <img src="img/tooltip.png"/>
                        </a>
                    </label>
                    <div class="controls">
                        <select class="span2" id="sl_gop"></select>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="sl_size">
                        尺寸
                        <a id="sl_size_tips" href="#" data-toggle="tooltip" data-placement="right" title="">
                            <img src="img/tooltip.png"/>
                        </a>
                    </label>
                    <div class="controls">
                        <select class="span2" id="sl_size"></select>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="sl_fps">
                        帧率
                        <a id="sl_fps_tips" href="#" data-toggle="tooltip" data-placement="right" title="">
                            <img src="img/tooltip.png"/>
                        </a>
                    </label>
                    <div class="controls">
                        <select class="span2" id="sl_fps"></select>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="sl_bitrate">
                        码率
                        <a id="sl_bitrate_tips" href="#" data-toggle="tooltip" data-placement="right" title="">
                            <img src="img/tooltip.png"/>
                        </a>
                    </label>
                    <div class="controls">
                        <select class="span2" id="sl_bitrate"></select>
                    </div>
                </div>
            </div>
        </div>
        <div class="modal-footer">
            <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true">设置</button>
        </div>
    </div>
    <div id="audio_modal" class="modal hide fade">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
            <h3>音频编码</h3>
        </div>
        <div class="modal-body">
            <div class="form-horizontal">
                <div class="control-group">
                    <label class="control-label" for="sl_microphones">
                        麦克风
                        <a id="worker_id_tips" href="#" data-toggle="tooltip" data-placement="right" title="">
                            <img src="img/tooltip.png"/>
                        </a>
                    </label>
                    <div class="controls">
                        <select class="span4" id="sl_microphones"></select>
                    </div>
                </div>
            </div>
        </div>
        <div class="modal-footer">
            <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true">设置</button>
        </div>
    </div>
    <div class="container">
        <div class="row-fluid">
            <div class="span6">
                <div class="accordion-group">
                    <div class="accordion-heading">
                        <span class="accordion-toggle" data-toggle="collapse" href="#collapse1">
                            <strong>本地摄像头</strong>
                        </span>
                    </div>
                    <div id="collapse1" class="accordion-body collapse in">
                        <div class="accordion-inner">
                            <div id="local_publisher"></div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="span6">
                <div class="accordion-group">
                    <div class="accordion-heading">
                        <span class="accordion-toggle" data-toggle="collapse" href="#collapse2">
                            <strong>远程服务器</strong>
                            <a id="remote_tips" href="#" data-toggle="tooltip" data-placement="top" title="">
                                黑屏<img src="img/tooltip.png"/>
                            </a>
                        </span>
                    </div>
                    <div id="collapse2" class="accordion-body collapse in">
                        <div class="accordion-inner">
                            <div id="remote_player"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <div class="row-fluid">
            <div class="span6">
                <div class="accordion-group">
                    <div class="accordion-heading">
                        <span class="accordion-toggle" data-toggle="collapse" href="#collapse3">
                            <strong>远程服务器</strong>
                            <a id="low_latecy_tips" href="#" data-toggle="tooltip" data-placement="top" title="">
                                低延时<img src="img/tooltip.png"/>
                            </a>
                        </span>
                    </div>
                    <div id="collapse3" class="accordion-body collapse in">
                        <div class="accordion-inner">
                            <div id="realtime_player"></div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="span6">
            </div>
        </div>
    </div>
    <footer>
        <p><a href="https://github.com/winlinvip/simple-rtmp-server">SRS Team &copy; 2013</a></p>
    </footer>
</div>
</body>