diff --git a/projects/IoTCenter/Areas/Admin/Views/LiveRecord/Details.cshtml b/projects/IoTCenter/Areas/Admin/Views/LiveRecord/Details.cshtml
index 28231515..01edabdf 100644
--- a/projects/IoTCenter/Areas/Admin/Views/LiveRecord/Details.cshtml
+++ b/projects/IoTCenter/Areas/Admin/Views/LiveRecord/Details.cshtml
@@ -2,19 +2,4 @@
@{
HtmlTitle = Model.Name;
}
-
-@section scripts{
-
-
-}
\ No newline at end of file
+
\ No newline at end of file
diff --git a/projects/IoTCenter/Controllers/AppController.cs b/projects/IoTCenter/Controllers/AppController.cs
index 925ba02f..07ead08a 100644
--- a/projects/IoTCenter/Controllers/AppController.cs
+++ b/projects/IoTCenter/Controllers/AppController.cs
@@ -10,6 +10,7 @@ using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
+using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Drawing;
@@ -469,5 +470,41 @@ namespace IoTCenter.Controllers
}
}
}
+
+ #region srs callback
+
+ ///
+ /// 录制完毕事件响应
+ ///{"action":"on_dvr","client_id":107,"ip":"192.168.3.124","vhost":"__defaultVhost__","app":"live","stream":"main0a5d5deee43011b483884cbd8fd2b3dd","param":"","cwd":"/root/publish/apps/srs","file":"./objs/nginx/html/live.main0a5d5deee43011b483884cbd8fd2b3dd.1574832559180.mp4"}
+ ///
+ ///
+ public IActionResult OnDvr()
+ {
+ using (var reader = new StreamReader(Request.Body))
+ {
+ var json = reader.ReadToEndAsync().Result;
+ var result = JsonConvert.DeserializeObject>(json);
+ if (result["action"] == "on_dvr")
+ {
+ var streamId = result["stream"];
+ var deviceNumber = streamId.StartsWith("main") ? streamId.Substring(4) : streamId.Substring(3);
+ var device = this._deviceRepo.ReadOnlyTable().FirstOrDefault(o => o.Number == deviceNumber);
+ if (device != null)
+ {
+ this._liveRecordRepo.Add(new LiveRecord
+ {
+ DeviceNumber = deviceNumber,
+ DeviceName = device?.DisplayName,
+ Name = $"回放{DateTime.Now.ToString("yyyy-MM-dd HH:mm")}",
+ Value = $"/video{result["file"].Substring(result["file"].LastIndexOf('/'))}"
+ });
+ this._liveRecordRepo.SaveChanges();
+ }
+ }
+ }
+ return Content(string.Empty);
+ }
+
+ #endregion srs callback
}
}
\ No newline at end of file
diff --git a/projects/IoTCenter/Controllers/ServiceController.cs b/projects/IoTCenter/Controllers/ServiceController.cs
deleted file mode 100644
index 7eb9002b..00000000
--- a/projects/IoTCenter/Controllers/ServiceController.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using Application.Domain.Entities;
-using Infrastructure.Data;
-using Microsoft.AspNetCore.Mvc;
-using Newtonsoft.Json;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-
-namespace IoTCenter.Controllers
-{
- public class ServiceController : Controller
- {
- private readonly IRepository _deviceRepo;
- private readonly IRepository _liveRecordRepo;
-
- public ServiceController(IRepository deviceRepo, IRepository liveRecordRepo)
- {
- this._deviceRepo = deviceRepo;
- this._liveRecordRepo = liveRecordRepo;
- }
-
- ///
- /// 录制完毕事件响应
- ///{"action":"on_dvr","client_id":128,"ip":"127.0.0.1","vhost":"__defaultVhost__","app":"live","stream":"mainb57e867ae29d11b483864cbd8fd0f747","param":"","cwd":"/root/publish/apps/srs","file":"./objs/nginx/html/live/mainb57e867ae29d11b483864cbd8fd0f747.1565084670048.flv"}
- ///
- ///
- public IActionResult OnDvr()
- {
- using (var reader = new StreamReader(Request.Body))
- {
- var json = reader.ReadToEndAsync().Result;
- var result = JsonConvert.DeserializeObject>(json);
- if (result["action"] == "on_dvr")
- {
- var streamId = result["stream"];
- var deviceNumber = streamId.StartsWith("main") ? streamId.Substring(4) : streamId.Substring(3);
- var device = this._deviceRepo.ReadOnlyTable().FirstOrDefault(o => o.Number == deviceNumber);
- this._liveRecordRepo.Add(new LiveRecord
- {
- DeviceNumber = deviceNumber,
- DeviceName = device?.DisplayName,
- Name = $"回放{DateTime.Now.ToString("yyyy-MM-dd HH:mm")}",
- Value = $"/video{result["file"].Substring(result["file"].LastIndexOf('/'))}"
- });
- this._liveRecordRepo.SaveChanges();
- }
- }
- return Content(string.Empty);
- }
- }
-}
\ No newline at end of file
diff --git a/projects/IoTCenter/appsettings.json b/projects/IoTCenter/appsettings.json
index 8a5e10f8..6111e72a 100644
--- a/projects/IoTCenter/appsettings.json
+++ b/projects/IoTCenter/appsettings.json
@@ -1,5 +1,5 @@
{
- "version": "1.0.0-rc.106",
+ "version": "1.0.0-rc.107",
"Logging": {
"LogLevel": {
"Default": "Warning",
diff --git a/publish/src/linux-x64/publish/apps/srs/conf/full.conf b/publish/src/linux-x64/publish/apps/srs/conf/full.conf
new file mode 100644
index 00000000..cf3e0217
--- /dev/null
+++ b/publish/src/linux-x64/publish/apps/srs/conf/full.conf
@@ -0,0 +1,1848 @@
+# all config for srs
+
+#############################################################################################
+# RTMP sections
+#############################################################################################
+# the rtmp listen ports, split by space, each listen entry is <[ip:]port>
+# for example, 192.168.1.100:1935 10.10.10.100:1935
+# where the ip is optional, default to 0.0.0.0, that is 1935 equals to 0.0.0.0:1935
+listen 1935;
+# the pid file
+# to ensure only one process can use a pid file
+# and provides the current running process id, for script,
+# for example, init.d script to manage the server.
+# default: ./objs/srs.pid
+pid ./objs/srs.pid;
+# the default chunk size is 128, max is 65536,
+# some client does not support chunk size change,
+# however, most clients support it and it can improve
+# performance about 10%.
+# default: 60000
+chunk_size 60000;
+# the logs dir.
+# if enabled ffmpeg, each transcoding stream will create a log file.
+# /dev/null to disable the log.
+# default: ./objs
+ff_log_dir ./objs;
+# the log tank, console or file.
+# if console, print log to console.
+# if file, write log to file. requires srs_log_file if log to file.
+# default: file.
+srs_log_tank file;
+# the log level, for all log tanks.
+# can be: verbose, info, trace, warn, error
+# default: trace
+srs_log_level trace;
+# when srs_log_tank is file, specifies the log file.
+# default: ./objs/srs.log
+srs_log_file ./objs/srs.log;
+# the max connections.
+# if exceed the max connections, server will drop the new connection.
+# default: 1000
+max_connections 1000;
+# whether start as daemon
+# @remark: do not support reload.
+# default: on
+daemon on;
+# whether use utc_time to generate the time struct,
+# if off, use localtime() to generate it,
+# if on, use gmtime() instead, which use UTC time.
+# default: off
+utc_time off;
+# config for the pithy print in ms,
+# which always print constant message specified by interval,
+# whatever the clients in concurrency.
+# default: 10000
+pithy_print_ms 10000;
+
+# the work dir for server, to chdir(work_dir) when not empty or "./"
+# user can config this directory to change the dir.
+# @reamrk do not support reload.
+# default: ./
+work_dir ./;
+# whether quit when parent process changed,
+# used for supervisor mode(not daemon), srs should always quit when
+# supervisor process exited.
+# @remark conflict with daemon, error when both daemon and asprocess are on.
+# @reamrk do not support reload.
+# default: off
+asprocess off;
+
+#############################################################################################
+# heartbeat/stats sections
+#############################################################################################
+# heartbeat to api server
+# @remark, the ip report to server, is retrieve from system stat,
+# which need the config item stats.network.
+heartbeat {
+ # whether heartbeat is enabled.
+ # default: off
+ enabled off;
+ # the interval seconds for heartbeat,
+ # recommend 0.3,0.6,0.9,1.2,1.5,1.8,2.1,2.4,2.7,3,...,6,9,12,....
+ # default: 9.9
+ interval 9.3;
+ # when startup, srs will heartbeat to this api.
+ # @remark: must be a restful http api url, where SRS will POST with following data:
+ # {
+ # "device_id": "my-srs-device",
+ # "ip": "192.168.1.100"
+ # }
+ # default: http://127.0.0.1:8085/api/v1/servers
+ url http://127.0.0.1:8085/api/v1/servers;
+ # the id of device.
+ device_id "my-srs-device";
+ # whether report with summaries
+ # if on, put /api/v1/summaries to the request data:
+ # {
+ # "summaries": summaries object.
+ # }
+ # @remark: optional config.
+ # default: off
+ summaries off;
+}
+
+# system statistics section.
+# the main cycle will retrieve the system stat,
+# for example, the cpu/mem/network/disk-io data,
+# the http api, for instance, /api/v1/summaries will show these data.
+# @remark the heartbeat depends on the network,
+# for example, the eth0 maybe the device which index is 0.
+stats {
+ # the index of device ip.
+ # we may retrieve more than one network device.
+ # default: 0
+ network 0;
+ # the device name to stat the disk iops.
+ # ignore the device of /proc/diskstats if not configured.
+ disk sda sdb xvda xvdb;
+}
+
+#############################################################################################
+# HTTP sections
+#############################################################################################
+# api of srs.
+# the http api config, export for external program to manage srs.
+# user can access http api of srs in browser directly, for instance, to access by:
+# curl http://192.168.1.170:1985/api/v1/reload
+# which will reload srs, like cmd killall -1 srs, but the js can also invoke the http api,
+# where the cli can only be used in shell/terminate.
+http_api {
+ # whether http api is enabled.
+ # default: off
+ enabled on;
+ # the http api listen entry is <[ip:]port>
+ # for example, 192.168.1.100:1985
+ # where the ip is optional, default to 0.0.0.0, that is 1985 equals to 0.0.0.0:1985
+ # default: 1985
+ listen 1985;
+ # whether enable crossdomain request.
+ # default: on
+ crossdomain on;
+ # the HTTP RAW API is more powerful api to change srs state and reload.
+ raw_api {
+ # whether enable the HTTP RAW API.
+ # default: off
+ enabled off;
+ # whether enable rpc reload.
+ # default: off
+ allow_reload off;
+ # whether enable rpc query.
+ # default: off
+ allow_query off;
+ # whether enable rpc update.
+ # default: off
+ allow_update off;
+ }
+}
+# embedded http server in srs.
+# the http streaming config, for HLS/HDS/DASH/HTTPProgressive
+# global config for http streaming, user must config the http section for each vhost.
+# the embed http server used to substitute nginx in ./objs/nginx,
+# for example, srs running in arm, can provides RTMP and HTTP service, only with srs installed.
+# user can access the http server pages, generally:
+# curl http://192.168.1.170:80/srs.html
+# which will show srs version and welcome to srs.
+# @remark, the http embedded stream need to config the vhost, for instance, the __defaultVhost__
+# need to open the feature http of vhost.
+http_server {
+ # whether http streaming service is enabled.
+ # default: off
+ enabled on;
+ # the http streaming listen entry is <[ip:]port>
+ # for example, 192.168.1.100:8080
+ # where the ip is optional, default to 0.0.0.0, that is 8080 equals to 0.0.0.0:8080
+ # @remark, if use lower port, for instance 80, user must start srs by root.
+ # default: 8080
+ listen 8080;
+ # the default dir for http root.
+ # default: ./objs/nginx/html
+ dir ./objs/nginx/html;
+ # whether enable crossdomain request.
+ # for both http static and stream server and apply on all vhosts.
+ # default: on
+ crossdomain on;
+}
+
+#############################################################################################
+# Streamer sections
+#############################################################################################
+# the streamer cast stream from other protocol to SRS over RTMP.
+# @see https://github.com/ossrs/srs/tree/develop#stream-architecture
+stream_caster {
+ # whether stream caster is enabled.
+ # default: off
+ enabled off;
+ # the caster type of stream, the casters:
+ # mpegts_over_udp, MPEG-TS over UDP caster.
+ # rtsp, Real Time Streaming Protocol (RTSP).
+ # flv, FLV over HTTP POST.
+ caster mpegts_over_udp;
+ # the output rtmp url.
+ # for mpegts_over_udp caster, the typically output url:
+ # rtmp://127.0.0.1/live/livestream
+ # for rtsp caster, the typically output url:
+ # rtmp://127.0.0.1/[app]/[stream]
+ # for example, the rtsp url:
+ # rtsp://192.168.1.173:8544/live/livestream.sdp
+ # where the [app] is "live" and [stream] is "livestream", output is:
+ # rtmp://127.0.0.1/live/livestream
+ # for flv caster, the typically output url:
+ # rtmp://127.0.0.1/[app]/[stream]
+ # for example, POST to url:
+ # http://127.0.0.1:8936/live/livestream.flv
+ # where the [app] is "live" and [stream] is "livestream", output is:
+ # rtmp://127.0.0.1/live/livestream
+ output rtmp://127.0.0.1/live/livestream;
+ # the listen port for stream caster.
+ # for mpegts_over_udp caster, listen at udp port. for example, 8935.
+ # for rtsp caster, listen at tcp port. for example, 554.
+ # for flv caster, listen at tcp port. for example, 8936.
+ # TODO: support listen at <[ip:]port>
+ listen 8935;
+ # for the rtsp caster, the rtp server local port over udp,
+ # which reply the rtsp setup request message, the port will be used:
+ # [rtp_port_min, rtp_port_max)
+ rtp_port_min 57200;
+ rtp_port_max 57300;
+}
+stream_caster {
+ enabled off;
+ caster mpegts_over_udp;
+ output rtmp://127.0.0.1/live/livestream;
+ listen 8935;
+}
+stream_caster {
+ enabled off;
+ caster rtsp;
+ output rtmp://127.0.0.1/[app]/[stream];
+ listen 554;
+ rtp_port_min 57200;
+ rtp_port_max 57300;
+}
+stream_caster {
+ enabled off;
+ caster flv;
+ output rtmp://127.0.0.1/[app]/[stream];
+ listen 8936;
+}
+
+#############################################################################################
+# Kafka sections
+#############################################################################################
+# Apache Kafka is a high-throughput distributed messaging system.
+# SRS is a Kafka producer to send message to kafka.
+# @see https://kafka.apache.org/documentation.html#introduction
+kafka {
+ # whether enabled kafka.
+ # default: off
+ enabled off;
+ # the broker list, broker is
+ # and use space to specify multple brokers.
+ # for example, 127.0.0.1:9092 127.0.0.1:9093
+ brokers 127.0.0.1:9092;
+ # the kafka topic to use.
+ # default: srs
+ topic srs;
+}
+
+#############################################################################################
+# RTMP/HTTP VHOST sections
+#############################################################################################
+# vhost list, the __defaultVhost__ is the default vhost
+# for example, user use ip to access the stream: rtmp://192.168.1.2/live/livestream.
+# for which cannot identify the required vhost.
+vhost __defaultVhost__ {
+}
+
+# the vhost scope configs.
+vhost scope.vhost.srs.com {
+ # whether the vhost is enabled.
+ # if off, all request access denied.
+ # default: on
+ enabled off;
+
+ # whether enable min delay mode for vhost.
+ # for min latency mode:
+ # 1. disable the publish.mr for vhost.
+ # 2. use timeout for cond wait for consumer queue.
+ # @see https://github.com/ossrs/srs/issues/257
+ # default: off
+ min_latency off;
+
+ # whether enable the TCP_NODELAY
+ # if on, set the nodelay of fd by setsockopt
+ # default: off
+ tcp_nodelay off;
+
+ # the default chunk size is 128, max is 65536,
+ # some client does not support chunk size change,
+ # vhost chunk size will override the global value.
+ # default: global chunk size.
+ chunk_size 128;
+
+ # The input ack size, 0 to not set.
+ # Generally, it's set by the message from peer,
+ # but for some peer(encoder), it never send message but use a different ack size.
+ # We can chnage the default ack size in server-side, to send acknowledge message,
+ # or the encoder maybe blocked after publishing for some time.
+ # Default: 0
+ in_ack_size 0;
+
+ # The output ack size, 0 to not set.
+ # This is used to notify the peer(player) to send acknowledge to server.
+ # Default: 2500000
+ out_ack_size 2500000;
+}
+
+# set the chunk size of vhost.
+vhost chunksize.srs.com {
+ # @see scope.vhost.srs.com
+ chunk_size 128;
+}
+
+# the vhost disabled.
+vhost removed.srs.com {
+ # @see scope.vhost.srs.com
+ enabled off;
+}
+
+# vhost for stream cluster for RTMP/FLV
+vhost cluster.srs.com {
+ # The config for cluster.
+ cluster {
+ # The cluster mode, local or remote.
+ # local: It's an origin server, serve streams itself.
+ # remote: It's an edge server, fetch or push stream to origin server.
+ # default: local
+ mode remote;
+
+ # For edge(mode remote), user must specifies the origin server
+ # format as: [:port]
+ # @remark user can specifies multiple origin for error backup, by space,
+ # for example, 192.168.1.100:1935 192.168.1.101:1935 192.168.1.102:1935
+ origin 127.0.0.1:1935 localhost:1935;
+
+ # For edge(mode remote), whether open the token traverse mode,
+ # if token traverse on, all connections of edge will forward to origin to check(auth),
+ # it's very important for the edge to do the token auth.
+ # the better way is use http callback to do the token auth by the edge,
+ # but if user prefer origin check(auth), the token_traverse if better solution.
+ # default: off
+ token_traverse off;
+
+ # For edge(mode remote), the vhost to transform for edge,
+ # to fetch from the specified vhost at origin,
+ # if not specified, use the current vhost of edge in origin, the variable [vhost].
+ # default: [vhost]
+ vhost same.edge.srs.com;
+
+ # For edge(mode remote), when upnode(forward to, edge push to, edge pull from) is srs,
+ # it's strongly recommend to open the debug_srs_upnode,
+ # when connect to upnode, it will take the debug info,
+ # for example, the id, source id, pid.
+ # please see: https://github.com/ossrs/srs/wiki/v1_CN_SrsLog
+ # default: on
+ debug_srs_upnode on;
+
+ # For origin(mode local) cluster, turn on the cluster.
+ # @remark Origin cluster only supports RTMP, use Edge to transmux RTMP to FLV.
+ # default: off
+ # TODO: FIXME: Support reload.
+ origin_cluster off;
+
+ # For origin (mode local) cluster, the co-worker's HTTP APIs.
+ # This origin will connect to co-workers and communicate with them.
+ # please read: https://github.com/ossrs/srs/wiki/v3_EN_OriginCluster
+ # TODO: FIXME: Support reload.
+ coworkers 127.0.0.1:9091 127.0.0.1:9092;
+ }
+}
+
+# vhost for edge, edge and origin is the same vhost
+vhost same.edge.srs.com {
+ # @see cluster.srs.com
+ cluster {
+ mode remote;
+ origin 127.0.0.1:1935 localhost:1935;
+ token_traverse off;
+ }
+}
+
+# vhost for edge, edge transform vhost to fetch from another vhost.
+vhost transform.edge.srs.com {
+ # @see cluster.srs.com
+ cluster {
+ mode remote;
+ origin 127.0.0.1:1935;
+ vhost same.edge.srs.com;
+ }
+}
+
+# the vhost for srs debug info, whether send args in connect(tcUrl).
+vhost debug.srs.com {
+ # @see cluster.srs.com
+ cluster {
+ debug_srs_upnode on;
+ }
+}
+
+# the vhost which forward publish streams.
+vhost same.vhost.forward.srs.com {
+ # forward stream to other servers.
+ forward {
+ # whether enable the forward.
+ # default: off
+ enabled on;
+ # forward all publish stream to the specified server.
+ # this used to split/forward the current stream for cluster active-standby,
+ # active-active for cdn to build high available fault tolerance system.
+ # format: {ip}:{port} {ip_N}:{port_N}
+ destination 127.0.0.1:1936 127.0.0.1:1937;
+ }
+}
+
+# the play specified configs
+vhost play.srs.com {
+ # for play client, both RTMP and other stream clients,
+ # for instance, the HTTP FLV stream clients.
+ play {
+ # whether cache the last gop.
+ # if on, cache the last gop and dispatch to client,
+ # to enabled fast startup for client, client play immediately.
+ # if off, send the latest media data to client,
+ # client need to wait for the next Iframe to decode and show the video.
+ # set to off if requires min delay;
+ # set to on if requires client fast startup.
+ # default: on
+ gop_cache off;
+ # the max live queue length in seconds.
+ # if the messages in the queue exceed the max length,
+ # drop the old whole gop.
+ # default: 30
+ queue_length 10;
+
+ # about the stream monotonically increasing:
+ # 1. video timestamp is monotonically increasing,
+ # 2. audio timestamp is monotonically increasing,
+ # 3. video and audio timestamp is interleaved/mixed monotonically increasing.
+ # it's specified by RTMP specification, @see 3. Byte Order, Alignment, and Time Format
+ # however, some encoder cannot provides this feature, please set this to off to ignore time jitter.
+ # the time jitter algorithm:
+ # 1. full, to ensure stream start at zero, and ensure stream monotonically increasing.
+ # 2. zero, only ensure stream start at zero, ignore timestamp jitter.
+ # 3. off, disable the time jitter algorithm, like atc.
+ # @remark for full, correct timestamp only when |delta| > 250ms.
+ # @remark disabled when atc is on.
+ # default: full
+ time_jitter full;
+ # vhost for atc for hls/hds/rtmp backup.
+ # generally, atc default to off, server delivery rtmp stream to client(flash) timestamp from 0.
+ # when atc is on, server delivery rtmp stream by absolute time.
+ # atc is used, for instance, encoder will copy stream to master and slave server,
+ # server use atc to delivery stream to edge/client, where stream time from master/slave server
+ # is always the same, client/tools can slice RTMP stream to HLS according to the same time,
+ # if the time not the same, the HLS stream cannot slice to support system backup.
+ #
+ # @see http://www.adobe.com/cn/devnet/adobe-media-server/articles/varnish-sample-for-failover.html
+ # @see http://www.baidu.com/#wd=hds%20hls%20atc
+ #
+ # @remark when atc is on, auto off the time_jitter
+ # default: off
+ atc off;
+ # whether use the interleaved/mixed algorithm to correct the timestamp.
+ # if on, always ensure the timestamp of audio+video is interleaved/mixed monotonically increase.
+ # if off, use time_jitter to correct the timestamp if required.
+ # @remark to use mix_correct, atc should on(or time_jitter should off).
+ # default: off
+ mix_correct off;
+
+ # whether enable the auto atc,
+ # if enabled, detect the bravo_atc="true" in onMetaData packet,
+ # set atc to on if matched.
+ # always ignore the onMetaData if atc_auto is off.
+ # default: off
+ atc_auto off;
+
+ # set the MW(merged-write) latency in ms.
+ # SRS always set mw on, so we just set the latency value.
+ # the latency of stream >= mw_latency + mr_latency
+ # the value recomment is [300, 1800]
+ # default: 350
+ mw_latency 350;
+
+ # the minimal packets send interval in ms,
+ # used to control the ndiff of stream by srs_rtmp_dump,
+ # for example, some device can only accept some stream which
+ # delivery packets in constant interval(not cbr).
+ # @remark 0 to disable the minimal interval.
+ # @remark >0 to make the srs to send message one by one.
+ # @remark user can get the right packets interval in ms by srs_rtmp_dump.
+ # default: 0
+ send_min_interval 10.0;
+ # whether reduce the sequence header,
+ # for some client which cannot got duplicated sequence header,
+ # while the sequence header is not changed yet.
+ # default: off
+ reduce_sequence_header on;
+ }
+}
+
+# vhost for time jitter
+vhost jitter.srs.com {
+ # @see play.srs.com
+ # to use time_jitter full, the default config.
+ play {
+ }
+ # to use mix_correct.
+ play {
+ time_jitter off;
+ mix_correct on;
+ }
+ play {
+ atc on;
+ mix_correct on;
+ }
+ # to use atc
+ play {
+ atc on;
+ }
+}
+
+# vhost for atc.
+vhost atc.srs.com {
+ # @see play.srs.com
+ play {
+ atc on;
+ atc_auto on;
+ }
+}
+
+# the MR(merged-read) setting for publisher.
+# the MW(merged-write) settings for player.
+vhost mrw.srs.com {
+ # @see scope.vhost.srs.com
+ min_latency off;
+
+ # @see play.srs.com
+ play {
+ mw_latency 350;
+ }
+
+ # @see publish.srs.com
+ publish {
+ mr on;
+ mr_latency 350;
+ }
+}
+
+# the vhost for min delay, do not cache any stream.
+vhost min.delay.com {
+ # @see scope.vhost.srs.com
+ min_latency on;
+ # @see scope.vhost.srs.com
+ tcp_nodelay on;
+
+ # @see play.srs.com
+ play {
+ mw_latency 100;
+ gop_cache off;
+ queue_length 10;
+ }
+
+ # @see publish.srs.com
+ publish {
+ mr off;
+ }
+}
+
+# whether disable the sps parse, for the resolution of video.
+vhost no.parse.sps.com {
+ # @see publish.srs.com
+ publish {
+ parse_sps on;
+ }
+}
+
+# the vhost to control the stream delivery feature
+vhost stream.control.com {
+ # @see scope.vhost.srs.com
+ min_latency on;
+ # @see scope.vhost.srs.com
+ tcp_nodelay on;
+
+ # @see play.srs.com
+ play {
+ mw_latency 100;
+ queue_length 10;
+ send_min_interval 10.0;
+ reduce_sequence_header on;
+ }
+
+ # @see publish.srs.com
+ publish {
+ mr off;
+ firstpkt_timeout 20000;
+ normal_timeout 7000;
+ }
+}
+
+# the publish specified configs
+vhost publish.srs.com {
+ # the config for FMLE/Flash publisher, which push RTMP to SRS.
+ publish {
+ # about MR, read https://github.com/ossrs/srs/issues/241
+ # when enabled the mr, SRS will read as large as possible.
+ # default: off
+ mr off;
+ # the latency in ms for MR(merged-read),
+ # the performance+ when latency+, and memory+,
+ # memory(buffer) = latency * kbps / 8
+ # for example, latency=500ms, kbps=3000kbps, each publish connection will consume
+ # memory = 500 * 3000 / 8 = 187500B = 183KB
+ # when there are 2500 publisher, the total memory of SRS at least:
+ # 183KB * 2500 = 446MB
+ # the recommended value is [300, 2000]
+ # default: 350
+ mr_latency 350;
+
+ # the 1st packet timeout in ms for encoder.
+ # default: 20000
+ firstpkt_timeout 20000;
+ # the normal packet timeout in ms for encoder.
+ # default: 5000
+ normal_timeout 7000;
+ # whether parse the sps when publish stream.
+ # we can got the resolution of video for stat api.
+ # but we may failed to cause publish failed.
+ # default: on
+ parse_sps on;
+ }
+}
+
+# the vhost for anti-suck.
+vhost refer.anti_suck.com {
+ # refer hotlink-denial.
+ refer {
+ # whether enable the refer hotlink-denial.
+ # default: off.
+ enabled on;
+ # the common refer for play and publish.
+ # if the page url of client not in the refer, access denied.
+ # if not specified this field, allow all.
+ # default: not specified.
+ all github.com github.io;
+ # refer for publish clients specified.
+ # the common refer is not overridden by this.
+ # if not specified this field, allow all.
+ # default: not specified.
+ publish github.com github.io;
+ # refer for play clients specified.
+ # the common refer is not overridden by this.
+ # if not specified this field, allow all.
+ # default: not specified.
+ play github.com github.io;
+ }
+}
+
+# vhost for bandwidth check
+# generally, the bandcheck vhost must be: bandcheck.srs.com,
+# or need to modify the vhost of client.
+vhost bandcheck.srs.com {
+ enabled on;
+ chunk_size 65000;
+ # bandwidth check config.
+ bandcheck {
+ # whether support bandwidth check,
+ # default: off.
+ enabled on;
+ # the key for server to valid,
+ # if invalid key, server disconnect and abort the bandwidth check.
+ key "35c9b402c12a7246868752e2878f7e0e";
+ # the interval in seconds for bandwidth check,
+ # server do not allow new test request.
+ # default: 30
+ interval 30;
+ # the max available check bandwidth in kbps.
+ # to avoid attack of bandwidth check.
+ # default: 1000
+ limit_kbps 4000;
+ }
+}
+
+# the security to allow or deny clients.
+vhost security.srs.com {
+ # security for host to allow or deny clients.
+ # @see https://github.com/ossrs/srs/issues/211
+ security {
+ # whether enable the security for vhost.
+ # default: off
+ enabled on;
+ # the security list, each item format as:
+ # allow|deny publish|play all|
+ # for example:
+ # allow publish all;
+ # deny publish all;
+ # allow publish 127.0.0.1;
+ # deny publish 127.0.0.1;
+ # allow play all;
+ # deny play all;
+ # allow play 127.0.0.1;
+ # deny play 127.0.0.1;
+ # SRS apply the following simple strategies one by one:
+ # 1. allow all if security disabled.
+ # 2. default to deny all when security enabled.
+ # 3. allow if matches allow strategy.
+ # 4. deny if matches deny strategy.
+ allow play all;
+ allow publish all;
+ }
+}
+
+# vhost for http static and flv vod stream for each vhost.
+vhost http.static.srs.com {
+ # http static vhost specified config
+ http_static {
+ # whether enabled the http static service for vhost.
+ # default: off
+ enabled on;
+ # the url to mount to,
+ # typical mount to [vhost]/
+ # the variables:
+ # [vhost] current vhost for http server.
+ # @remark the [vhost] is optional, used to mount at specified vhost.
+ # @remark the http of __defaultVhost__ will override the http_server section.
+ # for example:
+ # mount to [vhost]/
+ # access by http://ossrs.net:8080/xxx.html
+ # mount to [vhost]/hls
+ # access by http://ossrs.net:8080/hls/xxx.html
+ # mount to /
+ # access by http://ossrs.net:8080/xxx.html
+ # or by http://192.168.1.173:8080/xxx.html
+ # mount to /hls
+ # access by http://ossrs.net:8080/hls/xxx.html
+ # or by http://192.168.1.173:8080/hls/xxx.html
+ # @remark the port of http is specified by http_server section.
+ # default: [vhost]/
+ mount [vhost]/hls;
+ # main dir of vhost,
+ # to delivery HTTP stream of this vhost.
+ # default: ./objs/nginx/html
+ dir ./objs/nginx/html/hls;
+ }
+}
+
+# vhost for http flv/aac/mp3 live stream for each vhost.
+vhost http.remux.srs.com {
+ # http flv/mp3/aac/ts stream vhost specified config
+ http_remux {
+ # whether enable the http live streaming service for vhost.
+ # default: off
+ enabled on;
+ # the fast cache for audio stream(mp3/aac),
+ # to cache more audio and send to client in a time to make android(weixin) happy.
+ # @remark the flv/ts stream ignore it
+ # @remark 0 to disable fast cache for http audio stream.
+ # default: 0
+ fast_cache 30;
+ # the stream mount for rtmp to remux to live streaming.
+ # typical mount to [vhost]/[app]/[stream].flv
+ # the variables:
+ # [vhost] current vhost for http live stream.
+ # [app] current app for http live stream.
+ # [stream] current stream for http live stream.
+ # @remark the [vhost] is optional, used to mount at specified vhost.
+ # the extension:
+ # .flv mount http live flv stream, use default gop cache.
+ # .ts mount http live ts stream, use default gop cache.
+ # .mp3 mount http live mp3 stream, ignore video and audio mp3 codec required.
+ # .aac mount http live aac stream, ignore video and audio aac codec required.
+ # for example:
+ # mount to [vhost]/[app]/[stream].flv
+ # access by http://ossrs.net:8080/live/livestream.flv
+ # mount to /[app]/[stream].flv
+ # access by http://ossrs.net:8080/live/livestream.flv
+ # or by http://192.168.1.173:8080/live/livestream.flv
+ # mount to [vhost]/[app]/[stream].mp3
+ # access by http://ossrs.net:8080/live/livestream.mp3
+ # mount to [vhost]/[app]/[stream].aac
+ # access by http://ossrs.net:8080/live/livestream.aac
+ # mount to [vhost]/[app]/[stream].ts
+ # access by http://ossrs.net:8080/live/livestream.ts
+ # @remark the port of http is specified by http_server section.
+ # default: [vhost]/[app]/[stream].flv
+ mount [vhost]/[app]/[stream].flv;
+ }
+}
+
+# the http hook callback vhost, srs will invoke the hooks for specified events.
+vhost hooks.callback.srs.com {
+ http_hooks {
+ # whether the http hooks enable.
+ # default off.
+ enabled on;
+ # when client connect to vhost/app, call the hook,
+ # the request in the POST data string is a object encode by json:
+ # {
+ # "action": "on_connect",
+ # "client_id": 1985,
+ # "ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
+ # "tcUrl": "rtmp://video.test.com/live?key=d2fa801d08e3f90ed1e1670e6e52651a",
+ # "pageUrl": "http://www.test.com/live.html"
+ # }
+ # if valid, the hook must return HTTP code 200(Status OK) and response
+ # an int value specifies the error code(0 corresponding to success):
+ # 0
+ # support multiple api hooks, format:
+ # on_connect http://xxx/api0 http://xxx/api1 http://xxx/apiN
+ on_connect http://127.0.0.1:8085/api/v1/clients http://localhost:8085/api/v1/clients;
+ # when client close/disconnect to vhost/app/stream, call the hook,
+ # the request in the POST data string is a object encode by json:
+ # {
+ # "action": "on_close",
+ # "client_id": 1985,
+ # "ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
+ # "send_bytes": 10240, "recv_bytes": 10240
+ # }
+ # if valid, the hook must return HTTP code 200(Status OK) and response
+ # an int value specifies the error code(0 corresponding to success):
+ # 0
+ # support multiple api hooks, format:
+ # on_close http://xxx/api0 http://xxx/api1 http://xxx/apiN
+ on_close http://127.0.0.1:8085/api/v1/clients http://localhost:8085/api/v1/clients;
+ # when client(encoder) publish to vhost/app/stream, call the hook,
+ # the request in the POST data string is a object encode by json:
+ # {
+ # "action": "on_publish",
+ # "client_id": 1985,
+ # "ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
+ # "stream": "livestream", "param":"?token=xxx&salt=yyy"
+ # }
+ # if valid, the hook must return HTTP code 200(Status OK) and response
+ # an int value specifies the error code(0 corresponding to success):
+ # 0
+ # support multiple api hooks, format:
+ # on_publish http://xxx/api0 http://xxx/api1 http://xxx/apiN
+ on_publish http://127.0.0.1:8085/api/v1/streams http://localhost:8085/api/v1/streams;
+ # when client(encoder) stop publish to vhost/app/stream, call the hook,
+ # the request in the POST data string is a object encode by json:
+ # {
+ # "action": "on_unpublish",
+ # "client_id": 1985,
+ # "ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
+ # "stream": "livestream", "param":"?token=xxx&salt=yyy"
+ # }
+ # if valid, the hook must return HTTP code 200(Status OK) and response
+ # an int value specifies the error code(0 corresponding to success):
+ # 0
+ # support multiple api hooks, format:
+ # on_unpublish http://xxx/api0 http://xxx/api1 http://xxx/apiN
+ on_unpublish http://127.0.0.1:8085/api/v1/streams http://localhost:8085/api/v1/streams;
+ # when client start to play vhost/app/stream, call the hook,
+ # the request in the POST data string is a object encode by json:
+ # {
+ # "action": "on_play",
+ # "client_id": 1985,
+ # "ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
+ # "stream": "livestream", "param":"?token=xxx&salt=yyy",
+ # "pageUrl": "http://www.test.com/live.html"
+ # }
+ # if valid, the hook must return HTTP code 200(Status OK) and response
+ # an int value specifies the error code(0 corresponding to success):
+ # 0
+ # support multiple api hooks, format:
+ # on_play http://xxx/api0 http://xxx/api1 http://xxx/apiN
+ on_play http://127.0.0.1:8085/api/v1/sessions http://localhost:8085/api/v1/sessions;
+ # when client stop to play vhost/app/stream, call the hook,
+ # the request in the POST data string is a object encode by json:
+ # {
+ # "action": "on_stop",
+ # "client_id": 1985,
+ # "ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
+ # "stream": "livestream", "param":"?token=xxx&salt=yyy"
+ # }
+ # if valid, the hook must return HTTP code 200(Status OK) and response
+ # an int value specifies the error code(0 corresponding to success):
+ # 0
+ # support multiple api hooks, format:
+ # on_stop http://xxx/api0 http://xxx/api1 http://xxx/apiN
+ on_stop http://127.0.0.1:8085/api/v1/sessions http://localhost:8085/api/v1/sessions;
+ # when srs reap a dvr file, call the hook,
+ # the request in the POST data string is a object encode by json:
+ # {
+ # "action": "on_dvr",
+ # "client_id": 1985,
+ # "ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
+ # "stream": "livestream", "param":"?token=xxx&salt=yyy",
+ # "cwd": "/usr/local/srs",
+ # "file": "./objs/nginx/html/live/livestream.1420254068776.flv"
+ # }
+ # if valid, the hook must return HTTP code 200(Status OK) and response
+ # an int value specifies the error code(0 corresponding to success):
+ # 0
+ on_dvr http://127.0.0.1:8085/api/v1/dvrs http://localhost:8085/api/v1/dvrs;
+ # when srs reap a ts file of hls, call the hook,
+ # the request in the POST data string is a object encode by json:
+ # {
+ # "action": "on_hls",
+ # "client_id": 1985,
+ # "ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
+ # "stream": "livestream", "param":"?token=xxx&salt=yyy",
+ # "duration": 9.36, // in seconds
+ # "cwd": "/usr/local/srs",
+ # "file": "./objs/nginx/html/live/livestream/2015-04-23/01/476584165.ts",
+ # "url": "live/livestream/2015-04-23/01/476584165.ts",
+ # "m3u8": "./objs/nginx/html/live/livestream/live.m3u8",
+ # "m3u8_url": "live/livestream/live.m3u8",
+ # "seq_no": 100
+ # }
+ # if valid, the hook must return HTTP code 200(Status OK) and response
+ # an int value specifies the error code(0 corresponding to success):
+ # 0
+ on_hls http://127.0.0.1:8085/api/v1/hls http://localhost:8085/api/v1/hls;
+ # when srs reap a ts file of hls, call this hook,
+ # used to push file to cdn network, by get the ts file from cdn network.
+ # so we use HTTP GET and use the variable following:
+ # [app], replace with the app.
+ # [stream], replace with the stream.
+ # [param], replace with the param.
+ # [ts_url], replace with the ts url.
+ # ignore any return data of server.
+ # @remark random select a url to report, not report all.
+ on_hls_notify http://127.0.0.1:8085/api/v1/hls/[app]/[stream]/[ts_url][param];
+ }
+}
+
+# the vhost for exec, fork process when publish stream.
+vhost exec.srs.com {
+ # the exec used to fork process when got some event.
+ exec {
+ # whether enable the exec.
+ # default: off.
+ enabled off;
+ # when publish stream, exec the process with variables:
+ # [vhost] the input stream vhost.
+ # [port] the input stream port.
+ # [app] the input stream app.
+ # [stream] the input stream name.
+ # [engine] the transcode engine name.
+ # other variables for exec only:
+ # [url] the rtmp url which trigger the publish.
+ # [tcUrl] the client request tcUrl.
+ # [swfUrl] the client request swfUrl.
+ # [pageUrl] the client request pageUrl.
+ # @remark empty to ignore this exec.
+ publish ./objs/ffmpeg/bin/ffmpeg -f flv -i [url] -c copy -y ./[stream].flv;
+ }
+}
+
+# The vhost for MPEG-DASH.
+vhost dash.srs.com {
+ dash {
+ # Whether DASH is enabled.
+ # Transmux RTMP to DASH if on.
+ # Default: off
+ enabled on;
+ # The duration of segment in seconds.
+ # Default: 3
+ dash_fragment 3;
+ # The period to update the MPD in seconds.
+ # Default: 30
+ dash_update_period 30;
+ # The depth of timeshift buffer in seconds.
+ # Default: 60
+ dash_timeshift 60;
+ # The base/home dir/path for dash.
+ # All init and segment files will write under this dir.
+ dash_path ./objs/nginx/html;
+ # The DASH MPD file path.
+ # We supports some variables to generate the filename.
+ # [vhost], the vhost of stream.
+ # [app], the app of stream.
+ # [stream], the stream name of stream.
+ # Default: [app]/[stream].mpd
+ dash_mpd_file [app]/[stream].mpd;
+ }
+}
+
+# the vhost with hls specified.
+vhost hls.srs.com {
+ hls {
+ # whether the hls is enabled.
+ # if off, do not write hls(ts and m3u8) when publish.
+ # default: off
+ enabled on;
+ # the hls fragment in seconds, the duration of a piece of ts.
+ # default: 10
+ hls_fragment 10;
+ # the hls m3u8 target duration ratio,
+ # EXT-X-TARGETDURATION = hls_td_ratio * hls_fragment // init
+ # EXT-X-TARGETDURATION = max(ts_duration, EXT-X-TARGETDURATION) // for each ts
+ # @see https://github.com/ossrs/srs/issues/304#issuecomment-74000081
+ # default: 1.5
+ hls_td_ratio 1.5;
+ # the audio overflow ratio.
+ # for pure audio, the duration to reap the segment.
+ # for example, the hls_fragment is 10s, hls_aof_ratio is 2.0,
+ # the segment will reap to 20s for pure audio.
+ # default: 2.0
+ hls_aof_ratio 2.0;
+ # the hls window in seconds, the number of ts in m3u8.
+ # default: 60
+ hls_window 60;
+ # the error strategy. can be:
+ # ignore, disable the hls.
+ # disconnect, require encoder republish.
+ # continue, ignore failed try to continue output hls.
+ # @see https://github.com/ossrs/srs/issues/264
+ # default: continue
+ hls_on_error continue;
+ # the hls output path.
+ # the m3u8 file is configured by hls_path/hls_m3u8_file, the default is:
+ # ./objs/nginx/html/[app]/[stream].m3u8
+ # the ts file is configured by hls_path/hls_ts_file, the default is:
+ # ./objs/nginx/html/[app]/[stream]-[seq].ts
+ # @remark the hls_path is compatible with srs v1 config.
+ # default: ./objs/nginx/html
+ hls_path ./objs/nginx/html;
+ # the hls m3u8 file name.
+ # we supports some variables to generate the filename.
+ # [vhost], the vhost of stream.
+ # [app], the app of stream.
+ # [stream], the stream name of stream.
+ # default: [app]/[stream].m3u8
+ hls_m3u8_file [app]/[stream].m3u8;
+ # the hls ts file name.
+ # we supports some variables to generate the filename.
+ # [vhost], the vhost of stream.
+ # [app], the app of stream.
+ # [stream], the stream name of stream.
+ # [2006], replace this const to current year.
+ # [01], replace this const to current month.
+ # [02], replace this const to current date.
+ # [15], replace this const to current hour.
+ # [04], replace this const to current minute.
+ # [05], replace this const to current second.
+ # [999], replace this const to current millisecond.
+ # [timestamp],replace this const to current UNIX timestamp in ms.
+ # [seq], the sequence number of ts.
+ # [duration], replace this const to current ts duration.
+ # @see https://github.com/ossrs/srs/wiki/v2_CN_DVR#custom-path
+ # @see https://github.com/ossrs/srs/wiki/v2_CN_DeliveryHLS#hls-config
+ # default: [app]/[stream]-[seq].ts
+ hls_ts_file [app]/[stream]-[seq].ts;
+ # whether use floor for the hls_ts_file path generation.
+ # if on, use floor(timestamp/hls_fragment) as the variable [timestamp],
+ # and use enhanced algorithm to calc deviation for segment.
+ # @remark when floor on, recommend the hls_segment>=2*gop.
+ # default: off
+ hls_ts_floor off;
+ # the hls entry prefix, which is base url of ts url.
+ # for example, the prefix is:
+ # http://your-server/
+ # then, the ts path in m3u8 will be like:
+ # http://your-server/live/livestream-0.ts
+ # http://your-server/live/livestream-1.ts
+ # ...
+ # optional, default to empty string.
+ hls_entry_prefix http://your-server;
+ # the default audio codec of hls.
+ # when codec changed, write the PAT/PMT table, but maybe ok util next ts.
+ # so user can set the default codec for mp3.
+ # the available audio codec:
+ # aac, mp3, an
+ # default: aac
+ hls_acodec aac;
+ # the default video codec of hls.
+ # when codec changed, write the PAT/PMT table, but maybe ok util next ts.
+ # so user can set the default codec for pure audio(without video) to vn.
+ # the available video codec:
+ # h264, vn
+ # default: h264
+ hls_vcodec h264;
+ # whether cleanup the old expired ts files.
+ # default: on
+ hls_cleanup on;
+ # the timeout in seconds to dispose the hls,
+ # dispose is to remove all hls files, m3u8 and ts files.
+ # when publisher timeout dispose hls.
+ # @remark 0 to disable dispose for publisher.
+ # @remark apply for publisher timeout only, while "etc/init.d/srs stop" always dispose hls.
+ # default: 0
+ hls_dispose 0;
+ # the max size to notify hls,
+ # to read max bytes from ts of specified cdn network,
+ # @remark only used when on_hls_notify is config.
+ # default: 64
+ hls_nb_notify 64;
+ # whether wait keyframe to reap segment,
+ # if off, reap segment when duration exceed the fragment,
+ # if on, reap segment when duration exceed and got keyframe.
+ # default: on
+ hls_wait_keyframe on;
+
+ # whether using AES encryption.
+ # default: off
+ hls_keys on;
+ # the number of clear ts which one key can encrypt.
+ # default: 5
+ hls_fragments_per_key 5;
+ # the hls key file name.
+ # we supports some variables to generate the filename.
+ # [vhost], the vhost of stream.
+ # [app], the app of stream.
+ # [stream], the stream name of stream.
+ # [seq], the sequence number of key corresponding to the ts.
+ hls_key_file [app]/[stream]-[seq].key;
+ # the key output path.
+ # the key file is configed by hls_path/hls_key_file, the default is:
+ # ./objs/nginx/html/[app]/[stream]-[seq].key
+ hls_key_file_path ./objs/nginx/html;
+ # the key root URL, use this can support https.
+ # @remark It's optional.
+ hls_key_url https://localhost:8080;
+
+ # on_hls, never config in here, should config in http_hooks.
+ # for the hls http callback, @see http_hooks.on_hls of vhost hooks.callback.srs.com
+ # @read https://github.com/ossrs/srs/wiki/v2_CN_DeliveryHLS#http-callback
+ # @read https://github.com/ossrs/srs/wiki/v2_EN_DeliveryHLS#http-callback
+
+ # on_hls_notify, never config in here, should config in http_hooks.
+ # we support the variables to generate the notify url:
+ # [app], replace with the app.
+ # [stream], replace with the stream.
+ # [param], replace with the param.
+ # [ts_url], replace with the ts url.
+ # for the hls http callback, @see http_hooks.on_hls_notify of vhost hooks.callback.srs.com
+ # @read https://github.com/ossrs/srs/wiki/v2_CN_DeliveryHLS#on-hls-notify
+ # @read https://github.com/ossrs/srs/wiki/v2_EN_DeliveryHLS#on-hls-notify
+ }
+}
+# the vhost with hls disabled.
+vhost no-hls.srs.com {
+ hls {
+ # whether the hls is enabled.
+ # if off, do not write hls(ts and m3u8) when publish.
+ # default: off
+ enabled off;
+ }
+}
+
+# the vhost with adobe hds
+vhost hds.srs.com {
+ hds {
+ # whether hds enabled
+ # default: off
+ enabled on;
+ # the hds fragment in seconds.
+ # default: 10
+ hds_fragment 10;
+ # the hds window in seconds, erase the segment when exceed the window.
+ # default: 60
+ hds_window 60;
+ # the path to store the hds files.
+ # default: ./objs/nginx/html
+ hds_path ./objs/nginx/html;
+ }
+}
+
+# vhost for dvr
+vhost dvr.srs.com {
+ # DVR RTMP stream to file,
+ # start to record to file when encoder publish,
+ # reap flv/mp4 according by specified dvr_plan.
+ dvr {
+ # whether enabled dvr features
+ # default: off
+ enabled on;
+ # the filter for dvr to apply to.
+ # all, dvr all streams of all apps.
+ # /, apply to specified stream of app.
+ # for example, to dvr the following two streams:
+ # live/stream1 live/stream2
+ # default: all
+ dvr_apply all;
+ # the dvr plan. canbe:
+ # session reap flv/mp4 when session end(unpublish).
+ # segment reap flv/mp4 when flv duration exceed the specified dvr_duration.
+ # @remark The plan append is removed in SRS3+, for it's no use.
+ # default: session
+ dvr_plan session;
+ # the dvr output path, *.flv or *.mp4.
+ # we supports some variables to generate the filename.
+ # [vhost], the vhost of stream.
+ # [app], the app of stream.
+ # [stream], the stream name of stream.
+ # [2006], replace this const to current year.
+ # [01], replace this const to current month.
+ # [02], replace this const to current date.
+ # [15], replace this const to current hour.
+ # [04], replace this const to current minute.
+ # [05], replace this const to current second.
+ # [999], replace this const to current millisecond.
+ # [timestamp],replace this const to current UNIX timestamp in ms.
+ # @remark we use golang time format "2006-01-02 15:04:05.999" as "[2006]-[01]-[02]_[15].[04].[05]_[999]"
+ # for example, for url rtmp://ossrs.net/live/livestream and time 2015-01-03 10:57:30.776
+ # 1. No variables, the rule of SRS1.0(auto add [stream].[timestamp].flv as filename):
+ # dvr_path ./objs/nginx/html;
+ # =>
+ # dvr_path ./objs/nginx/html/live/livestream.1420254068776.flv;
+ # 2. Use stream and date as dir name, time as filename:
+ # dvr_path /data/[vhost]/[app]/[stream]/[2006]/[01]/[02]/[15].[04].[05].[999].flv;
+ # =>
+ # dvr_path /data/ossrs.net/live/livestream/2015/01/03/10.57.30.776.flv;
+ # 3. Use stream and year/month as dir name, date and time as filename:
+ # dvr_path /data/[vhost]/[app]/[stream]/[2006]/[01]/[02]-[15].[04].[05].[999].flv;
+ # =>
+ # dvr_path /data/ossrs.net/live/livestream/2015/01/03-10.57.30.776.flv;
+ # 4. Use vhost/app and year/month as dir name, stream/date/time as filename:
+ # dvr_path /data/[vhost]/[app]/[2006]/[01]/[stream]-[02]-[15].[04].[05].[999].flv;
+ # =>
+ # dvr_path /data/ossrs.net/live/2015/01/livestream-03-10.57.30.776.flv;
+ # 5. DVR to mp4:
+ # dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].mp4;
+ # =>
+ # dvr_path ./objs/nginx/html/live/livestream.1420254068776.mp4;
+ # @see https://github.com/ossrs/srs/wiki/v3_CN_DVR#custom-path
+ # @see https://github.com/ossrs/srs/wiki/v3_EN_DVR#custom-path
+ # segment,session apply it.
+ # default: ./objs/nginx/html/[app]/[stream].[timestamp].flv
+ dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].flv;
+ # the duration for dvr file, reap if exceed, in seconds.
+ # segment apply it.
+ # session,append ignore.
+ # default: 30
+ dvr_duration 30;
+ # whether wait keyframe to reap segment,
+ # if off, reap segment when duration exceed the dvr_duration,
+ # if on, reap segment when duration exceed and got keyframe.
+ # segment apply it.
+ # session,append ignore.
+ # default: on
+ dvr_wait_keyframe on;
+ # about the stream monotonically increasing:
+ # 1. video timestamp is monotonically increasing,
+ # 2. audio timestamp is monotonically increasing,
+ # 3. video and audio timestamp is interleaved monotonically increasing.
+ # it's specified by RTMP specification, @see 3. Byte Order, Alignment, and Time Format
+ # however, some encoder cannot provides this feature, please set this to off to ignore time jitter.
+ # the time jitter algorithm:
+ # 1. full, to ensure stream start at zero, and ensure stream monotonically increasing.
+ # 2. zero, only ensure stream start at zero, ignore timestamp jitter.
+ # 3. off, disable the time jitter algorithm, like atc.
+ # apply for all dvr plan.
+ # default: full
+ time_jitter full;
+
+ # on_dvr, never config in here, should config in http_hooks.
+ # for the dvr http callback, @see http_hooks.on_dvr of vhost hooks.callback.srs.com
+ # @read https://github.com/ossrs/srs/wiki/v2_CN_DVR#http-callback
+ # @read https://github.com/ossrs/srs/wiki/v2_EN_DVR#http-callback
+ }
+}
+
+# vhost for ingest
+vhost ingest.srs.com {
+ # ingest file/stream/device then push to SRS over RTMP.
+ # the name/id used to identify the ingest, must be unique in global.
+ # ingest id is used in reload or http api management.
+ # @remark vhost can contains multiple ingest
+ ingest livestream {
+ # whether enabled ingest features
+ # default: off
+ enabled on;
+ # input file/stream/device
+ # @remark only support one input.
+ input {
+ # the type of input.
+ # can be file/stream/device, that is,
+ # file: ingest file specified by url.
+ # stream: ingest stream specified by url.
+ # device: not support yet.
+ # default: file
+ type file;
+ # the url of file/stream.
+ url ./doc/source.200kbps.768x320.flv;
+ }
+ # the ffmpeg
+ ffmpeg ./objs/ffmpeg/bin/ffmpeg;
+ # the transcode engine, @see all.transcode.srs.com
+ # @remark, the output is specified following.
+ engine {
+ # @see enabled of transcode engine.
+ # if disabled or vcodec/acodec not specified, use copy.
+ # default: off.
+ enabled off;
+ # output stream. variables:
+ # [vhost] current vhost which start the ingest.
+ # [port] system RTMP stream port.
+ output rtmp://127.0.0.1:[port]/live?vhost=[vhost]/livestream;
+ }
+ }
+}
+
+# the vhost for ingest with transcode engine.
+vhost transcode.ingest.srs.com {
+ ingest livestream {
+ enabled on;
+ input {
+ type file;
+ url ./doc/source.200kbps.768x320.flv;
+ }
+ ffmpeg ./objs/ffmpeg/bin/ffmpeg;
+ engine {
+ enabled off;
+ perfile {
+ re;
+ rtsp_transport tcp;
+ }
+ iformat flv;
+ vfilter {
+ i ./doc/ffmpeg-logo.png;
+ filter_complex 'overlay=10:10';
+ }
+ vcodec libx264;
+ vbitrate 1500;
+ vfps 25;
+ vwidth 768;
+ vheight 320;
+ vthreads 12;
+ vprofile main;
+ vpreset medium;
+ vparams {
+ t 100;
+ coder 1;
+ b_strategy 2;
+ bf 3;
+ refs 10;
+ }
+ acodec libfdk_aac;
+ abitrate 70;
+ asample_rate 44100;
+ achannels 2;
+ aparams {
+ profile:a aac_low;
+ }
+ oformat flv;
+ output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream];
+ }
+ }
+}
+
+# the main comments for transcode
+vhost example.transcode.srs.com {
+ # the streaming transcode configs.
+ # @remark vhost can contains multiple transcode
+ transcode {
+ # whether the transcode enabled.
+ # if off, donot transcode.
+ # default: off.
+ enabled on;
+ # the ffmpeg
+ ffmpeg ./objs/ffmpeg/bin/ffmpeg;
+ # the transcode engine for matched stream.
+ # all matched stream will transcoded to the following stream.
+ # the transcode set name(ie. hd) is optional and not used.
+ # we will build the parameters to fork ffmpeg:
+ # ffmpeg
+ # -i
+ #
+ # -vcodec -b:v -r -s x -profile:v -preset
+ #
+ # -acodec -b:a -ar -ac
+ #
+ # -f
+ # -y