正在显示
4 个修改的文件
包含
71 行增加
和
29 行删除
@@ -343,6 +343,8 @@ Remark: | @@ -343,6 +343,8 @@ Remark: | ||
343 | ## History | 343 | ## History |
344 | 344 | ||
345 | ### SRS 2.0 history | 345 | ### SRS 2.0 history |
346 | + | ||
347 | +* v2.0, 2015-05-30, fix [#209](https://github.com/simple-rtmp-server/srs/issues/209) cleanup hls when stop and timeout. 2.0.173. | ||
346 | * v2.0, 2015-05-29, fix [#409](https://github.com/simple-rtmp-server/srs/issues/409) support pure video hls. 2.0.172. | 348 | * v2.0, 2015-05-29, fix [#409](https://github.com/simple-rtmp-server/srs/issues/409) support pure video hls. 2.0.172. |
347 | * v2.0, 2015-05-28, support [srs-dolphin][srs-dolphin], the multiple-process SRS. | 349 | * v2.0, 2015-05-28, support [srs-dolphin][srs-dolphin], the multiple-process SRS. |
348 | * v2.0, 2015-05-24, fix [#404](https://github.com/simple-rtmp-server/srs/issues/404) register handler then start http thread. 2.0.167. | 350 | * v2.0, 2015-05-24, fix [#404](https://github.com/simple-rtmp-server/srs/issues/404) register handler then start http thread. 2.0.167. |
@@ -292,7 +292,6 @@ SrsHlsMuxer::SrsHlsMuxer() | @@ -292,7 +292,6 @@ SrsHlsMuxer::SrsHlsMuxer() | ||
292 | 292 | ||
293 | SrsHlsMuxer::~SrsHlsMuxer() | 293 | SrsHlsMuxer::~SrsHlsMuxer() |
294 | { | 294 | { |
295 | - | ||
296 | std::vector<SrsHlsSegment*>::iterator it; | 295 | std::vector<SrsHlsSegment*>::iterator it; |
297 | for (it = segments.begin(); it != segments.end(); ++it) { | 296 | for (it = segments.begin(); it != segments.end(); ++it) { |
298 | SrsHlsSegment* segment = *it; | 297 | SrsHlsSegment* segment = *it; |
@@ -308,38 +307,35 @@ SrsHlsMuxer::~SrsHlsMuxer() | @@ -308,38 +307,35 @@ SrsHlsMuxer::~SrsHlsMuxer() | ||
308 | 307 | ||
309 | void SrsHlsMuxer::dispose() | 308 | void SrsHlsMuxer::dispose() |
310 | { | 309 | { |
311 | - if (!should_write_file) { | ||
312 | - return; | ||
313 | - } | ||
314 | - | ||
315 | - std::vector<SrsHlsSegment*>::iterator it; | ||
316 | - for (it = segments.begin(); it != segments.end(); ++it) { | ||
317 | - SrsHlsSegment* segment = *it; | ||
318 | - if (unlink(segment->full_path.c_str()) < 0) { | ||
319 | - srs_warn("dispose unlink path failed, file=%s.", segment->full_path.c_str()); | 310 | + if (should_write_file) { |
311 | + std::vector<SrsHlsSegment*>::iterator it; | ||
312 | + for (it = segments.begin(); it != segments.end(); ++it) { | ||
313 | + SrsHlsSegment* segment = *it; | ||
314 | + if (unlink(segment->full_path.c_str()) < 0) { | ||
315 | + srs_warn("dispose unlink path failed, file=%s.", segment->full_path.c_str()); | ||
316 | + } | ||
317 | + srs_freep(segment); | ||
320 | } | 318 | } |
321 | - } | ||
322 | - | ||
323 | - if (current) { | ||
324 | - std::string path = current->full_path + ".tmp"; | ||
325 | - if (unlink(path.c_str()) < 0) { | ||
326 | - srs_warn("dispose unlink path failed, file=%s", path.c_str()); | 319 | + segments.clear(); |
320 | + | ||
321 | + if (current) { | ||
322 | + std::string path = current->full_path + ".tmp"; | ||
323 | + if (unlink(path.c_str()) < 0) { | ||
324 | + srs_warn("dispose unlink path failed, file=%s", path.c_str()); | ||
325 | + } | ||
326 | + srs_freep(current); | ||
327 | + } | ||
328 | + | ||
329 | + if (unlink(m3u8.c_str()) < 0) { | ||
330 | + srs_warn("dispose unlink path failed. file=%s", m3u8.c_str()); | ||
327 | } | 331 | } |
328 | } | 332 | } |
329 | 333 | ||
330 | - if (unlink(m3u8.c_str()) < 0) { | ||
331 | - srs_warn("dispose unlink path failed. file=%s", m3u8.c_str()); | ||
332 | - } | 334 | + // TODO: FIXME: support hls dispose in HTTP cache. |
335 | + | ||
333 | srs_trace("gracefully dispose hls %s", req? req->get_stream_url().c_str() : ""); | 336 | srs_trace("gracefully dispose hls %s", req? req->get_stream_url().c_str() : ""); |
334 | } | 337 | } |
335 | 338 | ||
336 | -int SrsHlsMuxer::cycle() | ||
337 | -{ | ||
338 | - int ret = ERROR_SUCCESS; | ||
339 | - // TODO: FIXME: implements it. | ||
340 | - return ret; | ||
341 | -} | ||
342 | - | ||
343 | int SrsHlsMuxer::sequence_no() | 339 | int SrsHlsMuxer::sequence_no() |
344 | { | 340 | { |
345 | return _sequence_no; | 341 | return _sequence_no; |
@@ -1125,6 +1121,8 @@ SrsHls::SrsHls() | @@ -1125,6 +1121,8 @@ SrsHls::SrsHls() | ||
1125 | handler = NULL; | 1121 | handler = NULL; |
1126 | 1122 | ||
1127 | hls_enabled = false; | 1123 | hls_enabled = false; |
1124 | + hls_can_dispose = false; | ||
1125 | + last_update_time = 0; | ||
1128 | 1126 | ||
1129 | codec = new SrsAvcAacCodec(); | 1127 | codec = new SrsAvcAacCodec(); |
1130 | sample = new SrsCodecSample(); | 1128 | sample = new SrsCodecSample(); |
@@ -1160,8 +1158,33 @@ void SrsHls::dispose() | @@ -1160,8 +1158,33 @@ void SrsHls::dispose() | ||
1160 | 1158 | ||
1161 | int SrsHls::cycle() | 1159 | int SrsHls::cycle() |
1162 | { | 1160 | { |
1161 | + int ret = ERROR_SUCCESS; | ||
1162 | + | ||
1163 | srs_info("hls cycle for source %d", source->source_id()); | 1163 | srs_info("hls cycle for source %d", source->source_id()); |
1164 | - return muxer->cycle(); | 1164 | + |
1165 | + if (last_update_time <= 0) { | ||
1166 | + last_update_time = srs_get_system_time_ms(); | ||
1167 | + } | ||
1168 | + | ||
1169 | + if (!_req) { | ||
1170 | + return ret; | ||
1171 | + } | ||
1172 | + | ||
1173 | + int hls_dispose = _srs_config->get_hls_dispose(_req->vhost) * 1000; | ||
1174 | + if (srs_get_system_time_ms() - last_update_time <= hls_dispose) { | ||
1175 | + return ret; | ||
1176 | + } | ||
1177 | + last_update_time = srs_get_system_time_ms(); | ||
1178 | + | ||
1179 | + if (!hls_can_dispose) { | ||
1180 | + return ret; | ||
1181 | + } | ||
1182 | + hls_can_dispose = false; | ||
1183 | + | ||
1184 | + srs_trace("hls cycle to dispose hls %s, timeout=%dms", _req->get_stream_url().c_str(), hls_dispose); | ||
1185 | + dispose(); | ||
1186 | + | ||
1187 | + return ret; | ||
1165 | } | 1188 | } |
1166 | 1189 | ||
1167 | int SrsHls::initialize(SrsSource* s, ISrsHlsHandler* h) | 1190 | int SrsHls::initialize(SrsSource* s, ISrsHlsHandler* h) |
@@ -1182,6 +1205,11 @@ int SrsHls::on_publish(SrsRequest* req) | @@ -1182,6 +1205,11 @@ int SrsHls::on_publish(SrsRequest* req) | ||
1182 | { | 1205 | { |
1183 | int ret = ERROR_SUCCESS; | 1206 | int ret = ERROR_SUCCESS; |
1184 | 1207 | ||
1208 | + _req = req; | ||
1209 | + | ||
1210 | + // update the hls time, for hls_dispose. | ||
1211 | + last_update_time = srs_get_system_time_ms(); | ||
1212 | + | ||
1185 | // support multiple publish. | 1213 | // support multiple publish. |
1186 | if (hls_enabled) { | 1214 | if (hls_enabled) { |
1187 | return ret; | 1215 | return ret; |
@@ -1199,6 +1227,9 @@ int SrsHls::on_publish(SrsRequest* req) | @@ -1199,6 +1227,9 @@ int SrsHls::on_publish(SrsRequest* req) | ||
1199 | // if enabled, open the muxer. | 1227 | // if enabled, open the muxer. |
1200 | hls_enabled = true; | 1228 | hls_enabled = true; |
1201 | 1229 | ||
1230 | + // ok, the hls can be dispose, or need to be dispose. | ||
1231 | + hls_can_dispose = true; | ||
1232 | + | ||
1202 | // notice the source to get the cached sequence header. | 1233 | // notice the source to get the cached sequence header. |
1203 | // when reload to start hls, hls will never get the sequence header in stream, | 1234 | // when reload to start hls, hls will never get the sequence header in stream, |
1204 | // use the SrsSource.on_hls_start to push the sequence header to HLS. | 1235 | // use the SrsSource.on_hls_start to push the sequence header to HLS. |
@@ -1250,6 +1281,9 @@ int SrsHls::on_audio(SrsSharedPtrMessage* shared_audio) | @@ -1250,6 +1281,9 @@ int SrsHls::on_audio(SrsSharedPtrMessage* shared_audio) | ||
1250 | if (!hls_enabled) { | 1281 | if (!hls_enabled) { |
1251 | return ret; | 1282 | return ret; |
1252 | } | 1283 | } |
1284 | + | ||
1285 | + // update the hls time, for hls_dispose. | ||
1286 | + last_update_time = srs_get_system_time_ms(); | ||
1253 | 1287 | ||
1254 | SrsSharedPtrMessage* audio = shared_audio->copy(); | 1288 | SrsSharedPtrMessage* audio = shared_audio->copy(); |
1255 | SrsAutoFree(SrsSharedPtrMessage, audio); | 1289 | SrsAutoFree(SrsSharedPtrMessage, audio); |
@@ -1311,6 +1345,9 @@ int SrsHls::on_video(SrsSharedPtrMessage* shared_video) | @@ -1311,6 +1345,9 @@ int SrsHls::on_video(SrsSharedPtrMessage* shared_video) | ||
1311 | if (!hls_enabled) { | 1345 | if (!hls_enabled) { |
1312 | return ret; | 1346 | return ret; |
1313 | } | 1347 | } |
1348 | + | ||
1349 | + // update the hls time, for hls_dispose. | ||
1350 | + last_update_time = srs_get_system_time_ms(); | ||
1314 | 1351 | ||
1315 | SrsSharedPtrMessage* video = shared_video->copy(); | 1352 | SrsSharedPtrMessage* video = shared_video->copy(); |
1316 | SrsAutoFree(SrsSharedPtrMessage, video); | 1353 | SrsAutoFree(SrsSharedPtrMessage, video); |
@@ -261,7 +261,6 @@ public: | @@ -261,7 +261,6 @@ public: | ||
261 | virtual ~SrsHlsMuxer(); | 261 | virtual ~SrsHlsMuxer(); |
262 | public: | 262 | public: |
263 | virtual void dispose(); | 263 | virtual void dispose(); |
264 | - virtual int cycle(); | ||
265 | public: | 264 | public: |
266 | virtual int sequence_no(); | 265 | virtual int sequence_no(); |
267 | virtual std::string ts_url(); | 266 | virtual std::string ts_url(); |
@@ -382,7 +381,11 @@ private: | @@ -382,7 +381,11 @@ private: | ||
382 | SrsHlsCache* hls_cache; | 381 | SrsHlsCache* hls_cache; |
383 | ISrsHlsHandler* handler; | 382 | ISrsHlsHandler* handler; |
384 | private: | 383 | private: |
384 | + SrsRequest* _req; | ||
385 | bool hls_enabled; | 385 | bool hls_enabled; |
386 | + bool hls_can_dispose; | ||
387 | + int64_t last_update_time; | ||
388 | +private: | ||
386 | SrsSource* source; | 389 | SrsSource* source; |
387 | SrsAvcAacCodec* codec; | 390 | SrsAvcAacCodec* codec; |
388 | SrsCodecSample* sample; | 391 | SrsCodecSample* sample; |
@@ -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 172 | 34 | +#define VERSION_REVISION 173 |
35 | 35 | ||
36 | // server info. | 36 | // server info. |
37 | #define RTMP_SIG_SRS_KEY "SRS" | 37 | #define RTMP_SIG_SRS_KEY "SRS" |
-
请 注册 或 登录 后发表评论