diff --git b/conf/bandwidth.conf a/conf/bandwidth.conf new file mode 100644 index 0000000..a0bf060 --- /dev/null +++ a/conf/bandwidth.conf @@ -0,0 +1,20 @@ +# bandwidth test tool config for srs. +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { +} + +vhost bandcheck.srs.com { + enabled on; + chunk_size 65000; + bandcheck { + enabled on; + key "35c9b402c12a7246868752e2878f7e0e"; + interval 30; + limit_kbps 4000; + } +} diff --git b/conf/console.conf a/conf/console.conf new file mode 100644 index 0000000..6814346 --- /dev/null +++ a/conf/console.conf @@ -0,0 +1,17 @@ +# no-daemon and write log to console config for srs. +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +http_api { + enabled on; + listen 1985; +} +http_server { + enabled on; + listen 8080; +} +vhost __defaultVhost__ { +} diff --git b/conf/demo.19350.conf a/conf/demo.19350.conf new file mode 100644 index 0000000..a6dd3ef --- /dev/null +++ a/conf/demo.19350.conf @@ -0,0 +1,22 @@ +# the config for srs demo +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleDemo +# @see full.conf for detail config. + +listen 19350; +max_connections 1000; +daemon on; +srs_log_tank file; +srs_log_file ./objs/srs.demo.19350.log; +pid ./objs/srs.demo.19350.pid; + +vhost __defaultVhost__ { + enabled on; + gop_cache on; + hls { + enabled on; + hls_path ./objs/nginx/html/forward; + hls_fragment 5; + hls_window 30; + } +} + diff --git b/conf/demo.conf a/conf/demo.conf new file mode 100644 index 0000000..b6fb87a --- /dev/null +++ a/conf/demo.conf @@ -0,0 +1,220 @@ +# the config for srs demo +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleDemo +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon on; +srs_log_tank file; +srs_log_file ./objs/srs.demo.log; +pid ./objs/srs.demo.pid; + +chunk_size 60000; +max_connections 2000; + +http_api { + enabled on; + listen 1985; +} + +http_server { + enabled on; + listen 8080; + dir ./objs/nginx/html; +} + +vhost __defaultVhost__ { + enabled on; + gop_cache on; +} + +vhost bandcheck.srs.com { + enabled on; + chunk_size 65000; + bandcheck { + enabled on; + key "35c9b402c12a7246868752e2878f7e0e"; + interval 30; + limit_kbps 4000; + } +} + +vhost demo.srs.com { + chunk_size 60000; + enabled on; + gop_cache on; + queue_length 30; + forward 127.0.0.1:19350; + bandcheck { + enabled off; + } + hls { + enabled on; + hls_path ./objs/nginx/html; + hls_fragment 5; + hls_window 30; + } + http_hooks { + enabled on; + on_connect http://127.0.0.1:8085/api/v1/clients; + on_close http://127.0.0.1:8085/api/v1/clients; + on_publish http://127.0.0.1:8085/api/v1/streams; + on_unpublish http://127.0.0.1:8085/api/v1/streams; + on_play http://127.0.0.1:8085/api/v1/sessions; + on_stop http://127.0.0.1:8085/api/v1/sessions; + } + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine ld { + enabled on; + vfilter { + i ./doc/srs-logo.png; + filter_complex 'overlay=10:10'; + } + vcodec libx264; + vbitrate 300; + vfps 20; + vwidth 768; + vheight 320; + vthreads 1; + vprofile baseline; + vpreset superfast; + vparams { + } + acodec libfdk_aac; + abitrate 45; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + engine sd { + enabled on; + vfilter { + vf 'split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2'; + } + vcodec libx264; + vbitrate 500; + vfps 20; + vwidth 768; + vheight 320; + vthreads 1; + vprofile main; + vpreset fast; + vparams { + } + acodec libfdk_aac; + abitrate 40; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } + ingest { + enabled on; + input { + type file; + url ./doc/source.200kbps.768x320.flv; + } + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine { + enabled off; + output rtmp://127.0.0.1:[port]/live?vhost=[vhost]/livestream; + } + } +} + +vhost players { + enabled on; + gop_cache on; + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine hls { + enabled on; + vfilter { + i ./doc/srs-logo.png; + filter_complex 'overlay=10:10'; + } + vcodec libx264; + vbitrate 300; + vfps 20; + vwidth 768; + vheight 320; + vthreads 1; + vprofile baseline; + vpreset superfast; + vparams { + g 100; + } + acodec libfdk_aac; + abitrate 30; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=players_pub/[stream]; + } + } + ingest { + enabled on; + input { + type file; + url ./doc/source.200kbps.768x320.flv; + } + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine { + enabled off; + output rtmp://127.0.0.1:[port]/live?vhost=[vhost]/demo; + } + } +} +vhost players_pub { + hls { + enabled on; + hls_path ./objs/nginx/html; + hls_fragment 5; + hls_window 30; + } +} + +vhost players_chat { + gop_cache off; + hls { + enabled off; + } + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine chat_hls { + enabled on; + vfilter { + } + vcodec libx264; + vbitrate 150; + vfps 15; + vwidth 576; + vheight 240; + vthreads 1; + vprofile baseline; + vpreset ultrafast; + vparams { + g 30; + } + acodec an; + output rtmp://127.0.0.1:[port]/[app]?vhost=chat_hls/[stream]; + } + } +} +vhost chat_hls { + hls { + enabled on; + hls_path ./objs/nginx/html; + hls_fragment 2; + hls_window 10; + } +} diff --git b/conf/dvr.path.conf a/conf/dvr.path.conf new file mode 100644 index 0000000..c5951f0 --- /dev/null +++ a/conf/dvr.path.conf @@ -0,0 +1,18 @@ +# the config for srs to dvr in custom path. +# @see https://github.com/ossrs/srs/wiki/v2_CN_DVR#custom-path +# @see https://github.com/ossrs/srs/wiki/v2_EN_DVR#custom-path +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + dvr { + enabled on; + dvr_path ./objs/nginx/html/[app]/[stream]/[2006]/[01]/[02]/[15].[04].[05].[999].flv; + dvr_plan segment; + dvr_duration 30; + dvr_wait_keyframe on; + } +} diff --git b/conf/dvr.segment.conf a/conf/dvr.segment.conf new file mode 100644 index 0000000..2265ad0 --- /dev/null +++ a/conf/dvr.segment.conf @@ -0,0 +1,17 @@ +# the config for srs to dvr in segment mode +# @see https://github.com/ossrs/srs/wiki/v2_CN_DVR +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + dvr { + enabled on; + dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].flv; + dvr_plan segment; + dvr_duration 30; + dvr_wait_keyframe on; + } +} diff --git b/conf/dvr.session.conf a/conf/dvr.session.conf new file mode 100644 index 0000000..8e8d893 --- /dev/null +++ a/conf/dvr.session.conf @@ -0,0 +1,15 @@ +# the config for srs to dvr in session mode +# @see https://github.com/ossrs/srs/wiki/v2_CN_DVR +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + dvr { + enabled on; + dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].flv; + dvr_plan session; + } +} diff --git b/conf/edge.conf a/conf/edge.conf new file mode 100644 index 0000000..2a8662f --- /dev/null +++ a/conf/edge.conf @@ -0,0 +1,13 @@ +# the config for srs origin-edge cluster +# @see https://github.com/ossrs/srs/wiki/v1_CN_Edge +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +pid objs/edge.pid; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + mode remote; + origin 127.0.0.1:19350; +} diff --git b/conf/edge.token.traverse.conf a/conf/edge.token.traverse.conf new file mode 100644 index 0000000..bad2412 --- /dev/null +++ a/conf/edge.token.traverse.conf @@ -0,0 +1,13 @@ +# the config for srs for token traverse authentication +# @see https://github.com/ossrs/srs/wiki/v1_CN_DRM +# @see full.conf for detail config. + +listen 1935 +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + mode remote; + origin 127.0.0.1:19350; + token_traverse on; +} diff --git b/conf/ffmpeg.transcode.conf a/conf/ffmpeg.transcode.conf new file mode 100644 index 0000000..d785a44 --- /dev/null +++ a/conf/ffmpeg.transcode.conf @@ -0,0 +1,29 @@ +# the config for srs use ffmpeg to transcode +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleFFMPEG +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine ff { + enabled on; + vfilter { + } + vcodec libx264; + vthreads 4; + vprofile main; + vpreset medium; + vparams { + } + acodec libfdk_aac; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } +} diff --git b/conf/forward.master.conf a/conf/forward.master.conf new file mode 100644 index 0000000..5566caa --- /dev/null +++ a/conf/forward.master.conf @@ -0,0 +1,14 @@ +# the config for srs to forward +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleForward +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +pid ./objs/srs.master.pid; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + forward 127.0.0.1:19350; +#the forward destination server type,default true. if the server is not srs server,connect app maybe fail,try config as false + forward_server_srs true; +} diff --git b/conf/forward.slave.conf a/conf/forward.slave.conf new file mode 100644 index 0000000..98286e3 --- /dev/null +++ a/conf/forward.slave.conf @@ -0,0 +1,11 @@ +# the config for srs to forward +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleForward +# @see full.conf for detail config. + +listen 19350; +max_connections 1000; +pid ./objs/srs.slave.pid; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { +} diff --git b/conf/full.conf a/conf/full.conf new file mode 100644 index 0000000..4edac7d --- /dev/null +++ a/conf/full.conf @@ -0,0 +1,1467 @@ +# 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 supports it and it can improve +# performance about 10%. +# default: 60000 +chunk_size 60000; +# the logs dir. +# if enabled ffmpeg, each stracoding 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: donot 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; + +# 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 enalbed. + # 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 devide. + 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 configed. + 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; +} +# embeded 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 runing 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 embeded 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; +} + +############################################################################################# +# 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 + 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; +} + +############################################################################################# +# 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 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|<ip> + # 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; + } +} + +# the MR(merged-read) setting for publisher. +# the MW(merged-write) settings for player. +vhost mrw.srs.com { + # whether enable min delay mode for vhost. + # for min latence mode: + # 1. disable the 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; + # about MR, read https://github.com/ossrs/srs/issues/241 + mr { + # whether enable the MR(merged-read) + # default: off + enabled on; + # 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 atleast: + # 183KB * 2500 = 446MB + # the value recomment is [300, 2000] + # default: 350 + latency 350; + } + # 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; +} + +# vhost for edge, edge and origin is the same vhost +vhost same.edge.srs.com { + # the mode of vhost, local or remote. + # local: vhost is origin vhost, which provides stream source. + # remote: vhost is edge vhost, which pull/push to origin. + # default: local + mode remote; + # for edge(remote mode), user must specifies the origin server + # format as: <server_name|ip>[: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, 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; +} + +# vhost for edge, edge transform vhost to fetch from another vhost. +vhost transform.edge.srs.com { + mode remote; + origin 127.0.0.1:1935; + # 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; +} + +# vhost for dvr +vhost dvr.srs.com { + # dvr RTMP stream to file, + # start to record to file when encoder publish, + # reap flv according by specified dvr_plan. + dvr { + # whether enabled dvr features + # default: off + enabled on; + # the dvr plan. canbe: + # session reap flv when session end(unpublish). + # segment reap flv when flv duration exceed the specified dvr_duration. + # append always append to flv file, never reap it. + # default: session + dvr_plan session; + # the dvr output 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. + # [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], repleace this const to current minute. + # [05], repleace this const to current second. + # [999], repleace 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; + # @see https://github.com/ossrs/srs/wiki/v2_CN_DVR#custom-path + # @see https://github.com/ossrs/srs/wiki/v2_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 exeed, 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 sttream 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. + 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 specifies by url. + # stream: ingest stream specifeis 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; + } + } +} + +# 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 mout 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; + # whether http stream trigger rtmp stream source when no stream available, + # for example, when encoder has not publish stream yet, + # user can play the http flv stream and wait for stream. + # default: on + hstrs on; + } +} + +# the vhost with hls specified. +vhost with-hls.srs.com { + hls { + # whether the hls is enabled. + # if off, donot 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, hsl_aof_ratio is 2.0, + # the segemnt 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. canbe: + # 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 configed by hls_path/hls_m3u8_file, the default is: + # ./objs/nginx/html/[app]/[stream].m3u8 + # the ts file is configed 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], repleace this const to current minute. + # [05], repleace this const to current second. + # [999], repleace this const to current millisecond. + # [timestamp],replace this const to current UNIX timestamp in ms. + # [seq], the sequence number of ts. + # @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 enahanced 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. + # if specified, 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; + + # 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. + # [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, donot 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; + } +} + +# the http hook callback vhost, srs will invoke the hooks for specified events. +vhost hooks.callback.srs.com { + http_hooks { + # whether the http hooks enalbe. + # 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(Stauts 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(Stauts 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" + # } + # if valid, the hook must return HTTP code 200(Stauts 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" + # } + # if valid, the hook must return HTTP code 200(Stauts 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", + # "pageUrl": "http://www.test.com/live.html" + # } + # if valid, the hook must return HTTP code 200(Stauts 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" + # } + # if valid, the hook must return HTTP code 200(Stauts 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", + # "cwd": "/usr/local/srs", + # "file": "./objs/nginx/html/live/livestream.1420254068776.flv" + # } + # if valid, the hook must return HTTP code 200(Stauts 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", + # "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(Stauts 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. + # [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]; + } +} + +# the vhost for srs debug info, whether send args in connect(tcUrl). +vhost debug.srs.com { + # 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; +} + +# the vhost for min delay, donot cache any stream. +vhost min.delay.com { + # @see vhost mrw.srs.com for detail. + min_latency on; + mr { + enabled off; + } + mw_latency 100; + # 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; + # whether enable the TCP_NODELAY + # if on, set the nodelay of fd by setsockopt + # default: off + tcp_nodelay on; +} + +# whether disable the sps parse, for the resolution of video. +vhost no.parse.sps.com { + publish { + # 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 to control the stream delivery feature +vhost stream.control.com { + # @see vhost mrw.srs.com for detail. + min_latency on; + mr { + enabled off; + } + mw_latency 100; + # @see vhost min.delay.com + queue_length 10; + tcp_nodelay on; + # 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; + # the 1st packet timeout in ms for encoder. + # default: 20000 + publish_1stpkt_timeout 20000; + # the normal packet timeout in ms for encoder. + # default: 5000 + publish_normal_timeout 7000; +} + +# the vhost for antisuck. +vhost refer.anti_suck.com { + # 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. + refer github.com github.io; + # refer for publish clients specified. + # the common refer is not overrided by this. + # if not specified this field, allow all. + # default: not specified. + refer_publish github.com github.io; + # refer for play clients specified. + # the common refer is not overrided by this. + # if not specified this field, allow all. + # default: not specified. + refer_play github.com github.io; +} + +# the vhost which forward publish streams. +vhost same.vhost.forward.srs.com { + # 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} + forward 127.0.0.1:1936 127.0.0.1:1937; +} + +# the main comments for transcode +vhost example.transcode.srs.com { + # the streaming transcode configs. + 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. + engine example { + # whether the engine is enabled + # default: off. + enabled on; + # input format, can be: + # off, do not specifies the format, ffmpeg will guess it. + # flv, for flv or RTMP stream. + # other format, for example, mp4/aac whatever. + # default: flv + iformat flv; + # ffmpeg filters, follows the main input. + vfilter { + # the logo input file. + i ./doc/ffmpeg-logo.png; + # the ffmpeg complex filter. + # for filters, @see: http://ffmpeg.org/ffmpeg-filters.html + filter_complex 'overlay=10:10'; + } + # video encoder name. can be: + # libx264: use h.264(libx264) video encoder. + # copy: donot encoder the video stream, copy it. + # vn: disable video output. + vcodec libx264; + # video bitrate, in kbps + # @remark 0 to use source video bitrate. + # default: 0 + vbitrate 1500; + # video framerate. + # @remark 0 to use source video fps. + # default: 0 + vfps 25; + # video width, must be even numbers. + # @remark 0 to use source video width. + # default: 0 + vwidth 768; + # video height, must be even numbers. + # @remark 0 to use source video height. + # default: 0 + vheight 320; + # the max threads for ffmpeg to used. + # default: 1 + vthreads 12; + # x264 profile, @see x264 -help, can be: + # high,main,baseline + vprofile main; + # x264 preset, @see x264 -help, can be: + # ultrafast,superfast,veryfast,faster,fast + # medium,slow,slower,veryslow,placebo + vpreset medium; + # other x264 or ffmpeg video params + vparams { + # ffmpeg options, @see: http://ffmpeg.org/ffmpeg.html + t 100; + # 264 params, @see: http://ffmpeg.org/ffmpeg-codecs.html#libx264 + coder 1; + b_strategy 2; + bf 3; + refs 10; + } + # audio encoder name. can be: + # libfdk_aac: use aac(libfdk_aac) audio encoder. + # copy: donot encoder the audio stream, copy it. + # an: disable audio output. + acodec libfdk_aac; + # audio bitrate, in kbps. [16, 72] for libfdk_aac. + # @remark 0 to use source audio bitrate. + # default: 0 + abitrate 70; + # audio sample rate. for flv/rtmp, it must be: + # 44100,22050,11025,5512 + # @remark 0 to use source audio sample rate. + # default: 0 + asample_rate 44100; + # audio channel, 1 for mono, 2 for stereo. + # @remark 0 to use source audio channels. + # default: 0 + achannels 2; + # other ffmpeg audio params + aparams { + # audio params, @see: http://ffmpeg.org/ffmpeg-codecs.html#Audio-Encoders + # @remark SRS supported aac profile for HLS is: aac_low, aac_he, aac_he_v2 + profile:a aac_low; + bsf:a aac_adtstoasc; + } + # output format, can be: + # off, do not specifies the format, ffmpeg will guess it. + # flv, for flv or RTMP stream. + # other format, for example, mp4/aac whatever. + # default: flv + oformat flv; + # output stream. variables: + # [vhost] the input stream vhost. + # [port] the intput stream port. + # [app] the input stream app. + # [stream] the input stream name. + # [engine] the tanscode engine name. + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } +} +# the mirror filter of ffmpeg, @see: http://ffmpeg.org/ffmpeg-filters.html#Filtering-Introduction +vhost mirror.transcode.srs.com { + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine mirror { + enabled on; + vfilter { + vf 'split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2'; + } + vcodec libx264; + vbitrate 300; + vfps 20; + vwidth 768; + vheight 320; + vthreads 2; + vprofile baseline; + vpreset superfast; + vparams { + } + acodec libfdk_aac; + abitrate 45; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } +} +# the drawtext filter of ffmpeg, @see: http://ffmpeg.org/ffmpeg-filters.html#drawtext-1 +# remark: we remove the libfreetype which always cause build failed, you must add it manual if needed. +####################################################################################################### +# the crop filter of ffmpeg, @see: http://ffmpeg.org/ffmpeg-filters.html#crop +vhost crop.transcode.srs.com { + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine crop { + enabled on; + vfilter { + vf 'crop=in_w-20:in_h-160:10:80'; + } + vcodec libx264; + vbitrate 300; + vfps 20; + vwidth 768; + vheight 320; + vthreads 2; + vprofile baseline; + vpreset superfast; + vparams { + } + acodec libfdk_aac; + abitrate 45; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } +} +# the logo filter of ffmpeg, @see: http://ffmpeg.org/ffmpeg-filters.html#overlay +vhost logo.transcode.srs.com { + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine logo { + enabled on; + vfilter { + i ./doc/ffmpeg-logo.png; + filter_complex 'overlay=10:10'; + } + vcodec libx264; + vbitrate 300; + vfps 20; + vwidth 768; + vheight 320; + vthreads 2; + vprofile baseline; + vpreset superfast; + vparams { + } + acodec libfdk_aac; + abitrate 45; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } +} +# audio transcode only. +# for example, FMLE publish audio codec in mp3, and donot support HLS output, +# we can transcode the audio to aac and copy video to the new stream with HLS. +vhost audio.transcode.srs.com { + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine acodec { + enabled on; + vcodec copy; + acodec libfdk_aac; + abitrate 45; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } +} +# disable video, transcode/copy audio. +# for example, publish pure audio stream. +vhost vn.transcode.srs.com { + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine vn { + enabled on; + vcodec vn; + acodec libfdk_aac; + abitrate 45; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } +} +# ffmpeg-copy(forward implements by ffmpeg). +# copy the video and audio to a new stream. +vhost copy.transcode.srs.com { + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine copy { + enabled on; + vcodec copy; + acodec copy; + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } +} +# transcode all app and stream of vhost +# the comments, read example.transcode.srs.com +vhost all.transcode.srs.com { + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine ffsuper { + enabled on; + 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]_[engine]; + } + engine ffhd { + enabled on; + vcodec libx264; + vbitrate 1200; + vfps 25; + vwidth 1382; + vheight 576; + vthreads 6; + vprofile main; + vpreset medium; + vparams { + } + acodec libfdk_aac; + abitrate 70; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + engine ffsd { + enabled on; + vcodec libx264; + vbitrate 800; + vfps 25; + vwidth 1152; + vheight 480; + vthreads 4; + vprofile main; + vpreset fast; + vparams { + } + acodec libfdk_aac; + abitrate 60; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + engine fffast { + enabled on; + vcodec libx264; + vbitrate 300; + vfps 20; + vwidth 768; + vheight 320; + vthreads 2; + vprofile baseline; + vpreset superfast; + vparams { + } + acodec libfdk_aac; + abitrate 45; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + engine vcopy { + enabled on; + vcodec copy; + acodec libfdk_aac; + abitrate 45; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + engine acopy { + enabled on; + vcodec libx264; + vbitrate 300; + vfps 20; + vwidth 768; + vheight 320; + vthreads 2; + vprofile baseline; + vpreset superfast; + vparams { + } + acodec copy; + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + engine copy { + enabled on; + vcodec copy; + acodec copy; + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } +} +# transcode all stream using the empty ffmpeg demo, donothing. +vhost ffempty.transcode.srs.com { + transcode { + enabled on; + ffmpeg ./objs/research/ffempty; + engine empty { + enabled on; + vcodec libx264; + vbitrate 300; + vfps 20; + vwidth 768; + vheight 320; + vthreads 2; + vprofile baseline; + vpreset superfast; + vparams { + } + acodec libfdk_aac; + abitrate 45; + asample_rate 44100; + achannels 2; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } +} +# transcode all app and stream of app +vhost app.transcode.srs.com { + # the streaming transcode configs. + # if app specified, transcode all streams of app. + transcode live { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine { + enabled off; + } + } +} +# transcode specified stream. +vhost stream.transcode.srs.com { + # the streaming transcode configs. + # if stream specified, transcode the matched stream. + transcode live/livestream { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine { + enabled off; + } + } +} + +# 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 donot 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; + } +} + +# set the chunk size of vhost. +vhost chunksize.srs.com { + # 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; +} + +# vhost for time jitter +vhost jitter.srs.com { + # 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 sttream start at zero, ignore timestamp jitter. + # 3. off, disable the time jitter algorithm, like atc. + # default: full + time_jitter full; + # 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. + # default: off + mix_correct off; +} + +# vhost for atc. +vhost atc.srs.com { + # 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 + # + # default: off + atc on; + # 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: on + atc_auto on; +} + +# the vhost disabled. +vhost removed.srs.com { + # whether the vhost is enabled. + # if off, all request access denied. + # default: on + enabled off; +} + +# config for the pithy print, +# which always print constant message specified by interval, +# whatever the clients in concurrency. +# default: 10000 +pithy_print_ms 10000; diff --git b/conf/hds.conf a/conf/hds.conf new file mode 100644 index 0000000..c2a7d43 --- /dev/null +++ a/conf/hds.conf @@ -0,0 +1,17 @@ +# the config for srs to delivery hds +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleHDS +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; + +vhost __defaultVhost__ { + hds { + enabled on; + hds_fragment 10; + hds_window 60; + hds_path ./objs/nginx/html; + } +} diff --git b/conf/hls.conf a/conf/hls.conf new file mode 100644 index 0000000..d0fa423 --- /dev/null +++ a/conf/hls.conf @@ -0,0 +1,18 @@ +# the config for srs to delivery hls +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleHLS +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + hls { + enabled on; + hls_fragment 10; + hls_window 60; + hls_path ./objs/nginx/html; + hls_m3u8_file [app]/[stream].m3u8; + hls_ts_file [app]/[stream]-[seq].ts; + } +} diff --git b/conf/hls_total.conf a/conf/hls_total.conf new file mode 100644 index 0000000..4dad424 --- /dev/null +++ a/conf/hls_total.conf @@ -0,0 +1,20 @@ +# the config for srs to delivery hls +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleHLS +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +vhost __defaultVhost__ { + hls { + enabled on; + hls_fragment 10; + hls_window 60; + hls_path ./objs/nginx/html; + hls_m3u8_file [app]/[stream]/index.m3u8; + hls_ts_file [app]/[stream]/[seq].ts; +#if not configured,don't save total m3u8 file,and keep the ts cleaned + hls_total_m3u8_file [app]/[stream]/total.m3u8; +#if not configured,don't save total duration file + hls_total_file [app]/[stream]/total; + } +} diff --git b/conf/http.aac.live.conf a/conf/http.aac.live.conf new file mode 100644 index 0000000..22aa1bd --- /dev/null +++ a/conf/http.aac.live.conf @@ -0,0 +1,22 @@ +# the config for srs to remux rtmp to aac live stream. +# @see https://github.com/ossrs/srs/wiki/v2_CN_DeliveryHttpStream +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +http_server { + enabled on; + listen 8080; + dir ./objs/nginx/html; +} +vhost __defaultVhost__ { + http_remux { + enabled on; + fast_cache 30; + mount [vhost]/[app]/[stream].aac; + hstrs on; + + } +} diff --git b/conf/http.flv.live.conf a/conf/http.flv.live.conf new file mode 100644 index 0000000..944889f --- /dev/null +++ a/conf/http.flv.live.conf @@ -0,0 +1,20 @@ +# the config for srs to remux rtmp to flv live stream. +# @see https://github.com/ossrs/srs/wiki/v2_CN_DeliveryHttpStream +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +http_server { + enabled on; + listen 8080; + dir ./objs/nginx/html; +} +vhost __defaultVhost__ { + http_remux { + enabled on; + mount [vhost]/[app]/[stream].flv; + hstrs on; + } +} diff --git b/conf/http.flv.live.edge1.conf a/conf/http.flv.live.edge1.conf new file mode 100644 index 0000000..e827c22 --- /dev/null +++ a/conf/http.flv.live.edge1.conf @@ -0,0 +1,23 @@ +# the config for srs to remux rtmp to flv live stream. +# @see https://github.com/ossrs/srs/wiki/v2_CN_DeliveryHttpStream +# @see full.conf for detail config. + +listen 19351; +max_connections 1000; +pid objs/srs.flv.19351.pid; +daemon off; +srs_log_tank console; +http_server { + enabled on; + listen 8081; + dir ./objs/nginx/html; +} +vhost __defaultVhost__ { + mode remote; + origin 127.0.0.1; + http_remux { + enabled on; + mount [vhost]/[app]/[stream].flv; + hstrs on; + } +} diff --git b/conf/http.flv.live.edge2.conf a/conf/http.flv.live.edge2.conf new file mode 100644 index 0000000..669c380 --- /dev/null +++ a/conf/http.flv.live.edge2.conf @@ -0,0 +1,23 @@ +# the config for srs to remux rtmp to flv live stream. +# @see https://github.com/ossrs/srs/wiki/v2_CN_DeliveryHttpStream +# @see full.conf for detail config. + +listen 19352; +max_connections 1000; +pid objs/srs.flv.19352.pid; +daemon off; +srs_log_tank console; +http_server { + enabled on; + listen 8082; + dir ./objs/nginx/html; +} +vhost __defaultVhost__ { + mode remote; + origin 127.0.0.1; + http_remux { + enabled on; + mount [vhost]/[app]/[stream].flv; + hstrs on; + } +} diff --git b/conf/http.heartbeat.conf a/conf/http.heartbeat.conf new file mode 100644 index 0000000..d15ff6a --- /dev/null +++ a/conf/http.heartbeat.conf @@ -0,0 +1,25 @@ +# the config for srs http heartbeat, report its info to api-server +# @see full.conf for detail config. + +listen 1935 +max_connections 1000; +daemon off; +srs_log_tank console; +heartbeat { + enabled on; + interval 9.3; + # for python api-server + url http://127.0.0.1:8085/api/v1/servers; + device_id "my-srs-device"; + # for ossrs.net monitor, device_id is the key genereated by bsm. + #url http://www.ossrs.net:1977/api/v1/robots/servers; + #device_id "35c9b402c12a7246868752e2878f7e0e"; + # with detail summaries + summaries on; +} +stats { + network 0; + disk sda sdb xvda xvdb; +} +vhost __defaultVhost__ { +} diff --git b/conf/http.hls.conf a/conf/http.hls.conf new file mode 100644 index 0000000..17416a2 --- /dev/null +++ a/conf/http.hls.conf @@ -0,0 +1,23 @@ +# the config for srs to delivery hls +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleHLS +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +http_server { + enabled on; + listen 8080; + dir ./objs/nginx/html; +} +vhost __defaultVhost__ { + hls { + enabled on; + hls_fragment 10; + hls_window 60; + hls_path ./objs/nginx/html; + hls_m3u8_file [app]/[stream].m3u8; + hls_ts_file [app]/[stream]-[seq].ts; + } +} diff --git b/conf/http.hooks.callback.conf a/conf/http.hooks.callback.conf new file mode 100644 index 0000000..d5374d9 --- /dev/null +++ a/conf/http.hooks.callback.conf @@ -0,0 +1,18 @@ +# http-hooks or http-callbacks config for srs. +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + http_hooks { + enabled on; + on_connect http://127.0.0.1:8085/api/v1/clients http://localhost:8085/api/v1/clients; + on_close http://127.0.0.1:8085/api/v1/clients http://localhost:8085/api/v1/clients; + on_publish http://127.0.0.1:8085/api/v1/streams http://localhost:8085/api/v1/streams; + on_unpublish http://127.0.0.1:8085/api/v1/streams http://localhost:8085/api/v1/streams; + on_play http://127.0.0.1:8085/api/v1/sessions http://localhost:8085/api/v1/sessions; + on_stop http://127.0.0.1:8085/api/v1/sessions http://localhost:8085/api/v1/sessions; + } +} diff --git b/conf/http.mp3.live.conf a/conf/http.mp3.live.conf new file mode 100644 index 0000000..690a453 --- /dev/null +++ a/conf/http.mp3.live.conf @@ -0,0 +1,22 @@ +# the config for srs to remux rtmp to mp3 live stream. +# @see https://github.com/ossrs/srs/wiki/v2_CN_DeliveryHttpStream +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +http_server { + enabled on; + listen 8080; + dir ./objs/nginx/html; +} +vhost __defaultVhost__ { + http_remux { + enabled on; + fast_cache 30; + mount [vhost]/[app]/[stream].mp3; + hstrs on; + + } +} diff --git b/conf/http.server.conf a/conf/http.server.conf new file mode 100644 index 0000000..0c84089 --- /dev/null +++ a/conf/http.server.conf @@ -0,0 +1,19 @@ +# the config for srs to serve as http server +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +http_server { + enabled on; + listen 8080; + dir ./objs/nginx/html; +} +vhost ossrs.net { + http { + enabled on; + mount [vhost]/; + dir ./objs/nginx/html; + } +} diff --git b/conf/http.ts.live.conf a/conf/http.ts.live.conf new file mode 100644 index 0000000..d445672 --- /dev/null +++ a/conf/http.ts.live.conf @@ -0,0 +1,20 @@ +# the config for srs to remux rtmp to ts live stream. +# @see https://github.com/ossrs/srs/wiki/v2_CN_DeliveryHttpStream +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +http_server { + enabled on; + listen 8080; + dir ./objs/nginx/html; +} +vhost __defaultVhost__ { + http_remux { + enabled on; + mount [vhost]/[app]/[stream].ts; + hstrs on; + } +} diff --git b/conf/ingest.conf a/conf/ingest.conf new file mode 100644 index 0000000..d77a2f9 --- /dev/null +++ a/conf/ingest.conf @@ -0,0 +1,22 @@ +# use ffmpeg to ingest file/stream/device to SRS +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleIngest +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + ingest livestream { + enabled on; + input { + type file; + url ./doc/source.200kbps.768x320.flv; + } + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine { + enabled off; + output rtmp://127.0.0.1:[port]/live?vhost=[vhost]/livestream; + } + } +} diff --git b/conf/mac.dev.conf a/conf/mac.dev.conf new file mode 100644 index 0000000..e624e16 --- /dev/null +++ a/conf/mac.dev.conf @@ -0,0 +1,36 @@ +# no-daemon and write log to console config for srs. +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +http_api { + enabled on; + listen 1985; +} +http_server { + enabled on; + listen 8080; +} +vhost __defaultVhost__ { + hls { + enabled on; + hls_fragment 10; + hls_window 60; + hls_path ./objs/nginx/html; + } + ingest livestream { + enabled on; + input { + type file; + url ./doc/source.200kbps.768x320.flv; + } + #ffmpeg ./objs/ffmpeg/bin/ffmpeg; + ffmpeg ./objs/research/librtmp/srs_ingest_flv; + engine { + enabled off; + output rtmp://127.0.0.1:[port]/live?vhost=[vhost]/livestream; + } + } +} diff --git b/conf/origin.conf a/conf/origin.conf new file mode 100644 index 0000000..f27abb0 --- /dev/null +++ a/conf/origin.conf @@ -0,0 +1,11 @@ +# the config for srs origin-edge cluster +# @see https://github.com/ossrs/srs/wiki/v1_CN_Edge +# @see full.conf for detail config. + +listen 19350; +max_connections 1000; +daemon off; +srs_log_tank console; +pid ./objs/origin.pid; +vhost __defaultVhost__ { +} diff --git b/conf/push.flv.conf a/conf/push.flv.conf new file mode 100644 index 0000000..9e871f9 --- /dev/null +++ a/conf/push.flv.conf @@ -0,0 +1,29 @@ +# push HTTP FLV to SRS. +# @see https://github.com/ossrs/srs/wiki/v2_CN_Streamer#push-http-flv-to-srs +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +http_server { + enabled on; + listen 8080; + dir ./objs/nginx/html; +} +stream_caster { + enabled on; + caster flv; + output rtmp://127.0.0.1/[app]/[stream]; + listen 8936; +} +vhost __defaultVhost__ { + hls { + enabled on; + hls_fragment 10; + hls_window 60; + hls_path ./objs/nginx/html; + hls_m3u8_file [app]/[stream].m3u8; + hls_ts_file [app]/[stream]-[seq].ts; + } +} diff --git b/conf/push.mpegts.over.udp.conf a/conf/push.mpegts.over.udp.conf new file mode 100644 index 0000000..82f2f04 --- /dev/null +++ a/conf/push.mpegts.over.udp.conf @@ -0,0 +1,17 @@ +# push MPEG-TS over UDP to SRS. +# @see https://github.com/ossrs/srs/wiki/v2_CN_Streamer#push-mpeg-ts-over-udp +# @see https://github.com/ossrs/srs/issues/250#issuecomment-72321769 +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +stream_caster { + enabled on; + caster mpegts_over_udp; + output rtmp://127.0.0.1/live/livestream; + listen 1935; +} +vhost __defaultVhost__ { +} diff --git b/conf/push.rtsp.conf a/conf/push.rtsp.conf new file mode 100644 index 0000000..016a067 --- /dev/null +++ a/conf/push.rtsp.conf @@ -0,0 +1,19 @@ +# push MPEG-TS over UDP to SRS. +# @see https://github.com/ossrs/srs/wiki/v2_CN_Streamer#push-mpeg-ts-over-udp +# @see https://github.com/ossrs/srs/issues/250#issuecomment-72321769 +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +stream_caster { + enabled on; + caster rtsp; + output rtmp://127.0.0.1/[app]/[stream]; + listen 554; + rtp_port_min 57200; + rtp_port_max 57300; +} +vhost __defaultVhost__ { +} diff --git b/conf/realtime.conf a/conf/realtime.conf new file mode 100644 index 0000000..249c750 --- /dev/null +++ a/conf/realtime.conf @@ -0,0 +1,18 @@ +# the config for srs to delivery realtime RTMP stream +# @see https://github.com/ossrs/srs/wiki/v2_CN_SampleRealtime +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + gop_cache off; + queue_length 10; + min_latency on; + mr { + enabled off; + } + mw_latency 100; + tcp_nodelay on; +} diff --git b/conf/rtmp.conf a/conf/rtmp.conf new file mode 100644 index 0000000..e05f154 --- /dev/null +++ a/conf/rtmp.conf @@ -0,0 +1,10 @@ +# the config for srs to delivery RTMP +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleRTMP +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { +} diff --git b/conf/security.deny.publish.conf a/conf/security.deny.publish.conf new file mode 100644 index 0000000..fc2a2e8 --- /dev/null +++ a/conf/security.deny.publish.conf @@ -0,0 +1,15 @@ +# security config for srs, allow play and deny publish. +# @see https://github.com/ossrs/srs/issues/211#issuecomment-68507035 +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + security { + enabled on; + deny publish all; + allow play all; + } +} diff --git b/conf/srs.conf a/conf/srs.conf new file mode 100644 index 0000000..da06284 --- /dev/null +++ a/conf/srs.conf @@ -0,0 +1,22 @@ +# main config for srs. +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +srs_log_tank file; +srs_log_file ./objs/srs.log; +http_api { + enabled on; + listen 1985; +} +http_server { + enabled on; + listen 8080; + dir ./objs/nginx/html; +} +stats { + network 0; + disk sda sdb xvda xvdb; +} +vhost __defaultVhost__ { +} diff --git b/conf/transcode2hls.audio.only.conf a/conf/transcode2hls.audio.only.conf new file mode 100644 index 0000000..f4361bf --- /dev/null +++ a/conf/transcode2hls.audio.only.conf @@ -0,0 +1,30 @@ +# the config for srs to delivery hls +# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleHLS +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { + hls { + enabled on; + hls_fragment 10; + hls_window 60; + hls_path ./objs/nginx/html; + hls_m3u8_file [app]/[stream].m3u8; + hls_ts_file [app]/[stream]-[seq].ts; + } + transcode { + enabled on; + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine ff { + enabled on; + vcodec copy; + acodec libfdk_aac; + aparams { + } + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; + } + } +} diff --git b/conf/transform.edge.conf a/conf/transform.edge.conf new file mode 100644 index 0000000..5b3a04f --- /dev/null +++ a/conf/transform.edge.conf @@ -0,0 +1,29 @@ +# the config for srs origin-edge cluster +# @see https://github.com/ossrs/srs/wiki/v2_CN_Edge#transform-vhost +# @see full.conf for detail config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; +vhost __defaultVhost__ { +} +vhost source.srs.com { + ingest livestream { + enabled on; + input { + type file; + url ./doc/source.200kbps.768x320.flv; + } + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine { + enabled off; + output rtmp://127.0.0.1:[port]/live?vhost=[vhost]/livestream; + } + } +} +vhost transform.srs.edge.com { + mode remote; + origin 127.0.0.1:1935; + vhost source.srs.com; +} diff --git b/etc/init.d/srs a/etc/init.d/srs new file mode 100755 index 0000000..f04a432 --- /dev/null +++ a/etc/init.d/srs @@ -0,0 +1,197 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: ossrs(srs) +# RequiRED-Start: $all +# RequiRED-Stop: $all +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: ossrs(srs) +# Description: https://github.com/ossrs/srs +### END INIT INFO + +# the config of ROOT, user must modify it when start srs from other directory, +# it's ok to use the script by command ./etc/init.d/ossrs +ROOT="/usr/local/srs" +APP="./objs/srs" +CONFIG="./conf/srs.conf" +DEFAULT_PID_FILE='./objs/srs.pid' +DEFAULT_LOG_FILE='./objs/srs.log' + +######################################################################## +# utility functions +######################################################################## +RED="\\033[31m" +GREEN="\\033[32m" +YELLOW="\\033[33m" +BLACK="\\033[0m" +POS="\\033[60G" + +ok_msg() { + echo -e "${1}${POS}${BLACK}[${GREEN} OK ${BLACK}]" +} + +failed_msg() { + echo -e "${1}${POS}${BLACK}[${RED}FAILED${BLACK}]" +} + +# load process info of srs +# @set variable $srs_pid to the process id in srs.pid file. +# @return 0, if process exists; otherwise: +# 1, for pid file not exists. +# 2, for get proecess info by pid failed. +# @set variable $error_msg if error. +# @set variable $pid_file to pid file. +load_process_info() { + # get pid file + pid_file=`cd ${ROOT} && cat ${CONFIG} |grep ^pid|awk '{print $2}'|awk -F ';' '{print $1}'` + if [[ -z $pid_file ]]; then pid_file=${DEFAULT_PID_FILE}; fi + # get abs path + pid_dir=`dirname $pid_file` + pid_file=`(cd ${ROOT}; cd $pid_dir; pwd)`/`basename $pid_file` + + srs_pid=`cat $pid_file 2>/dev/null` + ret=$?; if [[ 0 -ne $ret ]]; then error_msg="file $pid_file does not exists"; return 1; fi + + ps -p ${srs_pid} >/dev/null 2>/dev/null + ret=$?; if [[ 0 -ne $ret ]]; then error_msg="process $srs_pid does not exists"; return 2; fi + + return 0; +} + +start() { + # if exists, exit. + load_process_info + if [[ 0 -eq $? ]]; then failed_msg "SRS started(pid ${srs_pid}), should not start it again."; return 0; fi + + # not exists, start server + ok_msg "Starting SRS..." + + # get log file + log_file=`cd ${ROOT} && cat ${CONFIG} |grep '^log_file'| awk '{print $2}'| awk -F ';' '{print $1}'` + if [[ -z $log_file ]]; then log_file=${DEFAULT_LOG_FILE}; fi + # get abs path + log_dir=`dirname $log_file` + log_file=`(cd ${ROOT} && cd $log_dir && pwd)`/`basename $log_file` + + # TODO: FIXME: set limit by, for instance, "ulimit -HSn 10000" + if [[ -z $log_file ]]; then + (ulimit -c unlimited && cd ${ROOT}; ${APP} -c ${CONFIG} >/dev/null 2>&1) + else + (ulimit -c unlimited && cd ${ROOT}; ${APP} -c ${CONFIG} >> $log_file 2>&1) + fi + + # check again after start server + for ((i = 0; i < 5; i++)); do + # sleep a little while, for srs may start then crash. + sleep 0.1 + load_process_info + ret=$?; if [[ 0 -ne $ret ]]; then + failed_msg "SRS start failed"; + failed_msg "see $log_file"; + return $ret; + fi + done + + # check whether started. + load_process_info + ret=$?; if [[ 0 -eq $? ]]; then ok_msg "SRS started(pid ${srs_pid})"; return 0; fi + + failed_msg "SRS not started" + return $ret +} + +stop() { + # not start, exit + load_process_info + if [[ 0 -ne $? ]]; then failed_msg "SRS not start."; return 0; fi + + ok_msg "Stopping SRS(pid ${srs_pid})..." + + # process exists, try to kill to stop normally + for((i=0;i<100;i++)); do + load_process_info + if [[ 0 -eq $? ]]; then + kill -s SIGTERM ${srs_pid} 2>/dev/null + ret=$?; if [[ 0 -ne $ret ]]; then failed_msg "send signal SIGTERM failed ret=$ret"; return $ret; fi + sleep 0.3 + else + ok_msg "SRS stopped by SIGTERM" + # delete the pid file when stop success. + rm -f ${pid_file} + break; + fi + done + + # process exists, use kill -9 to force to exit + load_process_info + if [[ 0 -eq $? ]]; then + kill -s SIGKILL ${srs_pid} 2>/dev/null + ret=$?; if [[ 0 -ne $ret ]]; then failed_msg "send signal SIGKILL failed ret=$ret"; return $ret; fi + ok_msg "SRS stopped by SIGKILL" + else + # delete the pid file when stop success. + rm -f ${pid_file} + fi + + sleep 0.1 + return 0 +} + +# get the status of srs process +# @return 0 if srs is running; otherwise, 1 for stopped. +status() { + load_process_info + ret=$?; if [[ 0 -eq $ret ]]; then echo "SRS(pid ${srs_pid}) is running."; return 0; fi + + echo "SRS is stopped, $error_msg" + return 1 +} + +reload() { + # not start, exit + load_process_info + if [[ 0 -ne $? ]]; then failed_msg "SRS not start."; return 0; fi + + ok_msg "Reload SRS(pid ${srs_pid})..." + + # process exists, reload it + kill -s SIGHUP ${srs_pid} 2>/dev/null + ret=$?; if [[ 0 -ne $ret ]]; then failed_msg "Reload SRS failed ret=$ret"; return $ret; fi + + load_process_info + if [[ 0 -ne $? ]]; then failed_msg "SRS reload failed."; return $ret; fi + + ok_msg "SRS reloaded" + return 0 +} + +menu() { + case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + stop + start + ;; + status) + status + ;; + reload) + reload + ;; + *) + echo "Usage: $0 {start|stop|status|restart|reload}" + return 1 + ;; + esac +} + +menu $1 + +code=$? +exit ${code} diff --git b/objs/ffmpeg/bin/ffmpeg a/objs/ffmpeg/bin/ffmpeg new file mode 100755 index 0000000..ae01263 Binary files /dev/null and a/objs/ffmpeg/bin/ffmpeg differ diff --git b/objs/nginx/html/crossdomain.xml a/objs/nginx/html/crossdomain.xml new file mode 100644 index 0000000..ae91084 --- /dev/null +++ a/objs/nginx/html/crossdomain.xml @@ -0,0 +1,3 @@ +<cross-domain-policy> + <allow-access-from domain="*"/> +</cross-domain-policy> diff --git b/objs/srs a/objs/srs new file mode 100755 index 0000000..f2ac7ce Binary files /dev/null and a/objs/srs differ