1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Add srs-console to research/console. 3.0.159

This commit is contained in:
winlin 2021-04-24 18:07:49 +08:00
parent 90b2e08c4b
commit 44965da9af
52 changed files with 38478 additions and 45 deletions

View file

@ -0,0 +1,25 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" href="javascript:void(0)">
客户端-{{client.id}}
</a>
</div>
<div id="collapseOne" class="accordion-body collapse in">
<div class="accordion-inner">
<p>ID: {{client.id}}</p>
<p>IP: {{client.ip}}</p>
<p><a href="javascript:void(0)" ng-click="gogogo('/vhosts/' + client.vhost)">{{client.vhost}}</a></p>
<p><a href="javascript:void(0)" ng-click="gogogo('/streams/' + client.stream)">{{client.stream}}</a></p>
<p>Type: {{client.publish| sc_filter_ctype}}</p>
<p>Alive: {{client.alive| sc_filter_time}}</p>
<p>TcUrl: {{client.tcUrl}}</p>
<p>PageUrl: {{client.pageUrl}}</p>
<p>SwfUrl: {{client.swfUrl}}</p>
<p><a ng-click="kickoff(client)" href="javascript:void(0)">踢Ta</a></p>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,25 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" href="javascript:void(0)">
Client-{{client.id}}
</a>
</div>
<div id="collapseOne" class="accordion-body collapse in">
<div class="accordion-inner">
<p>ID: {{client.id}}</p>
<p>IP: {{client.ip}}</p>
<p><a href="javascript:void(0)" ng-click="gogogo('/vhosts/' + client.vhost)">{{client.vhost}}</a></p>
<p><a href="javascript:void(0)" ng-click="gogogo('/streams/' + client.stream)">{{client.stream}}</a></p>
<p>Type: {{client.publish| sc_filter_ctype}}</p>
<p>Alive: {{client.alive| sc_filter_time}}</p>
<p>TcUrl: {{client.tcUrl}}</p>
<p>PageUrl: {{client.pageUrl}}</p>
<p>SwfUrl: {{client.swfUrl}}</p>
<p><a ng-click="kickoff(client)" href="javascript:void(0)">Kickoff It</a></p>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,39 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
客户端(Clients)列表
</a>
</div>
<div id="collapseOne" class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-bordered">
<tr>
<th>ID</th>
<th>IP</th>
<th>Vhost</th>
<th>Stream</th>
<th>类型</th>
<th>时长</th>
<th>TcUrl</th>
<th>管理</th>
</tr>
<tr ng-repeat="client in clients">
<td><a href="javascript:void(0)" ng-click="gogogo('/clients/' + client.id)">{{client.id}}</a></td>
<td>{{client.ip}}</td>
<td><a href="javascript:void(0)" ng-click="gogogo('/vhosts/' + client.vhost)">{{client.vhost}}</a></td>
<td><a href="javascript:void(0)" ng-click="gogogo('/streams/' + client.stream)">{{client.stream}}</a></td>
<td>{{client.publish| sc_filter_ctype}}</td>
<td>{{client.alive| sc_filter_time}}</td>
<td>{{client.tcUrl}}</td>
<td>
<a ng-click="kickoff(client)" href="javascript:void(0)">踢Ta</a>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,39 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
System Clients
</a>
</div>
<div id="collapseOne" class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-bordered">
<tr>
<th>ID</th>
<th>IP</th>
<th>Vhost</th>
<th>Stream</th>
<th>Type</th>
<th>Duration</th>
<th>TcUrl</th>
<th>Manage</th>
</tr>
<tr ng-repeat="client in clients">
<td><a href="javascript:void(0)" ng-click="gogogo('/clients/' + client.id)">{{client.id}}</a></td>
<td>{{client.ip}}</td>
<td><a href="javascript:void(0)" ng-click="gogogo('/vhosts/' + client.vhost)">{{client.vhost}}</a></td>
<td><a href="javascript:void(0)" ng-click="gogogo('/streams/' + client.stream)">{{client.stream}}</a></td>
<td>{{client.publish| sc_filter_ctype}}</td>
<td>{{client.alive| sc_filter_time}}</td>
<td>{{client.tcUrl}}</td>
<td>
<a ng-click="kickoff(client)" href="javascript:void(0)">Kickoff It</a>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,452 @@
<div>
<div class="accordion">
<div class="accordion-group" ng-show="!support_raw_api">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
HTTP RAW API
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<div class="alert alert-block alert-danger" ng-show="warn_raw_api">
该服务器不支持HTTP RAW API或者配置中禁用了该功能。参考<a href='https://github.com/ossrs/srs/wiki/v3_CN_HTTPApi#http-raw-api'>WIKI</a>
</div>
<table class="table table-striped table-hover table-bordered" ng-show="http_api">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty scp-key="http_api.enabled" scp-value="http_api.enabled" scp-bool="true"
scp-desc="是否开启HTTP API开启后就可以访问SRS提供的API管理服务器。默认: {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty scp-key="http_api.listen" scp-value="http_api.listen"
scp-desc="HTTP API的侦听地址格式是&lt;[address:]port&gt;。默认: 1985">
</tr>
<tr sc-pretty scp-key="http_api.crossdomain" scp-value="http_api.crossdomain" scp-bool="true"
scp-desc="是否允许JS跨域开启后JS可以直接跨域(还可以通过JSONP访问)。默认: {{true| sc_filter_enabled}}">
</tr>
<tr sc-pretty scp-key="http_api.raw_api.enabled" scp-value="http_api.raw_api.enabled" scp-bool="true"
scp-desc="是否开启HTTP RAW API允许API修改服务器配置。默认: {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty scp-key="http_api.raw_api.allow_reload" scp-value="http_api.raw_api.allow_reload" scp-bool="true"
scp-desc="是否允许API进行Reload操作。默认: {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty scp-key="http_api.raw_api.allow_query" scp-value="http_api.raw_api.allow_query" scp-bool="true"
scp-desc="是否允许API进行Query查询操作。默认: {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty scp-key="http_api.raw_api.allow_update" scp-value="http_api.raw_api.allow_update" scp-bool="true"
scp-desc="是否允许API进行Update更新操作。默认: {{false| sc_filter_enabled}}">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
服务器API配置(http_api)
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.http_api.enabled" scp-bool="true"
scp-desc="是否开启HTTP API开启后就可以访问SRS提供的API管理服务器。默认: {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.http_api.listen.value"
scp-desc="HTTP API的侦听地址格式是&lt;[address:]port&gt;。默认: 1985">
</tr>
<tr sc-pretty2 scp-data="global.http_api.crossdomain" scp-bool="true"
scp-desc="是否允许JS跨域开启后JS可以直接跨域(还可以通过JSONP访问)。默认: {{true| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.http_api.raw_api.enabled" scp-bool="true"
scp-desc="是否开启HTTP RAW API允许API修改服务器配置。默认: {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.http_api.raw_api.allow_reload" scp-bool="true"
scp-desc="是否允许API进行Reload操作。默认: {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.http_api.raw_api.allow_query" scp-bool="true"
scp-desc="是否允许API进行Query查询操作。默认: {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.http_api.raw_api.allow_update" scp-bool="true"
scp-desc="是否允许API进行Update更新操作。默认: {{false| sc_filter_enabled}}">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="out">
<a class="accordion-toggle" href="javascript:void(0)">
服务器全局配置
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-directive scd-data="global.listen" scd-span="span3"
scd-desc="RTMP服务器侦听的端口提供RTMP服务格式是&lt;[address:]port&gt;[,&lt;addressN&gt;portN]"
scd-array="true" scd-default="1935"
scd-submit="submit(global.listen)">
</tr>
<tr sc-directive scd-data="global.pid" scd-span="span3"
scd-desc="服务器使用的PID文件每个进程必须用一个否则无法启动。默认: ./objs/srs.pid"
scd-default="./objs/srs.pid"
scd-submit="submit(global.pid)">
</tr>
<tr sc-directive scd-data="global.chunk_size" scd-span="span3"
scd-desc="默认的ChunkSize即RTMP分包的大小。默认: 60000"
scd-default="60000"
scd-submit="submit(global.chunk_size)">
</tr>
<tr sc-directive scd-data="global.ff_log_dir" scd-span="span4"
scd-desc="默认的FFMPEG日志目录/dev/null禁用日志。默认: ./objs"
scd-default="./objs"
scd-submit="submit(global.ff_log_dir)">
</tr>
<tr sc-directive scd-data="global.srs_log_tank" scd-span="span3"
scd-desc="系统的日志容器,即存储方式。默认: file"
scd-default="file", scd-select="file,console"
scd-submit="submit(global.srs_log_tank)">
</tr>
<tr sc-directive scd-data="global.srs_log_level" scd-span="span3"
scd-desc="系统的日志级别,低于该级别的日志不会打印。默认: trace"
scd-default="trace" scd-select="verbose,info,trace,warn,error"
scd-submit="submit(global.srs_log_level)">
</tr>
<tr sc-directive scd-data="global.srs_log_file" scd-span="span4"
scd-desc="当日志容器为file即日志写入文件时日志文件的路径。默认: ./objs/srs.log"
scd-default="./objs/srs.log"
scd-submit="submit(global.srs_log_file)"
ng-if="global.srs_log_tank.value == 'file'">
</tr>
<tr sc-directive scd-data="global.max_connections" scd-span="span3"
scd-desc="系统的最大连接数,超过后将拒绝新连接。默认: 1000"
scd-default="1000"
scd-submit="submit(global.max_connections)">
</tr>
<tr sc-pretty2 scp-data="global.daemon" scp-bool="true"
scp-desc="是否以后台启动SRS。默认: {{true| sc_filter_yesno}}">
</tr>
<tr sc-directive scd-data="global.utc_time" scd-span="span4"
scd-desc="是否启用UTC时间格式影响日志的时间和路径中包含时间变量的配置。默认: {{false| sc_filter_yesno}}"
scd-default="false" scd-bool="true"
scd-submit="submit(global.utc_time)">
</tr>
<tr sc-directive scd-data="global.pithy_print_ms" scd-span="span3"
scd-desc="简化形式的日志打印间隔,单位: 毫秒。默认: 10000"
scd-default="10000" scd-select="1000,3000,5000,10000,30000"
scd-submit="submit(global.pithy_print_ms)">
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="out">
<a class="accordion-toggle" href="javascript:void(0)">
虚拟主机(Vhosts)列表, 共配置有{{global.nb_vhosts.value}}个Vhost
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>
<a href="javscript:void(0)" ng-click="new_vhost()" class="icon-plus"></a>
</th>
<th>主机名称</th>
<th>开启</th>
<th></th>
<th>DVR</th>
<th>HTTP</th>
<th>FLV</th>
<th>HLS</th>
<th>HDS</th>
<th>回调</th>
<th ng-show="false">Exec</th>
<th ng-show="false">BWT</th>
<th>转发</th>
<th>安全</th>
<th ng-show="false">盗链</th>
<th ng-show="false">MR</th>
<th ng-show="false">RTC</th>
<th ng-show="false">GOP</th>
<th ng-show="false">TcpNoDelay</th>
<th ng-show="false">MixCorrect</th>
<th ng-show="false">TimeJitter</th>
<th ng-show="false">ATC</th>
<th>转码</th>
<th>采集</th>
<th>
<a href="javascript:void(0)" ng-click="new_vhost()">添加</a>
</th>
</tr>
<tr ng-repeat="vhost in global.vhosts">
<td><a href="#/vhosts/{{vhost.id}}" ng-show="vhost.id">{{vhost.id}}</a><span ng-show="!vhost.id">无流</span> </td>
<td colspan="{{vhost.editable?13:1}}">
<span ng-show="!vhost.editable">{{vhost.name}}</span>
<span ng-show="vhost.editable">
<input class="text span5" ng-model="vhost.name"><br/>
请输入vhost的名称。
</span>
</td>
<td ng-show="!vhost.editable">{{vhost.enabled| sc_filter_yesno}}</td>
<td ng-show="!vhost.editable">{{vhost.origin| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.dvr| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.http_static| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.http_remux| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.hls| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.hds| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.http_hooks| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.exec| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.bandcheck| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.forward| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.security| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.refer| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.mr| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.min_latency| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.gop_cache| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.tcp_nodelay| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.mix_correct| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.time_jitter| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.atc| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.transcode| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.ingest| sc_filter_yn}}</td>
<td>
<span ng-show="vhost.editable">
<!-- vhost exists in server -->
<span ng-show="vhost.enabled != undefined">
<a bravo-popover href="javascript:void(0)"
data-content="请确认是否提交{{vhost.name}}?" data-title="请确认" data-placement="left"
bravo-popover-confirm="update_vhost(vhost)">
提交
</a>
<a href="javascript:void(0)" ng-click="cancel_vhost(vhost)">放弃</a>
</span>
<!-- vhost in adding. -->
<span ng-show="vhost.enabled == undefined">
<a bravo-popover href="javascript:void(0)"
data-content="请确认是否提交{{vhost.name}}?" data-title="请确认" data-placement="left"
bravo-popover-confirm="add_vhost(vhost)">
提交
</a>
<a href="javascript:void(0)" ng-click="abort_vhost(vhost)">放弃</a>
</span>
</span>
<span ng-show="!vhost.editable">
<span ng-show="vhost.enabled">
<span>编辑</span>
<a bravo-popover href="javascript:void(0)"
data-content="请确认是否禁用{{vhost.name}}?" data-title="请确认" data-placement="left"
bravo-popover-confirm="disable_vhost(vhost)">
禁用
</a>
<span>删除</span>
</span>
<span ng-show="!vhost.enabled">
<a href="javascript:void(0)" ng-click="edit_vhost(vhost)">编辑</a>
<a bravo-popover href="javascript:void(0)"
data-content="请确认是否启用{{vhost.name}}?" data-title="请确认" data-placement="left"
bravo-popover-confirm="enable_vhost(vhost)">
启用
</a>
<a bravo-popover href="javascript:void(0)"
data-content="请确认是否删除{{vhost.name}}?" data-title="请确认" data-placement="left"
bravo-popover-confirm="delete_vhost(vhost)">
删除
</a>
</span>
<a href="#/configs/{{vhost.name}}" ng-show="!vhost.editable">详细</a>
</span>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="hide">
<a class="accordion-toggle" href="javascript:void(0)">
Kafka集群配置(kafka)
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.kafka.enabled" scp-bool="true"
scp-desc="是否开启Kafka开启后SRS将数据汇报给Kafka集群。默认: {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.kafka.brokers"
scp-desc="Broker列表首次连接到Broker获取集群信息格式是&lt;ip:port&gt;。">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="hide">
<a class="accordion-toggle" href="javascript:void(0)">
服务器心跳汇报(heartbeat)
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.heartbeat.enabled"
scp-desc="是否开启服务器心跳,向外部系统汇报。默认: {{false| sc_filter_enabled}}"
scd-bool="true">
</tr>
<tr sc-pretty2 scp-data="global.heartbeat.interval"
scp-desc="心跳间隔的时间,单位: 秒。默认: 9.9"
ng-show="global.heartbeat.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.heartbeat.url"
scp-desc="汇报的HTTP服务器地址汇报信息格式是JSON。默认: http://127.0.0.1:8085/api/v1/servers"
ng-show="global.heartbeat.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.heartbeat.device_id"
scp-desc="设备IDSRS会写入汇报信息中。"
ng-show="global.heartbeat.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.heartbeat.smmaries"
scp-desc="是否汇报摘要即服务器的summaries信息。默认: {{false| sc_filter_yesno}}"
scd-bool="true"
scd-submit="submit(global.heartbeat.summaries)"
ng-show="global.heartbeat.enabled.value">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="hide">
<a class="accordion-toggle" href="javascript:void(0)">
服务器统计信息配置(stats)
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.stats.network"
scp-desc="统计的网卡索引从0开始算第一块网卡。默认: 0">
</tr>
<tr sc-pretty2 scp-data="global.stats.disk"
scp-desc="统计的磁盘名称,可以在/proc/diskstats中查看。"
scd-array="true">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="hide">
<a class="accordion-toggle" href="javascript:void(0)">
HTTP服务器配置(http_server)
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.http_server.enabled"
scp-desc="是否开启HTTP文件服务器和HTTP流服务器。默认: {{false| sc_filter_enabled}}"
scd-bool="true">
</tr>
<tr sc-pretty2 scp-data="global.http_server.listen"
scp-desc="HTTP服务器侦听的地址格式是&lt;[address:]port&gt;。默认: 8080"
ng-show="global.http_server.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.http_server.dir"
scp-desc="HTTP服务器的主目录。默认: ./objs/nginx/html"
ng-show="global.http_server.enabled.value">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="hide">
<a class="accordion-toggle" href="javascript:void(0)">
StreamCaster流转换器(stream_caster)
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<td>Opt</td>
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.enabled"
scp-desc="是否开启StreamCaster即接收特殊的流后转换成RTMP送到SRS。默认: {{false| sc_filter_enabled}}"
scd-bool="true">
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.caster"
scp-desc="转换器的类型不同的类型需要不同的配置mpegts_over_udp,rtsp,flv"
scd-select="mpegts_over_udp,rtsp,flv"
ng-show="global.stream_caster.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.output"
scp-desc="输出的RTMP地址转换器侦听端口接收特定的流转换成RTMP后送到SRS。"
ng-show="global.stream_caster.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.listen"
scp-desc="转换器侦听的地址,格式是&lt;port&gt;"
ng-show="global.stream_caster.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.rtp_port_min"
scp-desc="转换器会在[rtp_port_min, rtp_port_max]中间选择一个新端口并侦听参考RTP协议。"
ng-show="global.stream_caster.enabled.value && global.stream_caster.caster.value == 'rtsp'">
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.rtp_port_max"
scp-desc="转换器会在[rtp_port_min, rtp_port_max]中间选择一个新端口并侦听参考RTP协议。"
ng-show="global.stream_caster.enabled.value && global.stream_caster.caster.value == 'rtsp'">
</tr>
</table>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,452 @@
<div>
<div class="accordion">
<div class="accordion-group" ng-show="!support_raw_api">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
HTTP RAW API
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<div class="alert alert-block alert-danger" ng-show="warn_raw_api">
HTTP RAW API is not supported or disabled. Read <a href='https://github.com/ossrs/srs/wiki/v3_EN_HTTPApi#http-raw-api'>WIKI</a>
</div>
<table class="table table-striped table-hover table-bordered" ng-show="http_api">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty scp-key="http_api.enabled" scp-value="http_api.enabled" scp-bool="true"
scp-desc="Whether enable HTTP API. Default is {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty scp-key="http_api.listen" scp-value="http_api.listen"
scp-desc="The listen port for HTTP API, format is &lt;[address:]port&gt;. Default is 1985">
</tr>
<tr sc-pretty scp-key="http_api.crossdomain" scp-value="http_api.crossdomain" scp-bool="true"
scp-desc="Whether allow js CORS(JSONP). Default is {{true| sc_filter_enabled}}">
</tr>
<tr sc-pretty scp-key="http_api.raw_api.enabled" scp-value="http_api.raw_api.enabled" scp-bool="true"
scp-desc="Whether enable HTTP RAW API. Default is {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty scp-key="http_api.raw_api.allow_reload" scp-value="http_api.raw_api.allow_reload" scp-bool="true"
scp-desc="Whether allow HTTP RAW API to reload. Default is {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty scp-key="http_api.raw_api.allow_query" scp-value="http_api.raw_api.allow_query" scp-bool="true"
scp-desc="Whether allow HTTP RAW API to query. Default is {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty scp-key="http_api.raw_api.allow_update" scp-value="http_api.raw_api.allow_update" scp-bool="true"
scp-desc="Whether allow HTTP RAW API to update. Default is {{false| sc_filter_enabled}}">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
HTTP API Server
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.http_api.enabled" scp-bool="true"
scp-desc="Whether enabel HTTP API. Default is {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.http_api.listen.value"
scp-desc="The HTTP API listen port, format is &lt;[address:]port&gt;. Default is 1985">
</tr>
<tr sc-pretty2 scp-data="global.http_api.crossdomain" scp-bool="true"
scp-desc="Whether allow CORS for js(JSONP). Default is {{true| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.http_api.raw_api.enabled" scp-bool="true"
scp-desc="Whether enable HTTP RAW API. Default is {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.http_api.raw_api.allow_reload" scp-bool="true"
scp-desc="Whether allow reload by HTTP API. Default is {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.http_api.raw_api.allow_query" scp-bool="true"
scp-desc="Whether allow query by HTTP API. Default is {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.http_api.raw_api.allow_update" scp-bool="true"
scp-desc="Whether allow update by HTTP API. Default is {{false| sc_filter_enabled}}">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="out">
<a class="accordion-toggle" href="javascript:void(0)">
SRS Global Config
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-directive scd-data="global.listen" scd-span="span3"
scd-desc="RTMP listen port, format is &lt;[address:]port&gt;[,&lt;addressN&gt;portN]"
scd-array="true" scd-default="1935"
scd-submit="submit(global.listen)">
</tr>
<tr sc-directive scd-data="global.pid" scd-span="span3"
scd-desc="The pid file for SRS. Default is ./objs/srs.pid"
scd-default="./objs/srs.pid"
scd-submit="submit(global.pid)">
</tr>
<tr sc-directive scd-data="global.chunk_size" scd-span="span3"
scd-desc="RTMP chunk size. Default is 60000"
scd-default="60000"
scd-submit="submit(global.chunk_size)">
</tr>
<tr sc-directive scd-data="global.ff_log_dir" scd-span="span4"
scd-desc="FFMPEG log directory, use /dev/null to disable log. Default is ./objs"
scd-default="./objs"
scd-submit="submit(global.ff_log_dir)">
</tr>
<tr sc-directive scd-data="global.srs_log_tank" scd-span="span3"
scd-desc="System log store. Default is file"
scd-default="file", scd-select="file,console"
scd-submit="submit(global.srs_log_tank)">
</tr>
<tr sc-directive scd-data="global.srs_log_level" scd-span="span3"
scd-desc="System log level. Default is trace"
scd-default="trace" scd-select="verbose,info,trace,warn,error"
scd-submit="submit(global.srs_log_level)">
</tr>
<tr sc-directive scd-data="global.srs_log_file" scd-span="span4"
scd-desc="When log store is file, the log path. Default is ./objs/srs.log"
scd-default="./objs/srs.log"
scd-submit="submit(global.srs_log_file)"
ng-if="global.srs_log_tank.value == 'file'">
</tr>
<tr sc-directive scd-data="global.max_connections" scd-span="span3"
scd-desc="System maximum connections. Default is 1000"
scd-default="1000"
scd-submit="submit(global.max_connections)">
</tr>
<tr sc-pretty2 scp-data="global.daemon" scp-bool="true"
scp-desc="Whether start SRS as daemon. Default is {{true| sc_filter_yesno}}">
</tr>
<tr sc-directive scd-data="global.utc_time" scd-span="span4"
scd-desc="Whether use UTC time. Default is {{false| sc_filter_yesno}}"
scd-default="false" scd-bool="true"
scd-submit="submit(global.utc_time)">
</tr>
<tr sc-directive scd-data="global.pithy_print_ms" scd-span="span3"
scd-desc="Pithy log print interval in ms. Default is 10000"
scd-default="10000" scd-select="1000,3000,5000,10000,30000"
scd-submit="submit(global.pithy_print_ms)">
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="out">
<a class="accordion-toggle" href="javascript:void(0)">
System Vhosts, total {{global.nb_vhosts.value}} vhosts configed.
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>
<a href="javscript:void(0)" ng-click="new_vhost()" class="icon-plus"></a>
</th>
<th>Name</th>
<th title="Whether Enabled">E</th>
<th title="Whether Origin Server">O</th>
<th title="DVR Configed">D</th>
<th title="HTTP Server Configed">H</th>
<th title="HTTP FLV Configed">FLV</th>
<th title="HLS Configed">HLS</th>
<th title="HDS Configed">HDS</th>
<th title="HTTP Callback">CB</th>
<th ng-show="false">Exec</th>
<th ng-show="false">BWT</th>
<th title="Forwarder">F</th>
<th title="Security Configed">S</th>
<th ng-show="false">Referer</th>
<th ng-show="false">MR</th>
<th ng-show="false">RTC</th>
<th ng-show="false">GOP</th>
<th ng-show="false">TcpNoDelay</th>
<th ng-show="false">MixCorrect</th>
<th ng-show="false">TimeJitter</th>
<th ng-show="false">ATC</th>
<th title="Transcode Configied">T</th>
<th title="Ingester Configed">I</th>
<th>
<a href="javascript:void(0)" ng-click="new_vhost()">Add</a>
</th>
</tr>
<tr ng-repeat="vhost in global.vhosts">
<td><a href="#/vhosts/{{vhost.id}}" ng-show="vhost.id">{{vhost.id}}</a><span ng-show="!vhost.id">No Stream</span> </td>
<td colspan="{{vhost.editable?13:1}}">
<span ng-show="!vhost.editable">{{vhost.name}}</span>
<span ng-show="vhost.editable">
<input class="text span5" ng-model="vhost.name"><br/>
Please input vhost name.
</span>
</td>
<td ng-show="!vhost.editable">{{vhost.enabled| sc_filter_yesno}}</td>
<td ng-show="!vhost.editable">{{vhost.origin| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.dvr| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.http_static| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.http_remux| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.hls| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.hds| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.http_hooks| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.exec| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.bandcheck| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.forward| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.security| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.refer| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.mr| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.min_latency| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.gop_cache| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.tcp_nodelay| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.mix_correct| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.time_jitter| sc_filter_yn}}</td>
<td ng-show="false && !vhost.editable">{{vhost.atc| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.transcode| sc_filter_yn}}</td>
<td ng-show="!vhost.editable">{{vhost.ingest| sc_filter_yn}}</td>
<td>
<span ng-show="vhost.editable">
<!-- vhost exists in server -->
<span ng-show="vhost.enabled != undefined">
<a bravo-popover href="javascript:void(0)"
data-content="Please confirm submit vhost {{vhost.name}}?" data-title="Confirm" data-placement="left"
bravo-popover-confirm="update_vhost(vhost)">
Submit
</a>
<a href="javascript:void(0)" ng-click="cancel_vhost(vhost)">Cancel</a>
</span>
<!-- vhost in adding. -->
<span ng-show="vhost.enabled == undefined">
<a bravo-popover href="javascript:void(0)"
data-content="Please confirm submit vhost{{vhost.name}}?" data-title="Confirm" data-placement="left"
bravo-popover-confirm="add_vhost(vhost)">
Submit
</a>
<a href="javascript:void(0)" ng-click="abort_vhost(vhost)">Cancel</a>
</span>
</span>
<span ng-show="!vhost.editable">
<span ng-show="vhost.enabled">
<span>Update</span>
<a bravo-popover href="javascript:void(0)"
data-content="Please confirm to disable {{vhost.name}}?" data-title="Confirm" data-placement="left"
bravo-popover-confirm="disable_vhost(vhost)">
Disable
</a>
<span>Delete</span>
</span>
<span ng-show="!vhost.enabled">
<a href="javascript:void(0)" ng-click="edit_vhost(vhost)">编辑</a>
<a bravo-popover href="javascript:void(0)"
data-content="Please confirm to enable {{vhost.name}}?" data-title="Confirm" data-placement="left"
bravo-popover-confirm="enable_vhost(vhost)">
Enable
</a>
<a bravo-popover href="javascript:void(0)"
data-content="Please confirm to delete {{vhost.name}}?" data-title="Confirm" data-placement="left"
bravo-popover-confirm="delete_vhost(vhost)">
Delete
</a>
</span>
<a href="#/configs/{{vhost.name}}" ng-show="!vhost.editable">Detail</a>
</span>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="hide">
<a class="accordion-toggle" href="javascript:void(0)">
Config KAFKA
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.kafka.enabled" scp-bool="true"
scp-desc="Whether enable KAFKA. Default is {{false| sc_filter_enabled}}">
</tr>
<tr sc-pretty2 scp-data="global.kafka.brokers"
scp-desc="The broker list, format is &lt;ip:port&gt;">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="hide">
<a class="accordion-toggle" href="javascript:void(0)">
SRS Heartbeat
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.heartbeat.enabled"
scp-desc="Whether enable heartbet. Default is {{false| sc_filter_enabled}}"
scd-bool="true">
</tr>
<tr sc-pretty2 scp-data="global.heartbeat.interval"
scp-desc="The interval in seconds. Default is 9.9"
ng-show="global.heartbeat.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.heartbeat.url"
scp-desc="The report url in json. Default is http://127.0.0.1:8085/api/v1/servers"
ng-show="global.heartbeat.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.heartbeat.device_id"
scp-desc="The device ID."
ng-show="global.heartbeat.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.heartbeat.smmaries"
scp-desc="Whether report summaries. Default is {{false| sc_filter_yesno}}"
scd-bool="true"
scd-submit="submit(global.heartbeat.summaries)"
ng-show="global.heartbeat.enabled.value">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="hide">
<a class="accordion-toggle" href="javascript:void(0)">
STAT Hardward Config
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.stats.network"
scp-desc="The stat network index. Default is 0">
</tr>
<tr sc-pretty2 scp-data="global.stats.disk"
scp-desc="The stat disk name."
scd-array="true">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="hide">
<a class="accordion-toggle" href="javascript:void(0)">
HTTP Server Config
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.http_server.enabled"
scp-desc="Whether enable HTTP Server. Default is {{false| sc_filter_enabled}}"
scd-bool="true">
</tr>
<tr sc-pretty2 scp-data="global.http_server.listen"
scp-desc="The HTTP Server listen port, format is &lt;[address:]port&gt;. Default is 8080"
ng-show="global.http_server.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.http_server.dir"
scp-desc="The HTTP Server root directory. Default is ./objs/nginx/html"
ng-show="global.http_server.enabled.value">
</tr>
</table>
</div>
</div>
</div>
<div class="accordion-group" ng-show="support_raw_api">
<div class="accordion-heading" sc-collapse="hide">
<a class="accordion-toggle" href="javascript:void(0)">
Stream Caster Config
</a>
</div>
<div class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<td>Opt</td>
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.enabled"
scp-desc="Whether enable StreamCaster. Default is {{false| sc_filter_enabled}}"
scd-bool="true">
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.caster"
scp-desc="The type of StreamCaster. For example, mpegts_over_udp,rtsp,flv"
scd-select="mpegts_over_udp,rtsp,flv"
ng-show="global.stream_caster.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.output"
scp-desc="The output RTMP url."
ng-show="global.stream_caster.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.listen"
scp-desc="The listen port, format is &lt;port&gt;"
ng-show="global.stream_caster.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.rtp_port_min"
scp-desc="The RTP min port."
ng-show="global.stream_caster.enabled.value && global.stream_caster.caster.value == 'rtsp'">
</tr>
<tr sc-pretty2 scp-data="global.stream_caster.rtp_port_max"
scp-desc="The RTP max port."
ng-show="global.stream_caster.enabled.value && global.stream_caster.caster.value == 'rtsp'">
</tr>
</table>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,40 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" href="javascript:void(0)">
连接到您的SRS服务器
</a>
</div>
<div class="accordion-body collapse in">
<div class="accordion-inner">
<div class="form-horizontal">
<div class="control-group">
<label class="control-label" for="sscProtocol">协议</label>
<div class="controls">
<input type="text" id="sscProtocol" placeholder="SRS API Protocol, http or https" ng-model="server.schema">
</div>
</div>
<div class="control-group">
<label class="control-label" for="sscServer">服务器IP</label>
<div class="controls">
<input type="text" id="sscServer" placeholder="SRS API Server IP" ng-model="server.ip">
</div>
</div>
<div class="control-group">
<label class="control-label" for="sscPort">API端口</label>
<div class="controls">
<input type="text" id="sscPort" placeholder="SRS API Server Port" ng-model="server.port">
</div>
</div>
<div class="control-group">
<div class="controls">
<button type="submit" class="btn" ng-click="connect()">连接到SRS</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,40 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" href="javascript:void(0)">
Connect to your SRS
</a>
</div>
<div class="accordion-body collapse in">
<div class="accordion-inner">
<div class="form-horizontal">
<div class="control-group">
<label class="control-label" for="sscProtocol">Protocol</label>
<div class="controls">
<input type="text" id="sscProtocol" placeholder="SRS API Protocol, http or https" ng-model="server.schema">
</div>
</div>
<div class="control-group">
<label class="control-label" for="sscServer">Server IP</label>
<div class="controls">
<input type="text" id="sscServer" placeholder="SRS API Server IP" ng-model="server.ip">
</div>
</div>
<div class="control-group">
<label class="control-label" for="sscPort">SRS API Port</label>
<div class="controls">
<input type="text" id="sscPort" placeholder="SRS API Server Port" ng-model="server.port">
</div>
</div>
<div class="control-group">
<div class="controls">
<button type="submit" class="btn" ng-click="connect()">Connect</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,62 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" href="javascript:void(0)">
Vhost({{global.vid.value}})录制(DVR)配置
</a>
</div>
<div class="accordion-body collapse in">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.name" scp-link="#/vhosts/{{global.id.value}}"
scp-desc="录制的流所属的Vhost的名称">
</tr>
<tr sc-pretty2 scp-data="global.app"
scp-desc="录制的流所属的App的名称">
</tr>
<tr sc-pretty2 scp-data="global.stream" scp-link="#/streams/{{global.sid.value}}"
scp-desc="录制的流的Stream地址即流名称">
</tr>
<tr sc-directive scd-data="global.dvr.apply" scd-span="span4"
scd-desc="是否开始录制该流。"
scd-default="false" scd-bool="true"
scd-submit="dvr(global.dvr.apply)"
ng-show="global.dvr.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.dvr.enabled"
scp-desc="是否对Vhost启用DVR配置。默认: {{false| sc_filter_yesno}}"
scp-bool="true">
</tr>
<tr sc-pretty2 scp-data="global.dvr.dvr_plan"
scp-desc="录制计划session按会话segment分段append单文件。默认: session"
ng-show="global.dvr.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.dvr.dvr_path"
scp-desc="录制文件的路径模板。默认: ./objs/nginx/html/[app]/[stream].[timestamp].flv"
ng-show="global.dvr.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.dvr.dvr_duration"
scp-desc="单位:秒。录制文件的时长。默认: 30"
ng-show="global.dvr.enabled.value && global.dvr.dvr_plan && global.dvr.dvr_plan.value == 'segment'">
</tr>
<tr sc-pretty2 scp-data="global.dvr.dvr_wait_keyframe"
scp-desc="是否等待关键帧。默认: {{true| sc_filter_yesno}}"
ng-show="global.dvr.enabled.value && global.dvr.dvr_plan && global.dvr.dvr_plan.value == 'segment'">
</tr>
<tr sc-pretty2 scp-data="global.dvr.time_jitter"
scp-desc="录制的时间戳校正算法。full完全zero置零off关闭。默认: full"
ng-show="global.dvr.enabled.value">
</tr>
</table>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,62 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" href="javascript:void(0)">
Vhost({{global.vid.value}}) DVR Config
</a>
</div>
<div class="accordion-body collapse in">
<div class="accordion-inner">
<table class="table table-striped table-hover table-bordered">
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
<th>Opt</th>
</tr>
<tr sc-pretty2 scp-data="global.name" scp-link="#/vhosts/{{global.id.value}}"
scp-desc="The vhost name to DVR.">
</tr>
<tr sc-pretty2 scp-data="global.app"
scp-desc="The app name to DVR.">
</tr>
<tr sc-pretty2 scp-data="global.stream" scp-link="#/streams/{{global.sid.value}}"
scp-desc="The stream url to DVR.">
</tr>
<tr sc-directive scd-data="global.dvr.apply" scd-span="span4"
scd-desc="Whether record this stream."
scd-default="false" scd-bool="true"
scd-submit="dvr(global.dvr.apply)"
ng-show="global.dvr.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.dvr.enabled"
scp-desc="Whether enable DVR for vhost. Default is {{false| sc_filter_yesno}}"
scp-bool="true">
</tr>
<tr sc-pretty2 scp-data="global.dvr.dvr_plan"
scp-desc="The DVR plan, can be session, segment or append. Default is session."
ng-show="global.dvr.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.dvr.dvr_path"
scp-desc="The DVR file path template. Default is ./objs/nginx/html/[app]/[stream].[timestamp].flv"
ng-show="global.dvr.enabled.value">
</tr>
<tr sc-pretty2 scp-data="global.dvr.dvr_duration"
scp-desc="The DVR file duration in seconds. Default is 30"
ng-show="global.dvr.enabled.value && global.dvr.dvr_plan && global.dvr.dvr_plan.value == 'segment'">
</tr>
<tr sc-pretty2 scp-data="global.dvr.dvr_wait_keyframe"
scp-desc="Whether wait for keyframe when DVR. Default is {{true| sc_filter_yesno}}"
ng-show="global.dvr.enabled.value && global.dvr.dvr_plan && global.dvr.dvr_plan.value == 'segment'">
</tr>
<tr sc-pretty2 scp-data="global.dvr.time_jitter"
scp-desc="The time jitter algorithm for DVR, can be full, zero or off. Default is full."
ng-show="global.dvr.enabled.value">
</tr>
</table>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1 @@
DVR信息请在每个Stream中单独配置, 请前往<a href="javascript:void(0)" ng-click="gogogo('/streams/')">Streams</a>配置。

