From 8e6af4c591ed192352e19fd255669c168f52f833 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 3 Nov 2017 14:59:14 +0100 Subject: [PATCH] Fixed repushing issues --- src/output/output.cpp | 11 ++++++++++- src/output/output_rtmp.cpp | 17 ++++++++++++++--- src/output/output_rtmp.h | 3 ++- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/output/output.cpp b/src/output/output.cpp index db0fe494..0a5c0f99 100644 --- a/src/output/output.cpp +++ b/src/output/output.cpp @@ -472,7 +472,7 @@ namespace Mist{ if (!found){ jsonForEach((*itb), itc){ if (found){break;} - for (std::map::iterator trit = myMeta.tracks.begin(); trit != myMeta.tracks.end(); trit++){ + for (std::map::reverse_iterator trit = myMeta.tracks.rbegin(); trit != myMeta.tracks.rend(); trit++){ if (trit->second.codec == (*itc).asStringRef() || (*itc).asStringRef() == "*"){ selectedTracks.insert(trit->first); found = true; @@ -1178,6 +1178,11 @@ namespace Mist{ static int nonVideoCount = 0; static unsigned int emptyCount = 0; if (!buffer.size()){ + if (isRecording() && myMeta.live){ + selectDefaultTracks(); + initialSeek(); + return false; + } thisPacket.null(); INFO_MSG("Buffer completely played out"); return true; @@ -1604,9 +1609,13 @@ namespace Mist{ nProxy.userClient.finish(); nProxy.userClient = IPC::sharedClient(); } + if (statsPage.getData()){ + statsPage.keepAlive(); + } Util::wait(1000); streamStatus = Util::getStreamStatus(streamName); if (streamStatus == STRMSTAT_OFF || streamStatus == STRMSTAT_WAIT || streamStatus == STRMSTAT_READY){ + INFO_MSG("Reconnecting to %s buffer... (%u)", streamName.c_str(), streamStatus); reconnect(); streamStatus = Util::getStreamStatus(streamName); } diff --git a/src/output/output_rtmp.cpp b/src/output/output_rtmp.cpp index 7bdfcadf..2e8d0d28 100644 --- a/src/output/output_rtmp.cpp +++ b/src/output/output_rtmp.cpp @@ -11,6 +11,8 @@ namespace Mist{ OutRTMP::OutRTMP(Socket::Connection & conn) : Output(conn){ + lastOutTime = 0; + rtmpOffset = 0; maxbps = config->getInteger("maxkbps")*128; if (config->getString("target").size() && config->getString("target").substr(0, 7) == "rtmp://"){ streamName = config->getString("streamname"); @@ -263,7 +265,6 @@ namespace Mist{ } void OutRTMP::sendNext(){ - //If there are now more selectable tracks, select the new track and do a seek to the current timestamp //Set sentHeader to false to force it to send init data if (myMeta.live && selectedTracks.size() < 2){ @@ -284,6 +285,16 @@ namespace Mist{ } } + if (streamOut.size()){ + if (thisPacket.getTime() - rtmpOffset < lastOutTime){ + int64_t OLD = rtmpOffset; + rtmpOffset -= (1 + lastOutTime - (thisPacket.getTime() - rtmpOffset)); + INFO_MSG("Changing rtmpOffset from %lld to %lld", OLD, rtmpOffset); + realTime = 800; + } + lastOutTime = thisPacket.getTime() - rtmpOffset; + } + char rtmpheader[] ={0, //byte 0 = cs_id | ch_type 0, 0, 0, //bytes 1-3 = timestamp @@ -390,9 +401,9 @@ namespace Mist{ unsigned int timestamp = thisPacket.getTime() - rtmpOffset; //make sure we don't go negative - if (rtmpOffset > thisPacket.getTime()){ + if (rtmpOffset > (int64_t)thisPacket.getTime()){ timestamp = 0; - rtmpOffset = thisPacket.getTime(); + rtmpOffset = (int64_t)thisPacket.getTime(); } bool allow_short = RTMPStream::lastsend.count(4); diff --git a/src/output/output_rtmp.h b/src/output/output_rtmp.h index d19584c4..b4583f62 100644 --- a/src/output/output_rtmp.h +++ b/src/output/output_rtmp.h @@ -18,7 +18,8 @@ namespace Mist { bool onFinish(); protected: std::string streamOut;///