Fix RTMP push delay, specifically

This commit is contained in:
Thulinma 2022-02-09 16:50:24 +01:00
parent 31c5b81f4d
commit c3a09f5fe2
2 changed files with 19 additions and 9 deletions

View file

@ -1020,10 +1020,24 @@ namespace Mist{
}
}else{
if (M.getLive() && targetParams.count("pushdelay")){
INFO_MSG("Converting pushdelay syntax into corresponding startunix+realtime options");
targetParams["startunix"] = std::string("-") + targetParams["pushdelay"];
INFO_MSG("Converting pushdelay syntax into corresponding recstart+realtime options");
uint64_t delayTime = JSON::Value(targetParams["pushdelay"]).asInt()*1000;
if (endTime() - startTime() < delayTime){
uint64_t waitTime = delayTime - (endTime() - startTime());
INFO_MSG("Waiting for buffer to fill up: waiting %" PRIu64 "ms", waitTime);
Util::wait(waitTime);
if (endTime() - startTime() < delayTime){
WARN_MSG("Waited for %" PRIu64 "ms, but buffer still too small for a push delay of %" PRIu64 "ms. Doing the best we can.", waitTime, delayTime);
}
}
if (endTime() < delayTime){
INFO_MSG("Waiting for stream to reach playback starting point. Current last ms is '%" PRIu64 "'", endTime());
while (endTime() < delayTime && keepGoing()){Util::wait(250);}
}
targetParams["start"] = JSON::Value(endTime() - delayTime).asString();
targetParams["realtime"] = "1"; //force real-time speed
targetParams["noskip"] = "1"; //disable rate control / skipping forward
maxSkipAhead = 1;
}
if (M.getLive() && (targetParams.count("startunix") || targetParams.count("stopunix"))){
uint64_t unixStreamBegin = Util::epoch() - endTime()/1000;
@ -1313,10 +1327,6 @@ namespace Mist{
if (!targetParams.count("realtime")){
realTime = 0;
}
if (targetParams.count("noskip")){
//Disable rate control systems for pushes; we want real-time speed
maxSkipAhead = 1;
}
}
// Handle CONN_OPEN trigger, if needed
if (Triggers::shouldTrigger("CONN_OPEN", streamName)){

View file

@ -21,6 +21,8 @@ namespace Mist{
rtmpOffset = 0;
authAttempts = 0;
maxbps = config->getInteger("maxkbps") * 128;
//Switch realtime tracking system to mode where it never skips ahead, but only changes playback speed
maxSkipAhead = 0;
if (config->getString("target").size()){
streamName = config->getString("streamname");
pushUrl = HTTP::URL(config->getString("target"));
@ -72,8 +74,6 @@ namespace Mist{
}
setBlocking(false);
}
maxSkipAhead = 0;
}
void OutRTMP::startPushOut(const char *args){