正在显示
6 个修改的文件
包含
72 行增加
和
22 行删除
@@ -329,6 +329,12 @@ vhost with-hls.srs.com { | @@ -329,6 +329,12 @@ vhost with-hls.srs.com { | ||
329 | # the hls window in seconds, the number of ts in m3u8. | 329 | # the hls window in seconds, the number of ts in m3u8. |
330 | # default: 60 | 330 | # default: 60 |
331 | hls_window 60; | 331 | hls_window 60; |
332 | + # the error strategy. canbe: | ||
333 | + # ignore, when error ignore and disable hls. | ||
334 | + # disconnect, when error disconnect the publish connection. | ||
335 | + # @see https://github.com/winlinvip/simple-rtmp-server/issues/264 | ||
336 | + # default: ignore | ||
337 | + hls_on_error ignore; | ||
332 | } | 338 | } |
333 | } | 339 | } |
334 | # the vhost with hls disabled. | 340 | # the vhost with hls disabled. |
@@ -798,6 +798,7 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root) | @@ -798,6 +798,7 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root) | ||
798 | srs_trace("vhost %s reload forward success.", vhost.c_str()); | 798 | srs_trace("vhost %s reload forward success.", vhost.c_str()); |
799 | } | 799 | } |
800 | // hls, only one per vhost | 800 | // hls, only one per vhost |
801 | + // @remark, the hls_on_error directly support reload. | ||
801 | if (!srs_directive_equals(new_vhost->get("hls"), old_vhost->get("hls"))) { | 802 | if (!srs_directive_equals(new_vhost->get("hls"), old_vhost->get("hls"))) { |
802 | for (it = subscribes.begin(); it != subscribes.end(); ++it) { | 803 | for (it = subscribes.begin(); it != subscribes.end(); ++it) { |
803 | ISrsReloadHandler* subscribe = *it; | 804 | ISrsReloadHandler* subscribe = *it; |
@@ -1412,7 +1413,7 @@ int SrsConfig::check_config() | @@ -1412,7 +1413,7 @@ int SrsConfig::check_config() | ||
1412 | } else if (n == "hls") { | 1413 | } else if (n == "hls") { |
1413 | for (int j = 0; j < (int)conf->directives.size(); j++) { | 1414 | for (int j = 0; j < (int)conf->directives.size(); j++) { |
1414 | string m = conf->at(j)->name.c_str(); | 1415 | string m = conf->at(j)->name.c_str(); |
1415 | - if (m != "enabled" && m != "hls_path" && m != "hls_fragment" && m != "hls_window") { | 1416 | + if (m != "enabled" && m != "hls_path" && m != "hls_fragment" && m != "hls_window" && m != "hls_on_error") { |
1416 | ret = ERROR_SYSTEM_CONFIG_INVALID; | 1417 | ret = ERROR_SYSTEM_CONFIG_INVALID; |
1417 | srs_error("unsupported vhost hls directive %s, ret=%d", m.c_str(), ret); | 1418 | srs_error("unsupported vhost hls directive %s, ret=%d", m.c_str(), ret); |
1418 | return ret; | 1419 | return ret; |
@@ -3064,6 +3065,23 @@ double SrsConfig::get_hls_window(string vhost) | @@ -3064,6 +3065,23 @@ double SrsConfig::get_hls_window(string vhost) | ||
3064 | return ::atof(conf->arg0().c_str()); | 3065 | return ::atof(conf->arg0().c_str()); |
3065 | } | 3066 | } |
3066 | 3067 | ||
3068 | +string SrsConfig::get_hls_on_error(string vhost) | ||
3069 | +{ | ||
3070 | + SrsConfDirective* hls = get_hls(vhost); | ||
3071 | + | ||
3072 | + if (!hls) { | ||
3073 | + return SRS_CONF_DEFAULT_HLS_ON_ERROR; | ||
3074 | + } | ||
3075 | + | ||
3076 | + SrsConfDirective* conf = hls->get("hls_on_error"); | ||
3077 | + | ||
3078 | + if (!conf) { | ||
3079 | + return SRS_CONF_DEFAULT_HLS_ON_ERROR; | ||
3080 | + } | ||
3081 | + | ||
3082 | + return conf->arg0(); | ||
3083 | +} | ||
3084 | + | ||
3067 | SrsConfDirective* SrsConfig::get_dvr(string vhost) | 3085 | SrsConfDirective* SrsConfig::get_dvr(string vhost) |
3068 | { | 3086 | { |
3069 | SrsConfDirective* conf = get_vhost(vhost); | 3087 | SrsConfDirective* conf = get_vhost(vhost); |
@@ -48,6 +48,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -48,6 +48,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
48 | #define SRS_CONF_DEFAULT_HLS_PATH "./objs/nginx/html" | 48 | #define SRS_CONF_DEFAULT_HLS_PATH "./objs/nginx/html" |
49 | #define SRS_CONF_DEFAULT_HLS_FRAGMENT 10 | 49 | #define SRS_CONF_DEFAULT_HLS_FRAGMENT 10 |
50 | #define SRS_CONF_DEFAULT_HLS_WINDOW 60 | 50 | #define SRS_CONF_DEFAULT_HLS_WINDOW 60 |
51 | +#define SRS_CONF_DEFAULT_HLS_ON_ERROR_IGNORE "ignore" | ||
52 | +#define SRS_CONF_DEFAULT_HLS_ON_ERROR_DISCONNECT "disconnect" | ||
53 | +#define SRS_CONF_DEFAULT_HLS_ON_ERROR SRS_CONF_DEFAULT_HLS_ON_ERROR_IGNORE | ||
51 | #define SRS_CONF_DEFAULT_DVR_PATH "./objs/nginx/html" | 54 | #define SRS_CONF_DEFAULT_DVR_PATH "./objs/nginx/html" |
52 | #define SRS_CONF_DEFAULT_DVR_PLAN_SESSION "session" | 55 | #define SRS_CONF_DEFAULT_DVR_PLAN_SESSION "session" |
53 | #define SRS_CONF_DEFAULT_DVR_PLAN_SEGMENT "segment" | 56 | #define SRS_CONF_DEFAULT_DVR_PLAN_SEGMENT "segment" |
@@ -847,6 +850,13 @@ public: | @@ -847,6 +850,13 @@ public: | ||
847 | * @remark SRS will delete the ts exceed the window. | 850 | * @remark SRS will delete the ts exceed the window. |
848 | */ | 851 | */ |
849 | virtual double get_hls_window(std::string vhost); | 852 | virtual double get_hls_window(std::string vhost); |
853 | + /** | ||
854 | + * get the hls hls_on_error config. | ||
855 | + * the ignore will ignore error and disable hls. | ||
856 | + * the disconnect will disconnect publish connection. | ||
857 | + * @see https://github.com/winlinvip/simple-rtmp-server/issues/264 | ||
858 | + */ | ||
859 | + virtual std::string get_hls_on_error(std::string vhost); | ||
850 | // dvr section | 860 | // dvr section |
851 | private: | 861 | private: |
852 | /** | 862 | /** |
@@ -1439,7 +1439,7 @@ int SrsHls::on_audio(SrsSharedPtrMessage* __audio) | @@ -1439,7 +1439,7 @@ int SrsHls::on_audio(SrsSharedPtrMessage* __audio) | ||
1439 | 1439 | ||
1440 | sample->clear(); | 1440 | sample->clear(); |
1441 | if ((ret = codec->audio_aac_demux(audio->payload, audio->size, sample)) != ERROR_SUCCESS) { | 1441 | if ((ret = codec->audio_aac_demux(audio->payload, audio->size, sample)) != ERROR_SUCCESS) { |
1442 | - srs_error("codec demux audio failed. ret=%d", ret); | 1442 | + srs_error("hls codec demux audio failed. ret=%d", ret); |
1443 | return ret; | 1443 | return ret; |
1444 | } | 1444 | } |
1445 | 1445 | ||
@@ -1484,7 +1484,7 @@ int SrsHls::on_video(SrsSharedPtrMessage* __video) | @@ -1484,7 +1484,7 @@ int SrsHls::on_video(SrsSharedPtrMessage* __video) | ||
1484 | 1484 | ||
1485 | sample->clear(); | 1485 | sample->clear(); |
1486 | if ((ret = codec->video_avc_demux(video->payload, video->size, sample)) != ERROR_SUCCESS) { | 1486 | if ((ret = codec->video_avc_demux(video->payload, video->size, sample)) != ERROR_SUCCESS) { |
1487 | - srs_error("codec demux video failed. ret=%d", ret); | 1487 | + srs_error("hls codec demux video failed. ret=%d", ret); |
1488 | return ret; | 1488 | return ret; |
1489 | } | 1489 | } |
1490 | 1490 |
@@ -1239,14 +1239,22 @@ int SrsSource::on_audio(SrsCommonMessage* __audio) | @@ -1239,14 +1239,22 @@ int SrsSource::on_audio(SrsCommonMessage* __audio) | ||
1239 | srs_verbose("initialize shared ptr audio success."); | 1239 | srs_verbose("initialize shared ptr audio success."); |
1240 | 1240 | ||
1241 | #ifdef SRS_AUTO_HLS | 1241 | #ifdef SRS_AUTO_HLS |
1242 | - if ((ret = hls->on_audio(&msg)) != ERROR_SUCCESS) { | ||
1243 | - srs_warn("hls process audio message failed, ignore and disable hls. ret=%d", ret); | ||
1244 | - | ||
1245 | - // unpublish, ignore ret. | ||
1246 | - hls->on_unpublish(); | ||
1247 | - | ||
1248 | - // ignore. | ||
1249 | - ret = ERROR_SUCCESS; | 1242 | + if ((ret = hls->on_audio(msg.copy())) != ERROR_SUCCESS) { |
1243 | + // apply the error strategy for hls. | ||
1244 | + // @see https://github.com/winlinvip/simple-rtmp-server/issues/264 | ||
1245 | + std::string hls_error_strategy = _srs_config->get_hls_on_error(_req->vhost); | ||
1246 | + if (hls_error_strategy == SRS_CONF_DEFAULT_HLS_ON_ERROR_IGNORE) { | ||
1247 | + srs_warn("hls process audio message failed, ignore and disable hls. ret=%d", ret); | ||
1248 | + | ||
1249 | + // unpublish, ignore ret. | ||
1250 | + hls->on_unpublish(); | ||
1251 | + | ||
1252 | + // ignore. | ||
1253 | + ret = ERROR_SUCCESS; | ||
1254 | + } else { | ||
1255 | + srs_warn("hls disconnect publisher for audio error. ret=%d", ret); | ||
1256 | + return ret; | ||
1257 | + } | ||
1250 | } | 1258 | } |
1251 | #endif | 1259 | #endif |
1252 | 1260 | ||
@@ -1298,7 +1306,7 @@ int SrsSource::on_audio(SrsCommonMessage* __audio) | @@ -1298,7 +1306,7 @@ int SrsSource::on_audio(SrsCommonMessage* __audio) | ||
1298 | SrsAvcAacCodec codec; | 1306 | SrsAvcAacCodec codec; |
1299 | SrsCodecSample sample; | 1307 | SrsCodecSample sample; |
1300 | if ((ret = codec.audio_aac_demux(msg.payload, msg.size, &sample)) != ERROR_SUCCESS) { | 1308 | if ((ret = codec.audio_aac_demux(msg.payload, msg.size, &sample)) != ERROR_SUCCESS) { |
1301 | - srs_error("codec demux audio failed. ret=%d", ret); | 1309 | + srs_error("source codec demux audio failed. ret=%d", ret); |
1302 | return ret; | 1310 | return ret; |
1303 | } | 1311 | } |
1304 | 1312 | ||
@@ -1349,14 +1357,22 @@ int SrsSource::on_video(SrsCommonMessage* __video) | @@ -1349,14 +1357,22 @@ int SrsSource::on_video(SrsCommonMessage* __video) | ||
1349 | srs_verbose("initialize shared ptr video success."); | 1357 | srs_verbose("initialize shared ptr video success."); |
1350 | 1358 | ||
1351 | #ifdef SRS_AUTO_HLS | 1359 | #ifdef SRS_AUTO_HLS |
1352 | - if ((ret = hls->on_video(&msg)) != ERROR_SUCCESS) { | ||
1353 | - srs_warn("hls process video message failed, ignore and disable hls. ret=%d", ret); | ||
1354 | - | ||
1355 | - // unpublish, ignore ret. | ||
1356 | - hls->on_unpublish(); | ||
1357 | - | ||
1358 | - // ignore. | ||
1359 | - ret = ERROR_SUCCESS; | 1360 | + if ((ret = hls->on_video(msg.copy())) != ERROR_SUCCESS) { |
1361 | + // apply the error strategy for hls. | ||
1362 | + // @see https://github.com/winlinvip/simple-rtmp-server/issues/264 | ||
1363 | + std::string hls_error_strategy = _srs_config->get_hls_on_error(_req->vhost); | ||
1364 | + if (hls_error_strategy == SRS_CONF_DEFAULT_HLS_ON_ERROR_IGNORE) { | ||
1365 | + srs_warn("hls process video message failed, ignore and disable hls. ret=%d", ret); | ||
1366 | + | ||
1367 | + // unpublish, ignore ret. | ||
1368 | + hls->on_unpublish(); | ||
1369 | + | ||
1370 | + // ignore. | ||
1371 | + ret = ERROR_SUCCESS; | ||
1372 | + } else { | ||
1373 | + srs_warn("hls disconnect publisher for video error. ret=%d", ret); | ||
1374 | + return ret; | ||
1375 | + } | ||
1360 | } | 1376 | } |
1361 | #endif | 1377 | #endif |
1362 | 1378 | ||
@@ -1406,7 +1422,7 @@ int SrsSource::on_video(SrsCommonMessage* __video) | @@ -1406,7 +1422,7 @@ int SrsSource::on_video(SrsCommonMessage* __video) | ||
1406 | SrsAvcAacCodec codec; | 1422 | SrsAvcAacCodec codec; |
1407 | SrsCodecSample sample; | 1423 | SrsCodecSample sample; |
1408 | if ((ret = codec.video_avc_demux(msg.payload, msg.size, &sample)) != ERROR_SUCCESS) { | 1424 | if ((ret = codec.video_avc_demux(msg.payload, msg.size, &sample)) != ERROR_SUCCESS) { |
1409 | - srs_error("codec demux video failed. ret=%d", ret); | 1425 | + srs_error("source codec demux video failed. ret=%d", ret); |
1410 | return ret; | 1426 | return ret; |
1411 | } | 1427 | } |
1412 | 1428 |
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
31 | // current release version | 31 | // current release version |
32 | #define VERSION_MAJOR 2 | 32 | #define VERSION_MAJOR 2 |
33 | #define VERSION_MINOR 0 | 33 | #define VERSION_MINOR 0 |
34 | -#define VERSION_REVISION 73 | 34 | +#define VERSION_REVISION 74 |
35 | // server info. | 35 | // server info. |
36 | #define RTMP_SIG_SRS_KEY "SRS" | 36 | #define RTMP_SIG_SRS_KEY "SRS" |
37 | #define RTMP_SIG_SRS_ROLE "origin/edge server" | 37 | #define RTMP_SIG_SRS_ROLE "origin/edge server" |
-
请 注册 或 登录 后发表评论