View file

@ -0,0 +1 @@
Please config DVR in each stream by <a href="javascript:void(0)" ng-click="gogogo('/streams/')">here</a>.

View file

@ -0,0 +1,27 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" href="javascript:void(0)">
视频流-{{stream.id}}
</a>
</div>
<div id="collapseOne" class="accordion-body collapse in">
<div class="accordion-inner" ng-if="stream">
<p>ID: {{stream.id}}</p>
<p>Name: {{stream.name}}</p>
<td><a href="javascript:void(0)" ng-click="gogogo('/vhosts/' + stream.vhost)">{{owner.name}}</a></td>
<p>Publishing: {{stream.publish.active| sc_filter_has_stream}}</p>
<p>Clients: {{stream.clients}}人</p>
<p>Recv: {{stream.kbps.recv_30s| sc_filter_bitrate_k}}</p>
<p>Send: {{stream.kbps.send_30s| sc_filter_bitrate_k}}</p>
<p ng-if="stream.video">Video: <span>{{stream.video| sc_filter_video}}</span></p>
<p ng-if="stream.audio">Audio: <span>{{stream.audio| sc_filter_audio}}</span></p>
<p>管理: <a ng-href="{{stream| sc_filter_preview_url}}" target="_blank">预览</a></p>
<p ng-show="stream.publish.active">管理: <a ng-click="kickoff(stream)" href="javascript:void(0)">踢流</a></p>
<p ng-show="support_raw_api">管理: <a ng-click="dvr(stream)" href="javascript:void(0)">录制</a> </p>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,27 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" href="javascript:void(0)">
Stream-{{stream.id}}
</a>
</div>
<div id="collapseOne" class="accordion-body collapse in">
<div class="accordion-inner" ng-if="stream">
<p>ID: {{stream.id}}</p>
<p>Name: {{stream.name}}</p>
<td><a href="javascript:void(0)" ng-click="gogogo('/vhosts/' + stream.vhost)">{{owner.name}}</a></td>
<p>Publishing: {{stream.publish.active| sc_filter_has_stream}}</p>
<p>Clients: {{stream.clients}} Clients</p>
<p>Recv: {{stream.kbps.recv_30s| sc_filter_bitrate_k}}</p>
<p>Send: {{stream.kbps.send_30s| sc_filter_bitrate_k}}</p>
<p ng-if="stream.video">Video: <span>{{stream.video| sc_filter_video}}</span></p>
<p ng-if="stream.audio">Audio: <span>{{stream.audio| sc_filter_audio}}</span></p>
<p>Manage: <a ng-href="{{stream| sc_filter_preview_url}}" target="_blank">Preview</a></p>
<p ng-show="stream.publish.active">Manage: <a ng-click="kickoff(stream)" href="javascript:void(0)">Kickoff</a></p>
<p ng-show="support_raw_api">Manage: <a ng-click="dvr(stream)" href="javascript:void(0)">Record</a> </p>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,47 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
视频流(Streams)列表
</a>
</div>
<div id="collapseOne" class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-bordered">
<tr>
<th>ID</th>
<th>流名称</th>
<th>Vhost</th>
<th>状态</th>
<th>在线人数</th>
<th>入口带宽</th>
<th>出口带宽</th>
<th>视频信息</th>
<th>音频信息</th>
<th>管理</th>
</tr>
<tr ng-repeat="stream in streams">
<td><a href="javascript:void(0)" ng-click="gogogo('/streams/' + stream.id)">{{stream.id}}</a></td>
<td>{{stream.name| sc_filter_less}}</td>
<td><a href="javascript:void(0)" ng-click="gogogo('/vhosts/' + stream.vhost)">{{stream.owner.name}}</a></td>
<td>{{stream.publish.active| sc_filter_has_stream}}</td>
<td>{{stream.clients}}人</td>
<td>{{stream.kbps.recv_30s| sc_filter_bitrate_k}}</td>
<td>{{stream.kbps.send_30s| sc_filter_bitrate_k}}</td>
<td><span ng-if="stream.video">{{stream.video| sc_filter_video}}</span></td>
<td><span ng-if="stream.audio">{{stream.audio| sc_filter_audio}}</span></td>
<td>
<a ng-href="{{stream| sc_filter_preview_url}}" target="_blank">预览</a>
<a ng-show="stream.publish.active" ng-click="kickoff(stream)" href="javascript:void(0)">踢流</a>
<span ng-show="support_raw_api">
<a href="javascript:void(0)" ng-click="dvr(stream)">录制</a>
</span>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,47 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
System Streams
</a>
</div>
<div id="collapseOne" class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-bordered">
<tr>
<th>ID</th>
<th>Name</th>
<th>Vhost</th>
<th>Status</th>
<th>Clients</th>
<th>Inbound</th>
<th>Outbound</th>
<th>Video</th>
<th>Audio</th>
<th>Manage</th>
</tr>
<tr ng-repeat="stream in streams">
<td><a href="javascript:void(0)" ng-click="gogogo('/streams/' + stream.id)">{{stream.id}}</a></td>
<td>{{stream.name| sc_filter_less}}</td>
<td><a href="javascript:void(0)" ng-click="gogogo('/vhosts/' + stream.vhost)">{{stream.owner.name}}</a></td>
<td>{{stream.publish.active| sc_filter_has_stream}}</td>
<td>{{stream.clients}}人</td>
<td>{{stream.kbps.recv_30s| sc_filter_bitrate_k}}</td>
<td>{{stream.kbps.send_30s| sc_filter_bitrate_k}}</td>
<td><span ng-if="stream.video">{{stream.video| sc_filter_video}}</span></td>
<td><span ng-if="stream.audio">{{stream.audio| sc_filter_audio}}</span></td>
<td>
<a ng-href="{{stream| sc_filter_preview_url}}" target="_blank">Preview</a>
<a ng-show="stream.publish.active" ng-click="kickoff(stream)" href="javascript:void(0)">Kickoff</a>
<span ng-show="support_raw_api">
<a href="javascript:void(0)" ng-click="dvr(stream)">Record</a>
</span>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,137 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
服务器基本信息
</a>
</div>
<div id="collapseOne" class="accordion-body collapse">
<div class="accordion-inner">
<div class="row">
<div class="span3">
<table class="table table-bordered" ng-if="server">
<tr>
<th colspan="2">SRS/{{server.version}}</th>
</tr>
<tr>
<td>运行</td>
<td>{{server.srs_uptime| sc_filter_time}}</td>
</tr>
<tr>
<td>CPU</td>
<td>{{server.cpu_percent| sc_filter_percentf}} / {{system.cpus_online| sc_filter_percentf}}</td>
</tr>
<tr>
<td>内存</td>
<td>
{{server.mem_percent| sc_filter_percentf2}}
{{server.mem_kbyte| sc_filter_filesize_k2}} / {{system.mem_ram_kbyte| sc_filter_filesize_k2}}
</td>
</tr>
<tr>
<td>网络</td>
<td>
<span title="SRS的连接数">{{system.conn_srs}}</span> /
<span title="SRS的入网带宽即客户端上传带宽">{{kbps.in.srs| sc_filter_bitrate_k2}}</span> /
<span title="SRS的出网带宽即客户端下载带宽">{{kbps.out.srs| sc_filter_bitrate_k2}}</span>
</td>
</tr>
</table>
</div>
<div class="span3">
<table class="table table-bordered" ng-if="system">
<tr>
<th colspan="2">OS信息</th>
</tr>
<tr>
<td>运行</td>
<td>{{system.uptime| sc_filter_time}}</td>
</tr>
<tr>
<td>CPU</td>
<td>{{system.cpu_percent * system.cpus_online| sc_filter_percentf}} / {{system.cpus_online| sc_filter_percentf}}</td>
</tr>
<tr>
<td>内存</td>
<td>
{{system.mem_ram_percent| sc_filter_percentf2}}
{{system.mem_ram_kbyte * system.mem_ram_percent| sc_filter_filesize_k2}} / {{system.mem_ram_kbyte| sc_filter_filesize_k2}}
</td>
</tr>
<tr>
<td>负载</td>
<td>{{system.load_1m| sc_filter_number}} / {{system.load_5m| sc_filter_number}} / {{system.load_15m| sc_filter_number}}</td>
</tr>
</table>
</div>
<div class="span3">
<table class="table table-bordered" ng-if="system">
<tr>
<th colspan="2">负载信息</th>
</tr>
<tr>
<td>外网</td>
<td>
<span title="系统外网的入网带宽,即客户端上传带宽">{{kbps.in.sys| sc_filter_bitrate_k2}}</span> /
<span title="系统外网的出网带宽,即客户端下载带宽">{{kbps.out.sys| sc_filter_bitrate_k2}}</span>
</td>
</tr>
<tr>
<td>内网</td>
<td>
<span title="系统内网的入网带宽,即客户端上传带宽">{{kbps.in.inner| sc_filter_bitrate_k2}}</span> /
<span title="系统内网的出网带宽,即客户端下载带宽">{{kbps.out.inner| sc_filter_bitrate_k2}}</span>
</td>
</tr>
<tr>
<td>连接</td>
<td>
<span title="系统总连接数">{{system.conn_sys}}</span>
<span title="系统ESTABLISHED状态的连接数">{{system.conn_sys_et}}</span>
<span title="系统TIME_WAIT状态的连接数">{{system.conn_sys_tw}}</span>
<span title="系统UDP绑定端口">{{system.conn_sys_udp}}</span>
</td>
</tr>
<tr>
<td>磁盘</td>
<td>
<span title="IO繁忙度">{{system.disk_busy_percent| sc_filter_percentf2}}</span>
<span title="磁盘读取速度Bps">{{system.disk_read_KBps| sc_filter_filerate_k2}}</span>
<span title="磁盘写入速度Bps">{{system.disk_write_KBps| sc_filter_filerate_k2}}</span>
</td>
</tr>
</table>
</div>
<div class="span2">
<table class="table table-bordered" ng-if="system">
<tr>
<th colspan="2">其他信息</th>
</tr>
<tr>
<td title="系统CPU信息">CPU</td>
<td>
<span title="CPU核心数">{{system.cpus}}</span> /
<span title="在线CPU核心数">{{system.cpus_online}}</span>
</td>
</tr>
<tr>
<td title="SRS的PID">PID</td>
<td>{{server.pid}}</td>
</tr>
<tr>
<td title="SRS的父PID">PPID</td>
<td>{{server.ppid}}</td>
</tr>
<tr>
<td title="SRS API是否有效">Ready</td>
<td>{{global.ok| sc_filter_yesno}}</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,137 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
SRS Summary
</a>
</div>
<div id="collapseOne" class="accordion-body collapse">
<div class="accordion-inner">
<div class="row">
<div class="span3">
<table class="table table-bordered" ng-if="server">
<tr>
<th colspan="2">SRS/{{server.version}}</th>
</tr>
<tr>
<td>Alive</td>
<td>{{server.srs_uptime| sc_filter_time}}</td>
</tr>
<tr>
<td>CPU</td>
<td>{{server.cpu_percent| sc_filter_percentf}} / {{system.cpus_online| sc_filter_percentf}}</td>
</tr>
<tr>
<td>Memory</td>
<td>
{{server.mem_percent| sc_filter_percentf2}}
{{server.mem_kbyte| sc_filter_filesize_k2}} / {{system.mem_ram_kbyte| sc_filter_filesize_k2}}
</td>
</tr>
<tr>
<td>Network</td>
<td>
<span title="SRS Connections">{{system.conn_srs}}</span> /
<span title="SRS Inbound Bandwidth">{{kbps.in.srs| sc_filter_bitrate_k2}}</span> /
<span title="SRS Outbound Bandwidth">{{kbps.out.srs| sc_filter_bitrate_k2}}</span>
</td>
</tr>
</table>
</div>
<div class="span3">
<table class="table table-bordered" ng-if="system">
<tr>
<th colspan="2">OS System</th>
</tr>
<tr>
<td>Alive</td>
<td>{{system.uptime| sc_filter_time}}</td>
</tr>
<tr>
<td>CPU</td>
<td>{{system.cpu_percent * system.cpus_online| sc_filter_percentf}} / {{system.cpus_online| sc_filter_percentf}}</td>
</tr>
<tr>
<td>Memory</td>
<td>
{{system.mem_ram_percent| sc_filter_percentf2}}
{{system.mem_ram_kbyte * system.mem_ram_percent| sc_filter_filesize_k2}} / {{system.mem_ram_kbyte| sc_filter_filesize_k2}}
</td>
</tr>
<tr>
<td>Load</td>
<td>{{system.load_1m| sc_filter_number}} / {{system.load_5m| sc_filter_number}} / {{system.load_15m| sc_filter_number}}</td>
</tr>
</table>
</div>
<div class="span3">
<table class="table table-bordered" ng-if="system">
<tr>
<th colspan="2">IO Load</th>
</tr>
<tr>
<td>Internet</td>
<td>
<span title="Internet Inbound Bandwidth">{{kbps.in.sys| sc_filter_bitrate_k2}}</span> /
<span title="Internet Outbound Bandwidth">{{kbps.out.sys| sc_filter_bitrate_k2}}</span>
</td>
</tr>
<tr>
<td>Intranet</td>
<td>
<span title="Intranet Inbound Bandwidth">{{kbps.in.inner| sc_filter_bitrate_k2}}</span> /
<span title="Intranet Outbound Bandwidth">{{kbps.out.inner| sc_filter_bitrate_k2}}</span>
</td>
</tr>
<tr>
<td title="Connections">Conns</td>
<td>
<span title="System">{{system.conn_sys}}</span>
<span title="System ESTABLISHED">{{system.conn_sys_et}}</span>
<span title="System TIME_WAIT">{{system.conn_sys_tw}}</span>
<span title="System UDP Bind Ports">{{system.conn_sys_udp}}</span>
</td>
</tr>
<tr>
<td>Disk</td>
<td>
<span title="IO Busy">{{system.disk_busy_percent| sc_filter_percentf2}}</span>
<span title="Disk Read in Bps">{{system.disk_read_KBps| sc_filter_filerate_k2}}</span>
<span title="Disk Write in Bps">{{system.disk_write_KBps| sc_filter_filerate_k2}}</span>
</td>
</tr>
</table>
</div>
<div class="span2">
<table class="table table-bordered" ng-if="system">
<tr>
<th colspan="2">Others</th>
</tr>
<tr>
<td title="System CPU Usage">CPU</td>
<td>
<span title="Number of CPU">{{system.cpus}}</span> /
<span title="Online CPUs">{{system.cpus_online}}</span>
</td>
</tr>
<tr>
<td title="PID of SRS">PID</td>
<td>{{server.pid}}</td>
</tr>
<tr>
<td title="PID of SRS's Parent">PPID</td>
<td>{{server.ppid}}</td>
</tr>
<tr>
<td title="Whether SRS API Ready?">Ready</td>
<td>{{global.ok| sc_filter_yesno}}</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,23 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" href="javascript:void(0)">
虚拟主机-{{vhost.id}}
</a>
</div>
<div id="collapseOne" class="accordion-body collapse in">
<div class="accordion-inner">
<p>ID: {{vhost.id}}</p>
<p>Name: {{vhost.name}}</p>
<p>Enabled: {{vhost.enabled| sc_filter_enabled}}</p>
<p>Streams: {{vhost.streams}}人</p>
<p>Clients: {{vhost.clients}}人</p>
<p>Recv: {{vhost.kbps.recv_30s| sc_filter_bitrate_k}}</p>
<p>Send: {{vhost.kbps.send_30s| sc_filter_bitrate_k}}</p>
<p>HLS: {{vhost.hls.enabled| sc_filter_enabled}}</p>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,23 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" href="javascript:void(0)">
Vhost-{{vhost.id}}
</a>
</div>
<div id="collapseOne" class="accordion-body collapse in">
<div class="accordion-inner">
<p>ID: {{vhost.id}}</p>
<p>Name: {{vhost.name}}</p>
<p>Enabled: {{vhost.enabled| sc_filter_enabled}}</p>
<p>Streams: {{vhost.streams}} Clients</p>
<p>Clients: {{vhost.clients}} Clients</p>
<p>Recv: {{vhost.kbps.recv_30s| sc_filter_bitrate_k}}</p>
<p>Send: {{vhost.kbps.send_30s| sc_filter_bitrate_k}}</p>
<p>HLS: {{vhost.hls.enabled| sc_filter_enabled}}</p>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,37 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
虚拟主机(Vhosts)列表
</a>
</div>
<div id="collapseOne" class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-bordered">
<tr>
<th>ID</th>
<th>主机名称</th>
<th>状态</th>
<th>在线流</th>
<th>在线人数</th>
<th>入口带宽</th>
<th>出口带宽</th>
<th>HLS</th>
</tr>
<tr ng-repeat="vhost in vhosts">
<td><a href="javascript:void(0)" ng-click="gogogo('/vhosts/' + vhost.id)">{{vhost.id}}</a></td>
<td>{{vhost.name}}</td>
<td>{{vhost.enabled| sc_filter_enabled}}</td>
<td>{{vhost.streams}}个</td>
<td>{{vhost.clients}}人</td>
<td>{{vhost.kbps.recv_30s| sc_filter_bitrate_k}}</td>
<td>{{vhost.kbps.send_30s| sc_filter_bitrate_k}}</td>
<td>{{vhost.hls.enabled| sc_filter_enabled}}</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,37 @@
<div>
<div class="accordion">
<div class="accordion-group">
<div class="accordion-heading" sc-collapse="in">
<a class="accordion-toggle" href="javascript:void(0)">
System Vhosts
</a>
</div>
<div id="collapseOne" class="accordion-body collapse">
<div class="accordion-inner">
<table class="table table-striped table-bordered">
<tr>
<th>ID</th>
<th>Name</th>
<th>Status</th>
<th>Streams</th>
<th>Clients</th>
<th>Inbound</th>
<th>Outbound</th>
<th>HLS</th>
</tr>
<tr ng-repeat="vhost in vhosts">
<td><a href="javascript:void(0)" ng-click="gogogo('/vhosts/' + vhost.id)">{{vhost.id}}</a></td>
<td>{{vhost.name}}</td>
<td>{{vhost.enabled| sc_filter_enabled}}</td>
<td>{{vhost.streams}}个</td>
<td>{{vhost.clients}}人</td>
<td>{{vhost.kbps.recv_30s| sc_filter_bitrate_k}}</td>
<td>{{vhost.kbps.send_30s| sc_filter_bitrate_k}}</td>
<td>{{vhost.hls.enabled| sc_filter_enabled}}</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>