diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index 29084ecc1..74de204fb 100755 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -298,6 +298,7 @@ vhost with-hls.srs.com { # the error strategy. canbe: # ignore, when error ignore and disable hls. # disconnect, when error disconnect the publish connection. + # continue, when error ignore and continue output hls. # @see https://github.com/winlinvip/simple-rtmp-server/issues/264 # default: ignore hls_on_error ignore; diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index 0df1bdd48..dd3d68533 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -50,6 +50,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SRS_CONF_DEFAULT_HLS_WINDOW 60 #define SRS_CONF_DEFAULT_HLS_ON_ERROR_IGNORE "ignore" #define SRS_CONF_DEFAULT_HLS_ON_ERROR_DISCONNECT "disconnect" +#define SRS_CONF_DEFAULT_HLS_ON_ERROR_CONTINUE "continue" #define SRS_CONF_DEFAULT_HLS_ON_ERROR SRS_CONF_DEFAULT_HLS_ON_ERROR_IGNORE #define SRS_CONF_DEFAULT_DVR_PATH "./objs/nginx/html" #define SRS_CONF_DEFAULT_DVR_PLAN_SESSION "session" diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index a9a66a36d..c1f4352ad 100644 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -1067,6 +1067,15 @@ int SrsSource::on_audio(SrsMessage* __audio) // ignore. ret = ERROR_SUCCESS; + } else if (hls_error_strategy == SRS_CONF_DEFAULT_HLS_ON_ERROR_CONTINUE) { + // compare the sequence header with audio, continue when it's actually an sequence header. + if (ret == ERROR_HLS_DECODE_ERROR && cache_sh_audio && cache_sh_audio->size == msg.size) { + srs_warn("the audio is actually a sequence header, ignore this packet."); + ret = ERROR_SUCCESS; + } else { + srs_warn("hls continue audio failed. ret=%d", ret); + return ret; + } } else { srs_warn("hls disconnect publisher for audio error. ret=%d", ret); return ret; @@ -1184,6 +1193,15 @@ int SrsSource::on_video(SrsMessage* __video) // ignore. ret = ERROR_SUCCESS; + } else if (hls_error_strategy == SRS_CONF_DEFAULT_HLS_ON_ERROR_CONTINUE) { + // compare the sequence header with video, continue when it's actually an sequence header. + if (ret == ERROR_HLS_DECODE_ERROR && cache_sh_video && cache_sh_video->size == msg.size) { + srs_warn("the video is actually a sequence header, ignore this packet."); + ret = ERROR_SUCCESS; + } else { + srs_warn("hls continue video failed. ret=%d", ret); + return ret; + } } else { srs_warn("hls disconnect publisher for video error. ret=%d", ret); return ret; diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index a9d605215..253a15daf 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 1 #define VERSION_MINOR 0 -#define VERSION_REVISION 11 +#define VERSION_REVISION 12 // server info. #define RTMP_SIG_SRS_KEY "SRS" #define RTMP_SIG_SRS_ROLE "origin/edge server"