mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
for #319, move mw_latency to play.
This commit is contained in:
parent
4eb1874955
commit
06ae74dd3f
6 changed files with 140 additions and 146 deletions
|
@ -373,118 +373,6 @@ vhost publish.srs.com {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# 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;
|
|
||||||
|
|
||||||
# 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;
|
|
||||||
|
|
||||||
# @see publish.srs.com
|
|
||||||
publish {
|
|
||||||
mr on;
|
|
||||||
mr_latenct 350;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# the vhost for min delay, donot cache any stream.
|
|
||||||
vhost min.delay.com {
|
|
||||||
# @see vhost mrw.srs.com for detail.
|
|
||||||
min_latency on;
|
|
||||||
# @see scope.vhost.srs.com
|
|
||||||
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;
|
|
||||||
# @see scope.vhost.srs.com
|
|
||||||
tcp_nodelay on;
|
|
||||||
|
|
||||||
# @see publish.srs.com
|
|
||||||
publish {
|
|
||||||
mr off;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# the vhost to control the stream delivery feature
|
|
||||||
vhost stream.control.com {
|
|
||||||
# @see vhost mrw.srs.com for detail.
|
|
||||||
min_latency on;
|
|
||||||
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;
|
|
||||||
|
|
||||||
# @see publish.srs.com
|
|
||||||
publish {
|
|
||||||
mr off;
|
|
||||||
firstpkt_timeout 20000;
|
|
||||||
normal_timeout 7000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# 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 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 intput stream port.
|
|
||||||
# [app] the input stream app.
|
|
||||||
# [stream] the input stream name.
|
|
||||||
# [engine] the tanscode 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 play specified configs
|
# the play specified configs
|
||||||
vhost play.srs.com {
|
vhost play.srs.com {
|
||||||
# for play client, both RTMP and other stream clients,
|
# for play client, both RTMP and other stream clients,
|
||||||
|
@ -527,6 +415,13 @@ vhost play.srs.com {
|
||||||
# always ignore the onMetaData if atc_auto is off.
|
# always ignore the onMetaData if atc_auto is off.
|
||||||
# default: off
|
# default: off
|
||||||
atc_auto 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -546,6 +441,126 @@ vhost atc.srs.com {
|
||||||
atc_auto 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_latenct 350;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# the vhost for min delay, donot cache any stream.
|
||||||
|
vhost min.delay.com {
|
||||||
|
# @see scope.vhost.srs.com
|
||||||
|
min_latency on;
|
||||||
|
# @see scope.vhost.srs.com
|
||||||
|
tcp_nodelay on;
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
|
||||||
|
# @see play.srs.com
|
||||||
|
play {
|
||||||
|
mw_latency 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
# @see publish.srs.com
|
||||||
|
publish {
|
||||||
|
mr off;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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 vhost min.delay.com
|
||||||
|
queue_length 10;
|
||||||
|
# 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;
|
||||||
|
|
||||||
|
# @see play.srs.com
|
||||||
|
play {
|
||||||
|
mw_latency 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
# @see publish.srs.com
|
||||||
|
publish {
|
||||||
|
mr off;
|
||||||
|
firstpkt_timeout 20000;
|
||||||
|
normal_timeout 7000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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 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 intput stream port.
|
||||||
|
# [app] the input stream app.
|
||||||
|
# [stream] the input stream name.
|
||||||
|
# [engine] the tanscode 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 security to allow or deny clients.
|
# the security to allow or deny clients.
|
||||||
vhost security.srs.com {
|
vhost security.srs.com {
|
||||||
# security for host to allow or deny clients.
|
# security for host to allow or deny clients.
|
||||||
|
|
|
@ -841,18 +841,6 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root)
|
||||||
srs_trace("vhost %s reload publish success.", vhost.c_str());
|
srs_trace("vhost %s reload publish success.", vhost.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
// mw, only one per vhost
|
|
||||||
if (!srs_directive_equals(new_vhost->get("mw_latency"), old_vhost->get("mw_latency"))) {
|
|
||||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
|
||||||
ISrsReloadHandler* subscribe = *it;
|
|
||||||
if ((ret = subscribe->on_reload_vhost_mw(vhost)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("vhost %s notify subscribes mw failed. ret=%d", vhost.c_str(), ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
srs_trace("vhost %s reload mw success.", vhost.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
// smi(send_min_interval), only one per vhost
|
// smi(send_min_interval), only one per vhost
|
||||||
if (!srs_directive_equals(new_vhost->get("send_min_interval"), old_vhost->get("send_min_interval"))) {
|
if (!srs_directive_equals(new_vhost->get("send_min_interval"), old_vhost->get("send_min_interval"))) {
|
||||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
||||||
|
@ -1735,11 +1723,6 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj)
|
||||||
obj->set("debug_srs_upnode", dir->dumps_arg0_to_boolean());
|
obj->set("debug_srs_upnode", dir->dumps_arg0_to_boolean());
|
||||||
}
|
}
|
||||||
|
|
||||||
// mrw
|
|
||||||
if ((dir = vhost->get("mw_latency")) != NULL) {
|
|
||||||
obj->set("mw_latency", dir->dumps_arg0_to_number());
|
|
||||||
}
|
|
||||||
|
|
||||||
// realtime latency
|
// realtime latency
|
||||||
if ((dir = vhost->get("gop_cache")) != NULL) {
|
if ((dir = vhost->get("gop_cache")) != NULL) {
|
||||||
obj->set("gop_cache", dir->dumps_arg0_to_boolean());
|
obj->set("gop_cache", dir->dumps_arg0_to_boolean());
|
||||||
|
@ -1772,6 +1755,8 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj)
|
||||||
play->set("atc", sdir->dumps_arg0_to_boolean());
|
play->set("atc", sdir->dumps_arg0_to_boolean());
|
||||||
} else if (sdir->name == "atc_auto") {
|
} else if (sdir->name == "atc_auto") {
|
||||||
play->set("atc_auto", sdir->dumps_arg0_to_boolean());
|
play->set("atc_auto", sdir->dumps_arg0_to_boolean());
|
||||||
|
} else if (sdir->name == "mw_latency") {
|
||||||
|
play->set("mw_latency", sdir->dumps_arg0_to_number());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2654,7 +2639,7 @@ int SrsConfig::check_config()
|
||||||
&& n != "dvr" && n != "ingest" && n != "hls" && n != "http_hooks"
|
&& n != "dvr" && n != "ingest" && n != "hls" && n != "http_hooks"
|
||||||
&& n != "gop_cache" && n != "queue_length"
|
&& n != "gop_cache" && n != "queue_length"
|
||||||
&& n != "refer" && n != "forward" && n != "transcode" && n != "bandcheck"
|
&& n != "refer" && n != "forward" && n != "transcode" && n != "bandcheck"
|
||||||
&& n != "debug_srs_upnode" && n != "play" && n != "publish" && n != "mw_latency"
|
&& n != "debug_srs_upnode" && n != "play" && n != "publish"
|
||||||
&& n != "send_min_interval" && n != "reduce_sequence_header"
|
&& n != "send_min_interval" && n != "reduce_sequence_header"
|
||||||
&& n != "security" && n != "http_remux"
|
&& n != "security" && n != "http_remux"
|
||||||
&& n != "http_static" && n != "hds" && n != "exec"
|
&& n != "http_static" && n != "hds" && n != "exec"
|
||||||
|
@ -2696,7 +2681,7 @@ int SrsConfig::check_config()
|
||||||
} else if (n == "play") {
|
} else if (n == "play") {
|
||||||
for (int j = 0; j < (int)conf->directives.size(); j++) {
|
for (int j = 0; j < (int)conf->directives.size(); j++) {
|
||||||
string m = conf->at(j)->name.c_str();
|
string m = conf->at(j)->name.c_str();
|
||||||
if (m != "time_jitter" && m != "mix_correct" && m != "atc" && m != "atc_auto" ) {
|
if (m != "time_jitter" && m != "mix_correct" && m != "atc" && m != "atc_auto" && m != "mw_latency") {
|
||||||
ret = ERROR_SYSTEM_CONFIG_INVALID;
|
ret = ERROR_SYSTEM_CONFIG_INVALID;
|
||||||
srs_error("unsupported vhost play directive %s, ret=%d", m.c_str(), ret);
|
srs_error("unsupported vhost play directive %s, ret=%d", m.c_str(), ret);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -3482,6 +3467,11 @@ int SrsConfig::get_mw_sleep_ms(string vhost)
|
||||||
if (!conf) {
|
if (!conf) {
|
||||||
return SRS_PERF_MW_SLEEP;
|
return SRS_PERF_MW_SLEEP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
conf = conf->get("play");
|
||||||
|
if (!conf || conf->arg0().empty()) {
|
||||||
|
return SRS_PERF_MW_SLEEP;
|
||||||
|
}
|
||||||
|
|
||||||
conf = conf->get("mw_latency");
|
conf = conf->get("mw_latency");
|
||||||
if (!conf || conf->arg0().empty()) {
|
if (!conf || conf->arg0().empty()) {
|
||||||
|
@ -5789,12 +5779,12 @@ int srs_config_transform_vhost(SrsConfDirective* root)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SRS3.0, change the folowing like a shadow:
|
// SRS3.0, change the folowing like a shadow:
|
||||||
// time_jitter, mix_correct, atc, atc_auto
|
// time_jitter, mix_correct, atc, atc_auto, mw_latency
|
||||||
// SRS1/2:
|
// SRS1/2:
|
||||||
// vhost { shadow; }
|
// vhost { shadow; }
|
||||||
// SRS3+:
|
// SRS3+:
|
||||||
// vhost { play { shadow; } }
|
// vhost { play { shadow; } }
|
||||||
if (n == "time_jitter" || n == "mix_correct" || n == "atc" || n == "atc_auto") {
|
if (n == "time_jitter" || n == "mix_correct" || n == "atc" || n == "atc_auto" || n == "mw_latency") {
|
||||||
it = dir->directives.erase(it);
|
it = dir->directives.erase(it);
|
||||||
|
|
||||||
SrsConfDirective* play = dir->get_or_create("play");
|
SrsConfDirective* play = dir->get_or_create("play");
|
||||||
|
|
|
@ -165,11 +165,6 @@ int ISrsReloadHandler::on_reload_vhost_publish(string /*vhost*/)
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ISrsReloadHandler::on_reload_vhost_mw(string /*vhost*/)
|
|
||||||
{
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ISrsReloadHandler::on_reload_vhost_smi(string /*vhost*/)
|
int ISrsReloadHandler::on_reload_vhost_smi(string /*vhost*/)
|
||||||
{
|
{
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
|
|
|
@ -72,7 +72,6 @@ public:
|
||||||
virtual int on_reload_vhost_hds(std::string vhost);
|
virtual int on_reload_vhost_hds(std::string vhost);
|
||||||
virtual int on_reload_vhost_dvr(std::string vhost);
|
virtual int on_reload_vhost_dvr(std::string vhost);
|
||||||
virtual int on_reload_vhost_publish(std::string vhost);
|
virtual int on_reload_vhost_publish(std::string vhost);
|
||||||
virtual int on_reload_vhost_mw(std::string vhost);
|
|
||||||
virtual int on_reload_vhost_smi(std::string vhost);
|
virtual int on_reload_vhost_smi(std::string vhost);
|
||||||
virtual int on_reload_vhost_tcp_nodelay(std::string vhost);
|
virtual int on_reload_vhost_tcp_nodelay(std::string vhost);
|
||||||
virtual int on_reload_vhost_realtime(std::string vhost);
|
virtual int on_reload_vhost_realtime(std::string vhost);
|
||||||
|
|
|
@ -231,18 +231,13 @@ int SrsRtmpConn::on_reload_vhost_removed(string vhost)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SrsRtmpConn::on_reload_vhost_mw(string vhost)
|
int SrsRtmpConn::on_reload_vhost_play(string vhost)
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
if (req->vhost != vhost) {
|
if (req->vhost != vhost) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sleep_ms = _srs_config->get_mw_sleep_ms(req->vhost);
|
|
||||||
|
|
||||||
// when mw_sleep changed, resize the socket send buffer.
|
|
||||||
change_mw_sleep(sleep_ms);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,7 +103,7 @@ protected:
|
||||||
// interface ISrsReloadHandler
|
// interface ISrsReloadHandler
|
||||||
public:
|
public:
|
||||||
virtual int on_reload_vhost_removed(std::string vhost);
|
virtual int on_reload_vhost_removed(std::string vhost);
|
||||||
virtual int on_reload_vhost_mw(std::string vhost);
|
virtual int on_reload_vhost_play(std::string vhost);
|
||||||
virtual int on_reload_vhost_smi(std::string vhost);
|
virtual int on_reload_vhost_smi(std::string vhost);
|
||||||
virtual int on_reload_vhost_tcp_nodelay(std::string vhost);
|
virtual int on_reload_vhost_tcp_nodelay(std::string vhost);
|
||||||
virtual int on_reload_vhost_realtime(std::string vhost);
|
virtual int on_reload_vhost_realtime(std::string vhost);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue