正在显示
5 个修改的文件
包含
76 行增加
和
5 行删除
| @@ -62,8 +62,8 @@ m3u8 url: http://127.0.0.1:1935/live/livestream.m3u8 | @@ -62,8 +62,8 @@ m3u8 url: http://127.0.0.1:1935/live/livestream.m3u8 | ||
| 62 | * nginx v1.5.0: 139524 lines <br/> | 62 | * nginx v1.5.0: 139524 lines <br/> |
| 63 | 63 | ||
| 64 | ### History | 64 | ### History |
| 65 | -* v0.5, 2013-11-24, support HLS(m3u8). | ||
| 66 | -* v0.5, 2013-11-24, support write ts file. | 65 | +* v0.5, 2013-11-24, support HLS(m3u8), fragment and window. |
| 66 | +* v0.5, 2013-11-24, support record to ts file for HLS. | ||
| 67 | * v0.5, 2013-11-21, add ts_info tool to demux ts file. | 67 | * v0.5, 2013-11-21, add ts_info tool to demux ts file. |
| 68 | * v0.5, 2013-11-16, add rtmp players(OSMF/jwplayer5/jwplayer6). | 68 | * v0.5, 2013-11-16, add rtmp players(OSMF/jwplayer5/jwplayer6). |
| 69 | * v0.4, 2013-11-10, v0.4 released. 12500 lines. | 69 | * v0.4, 2013-11-10, v0.4 released. 12500 lines. |
| @@ -595,6 +595,28 @@ SrsConfDirective* SrsConfig::get_hls_path(std::string vhost) | @@ -595,6 +595,28 @@ SrsConfDirective* SrsConfig::get_hls_path(std::string vhost) | ||
| 595 | return conf->get("hls_path"); | 595 | return conf->get("hls_path"); |
| 596 | } | 596 | } |
| 597 | 597 | ||
| 598 | +SrsConfDirective* SrsConfig::get_hls_fragment(std::string vhost) | ||
| 599 | +{ | ||
| 600 | + SrsConfDirective* conf = get_vhost(vhost); | ||
| 601 | + | ||
| 602 | + if (!conf) { | ||
| 603 | + return NULL; | ||
| 604 | + } | ||
| 605 | + | ||
| 606 | + return conf->get("hls_fragment"); | ||
| 607 | +} | ||
| 608 | + | ||
| 609 | +SrsConfDirective* SrsConfig::get_hls_window(std::string vhost) | ||
| 610 | +{ | ||
| 611 | + SrsConfDirective* conf = get_vhost(vhost); | ||
| 612 | + | ||
| 613 | + if (!conf) { | ||
| 614 | + return NULL; | ||
| 615 | + } | ||
| 616 | + | ||
| 617 | + return conf->get("hls_window"); | ||
| 618 | +} | ||
| 619 | + | ||
| 598 | SrsConfDirective* SrsConfig::get_refer(std::string vhost) | 620 | SrsConfDirective* SrsConfig::get_refer(std::string vhost) |
| 599 | { | 621 | { |
| 600 | SrsConfDirective* conf = get_vhost(vhost); | 622 | SrsConfDirective* conf = get_vhost(vhost); |
| @@ -38,6 +38,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -38,6 +38,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 38 | #define RTMP_VHOST_DEFAULT "__defaultVhost__" | 38 | #define RTMP_VHOST_DEFAULT "__defaultVhost__" |
| 39 | 39 | ||
| 40 | #define SRS_CONF_DEFAULT_HLS_PATH "./objs/nginx/html" | 40 | #define SRS_CONF_DEFAULT_HLS_PATH "./objs/nginx/html" |
| 41 | +#define SRS_CONF_DEFAULT_HLS_FRAGMENT 10 | ||
| 42 | +#define SRS_CONF_DEFAULT_HLS_WINDOW 60 | ||
| 41 | 43 | ||
| 42 | class SrsFileBuffer | 44 | class SrsFileBuffer |
| 43 | { | 45 | { |
| @@ -111,6 +113,8 @@ public: | @@ -111,6 +113,8 @@ public: | ||
| 111 | virtual SrsConfDirective* get_gop_cache(std::string vhost); | 113 | virtual SrsConfDirective* get_gop_cache(std::string vhost); |
| 112 | virtual SrsConfDirective* get_hls(std::string vhost); | 114 | virtual SrsConfDirective* get_hls(std::string vhost); |
| 113 | virtual SrsConfDirective* get_hls_path(std::string vhost); | 115 | virtual SrsConfDirective* get_hls_path(std::string vhost); |
| 116 | + virtual SrsConfDirective* get_hls_fragment(std::string vhost); | ||
| 117 | + virtual SrsConfDirective* get_hls_window(std::string vhost); | ||
| 114 | virtual SrsConfDirective* get_refer(std::string vhost); | 118 | virtual SrsConfDirective* get_refer(std::string vhost); |
| 115 | virtual SrsConfDirective* get_refer_play(std::string vhost); | 119 | virtual SrsConfDirective* get_refer_play(std::string vhost); |
| 116 | virtual SrsConfDirective* get_refer_publish(std::string vhost); | 120 | virtual SrsConfDirective* get_refer_publish(std::string vhost); |
| @@ -370,6 +370,7 @@ SrsHLS::SrsHLS() | @@ -370,6 +370,7 @@ SrsHLS::SrsHLS() | ||
| 370 | jitter = new SrsRtmpJitter(); | 370 | jitter = new SrsRtmpJitter(); |
| 371 | file_index = 0; | 371 | file_index = 0; |
| 372 | m3u8_dts = stream_dts = 0; | 372 | m3u8_dts = stream_dts = 0; |
| 373 | + hls_fragment = hls_window = 0; | ||
| 373 | 374 | ||
| 374 | audio_buffer = new SrsCodecBuffer(); | 375 | audio_buffer = new SrsCodecBuffer(); |
| 375 | video_buffer = new SrsCodecBuffer(); | 376 | video_buffer = new SrsCodecBuffer(); |
| @@ -411,6 +412,23 @@ int SrsHLS::on_publish(std::string _vhost, std::string _app, std::string _stream | @@ -411,6 +412,23 @@ int SrsHLS::on_publish(std::string _vhost, std::string _app, std::string _stream | ||
| 411 | stream = _stream; | 412 | stream = _stream; |
| 412 | app = _app; | 413 | app = _app; |
| 413 | 414 | ||
| 415 | + // TODO: subscribe the reload event. | ||
| 416 | + | ||
| 417 | + SrsConfDirective* conf = NULL; | ||
| 418 | + if ((conf = config->get_hls_fragment(vhost)) != NULL && !conf->arg0().empty()) { | ||
| 419 | + hls_fragment = ::atoi(conf->arg0().c_str()); | ||
| 420 | + } | ||
| 421 | + if (hls_fragment <= 0) { | ||
| 422 | + hls_fragment = SRS_CONF_DEFAULT_HLS_FRAGMENT; | ||
| 423 | + } | ||
| 424 | + | ||
| 425 | + if ((conf = config->get_hls_window(vhost)) != NULL && !conf->arg0().empty()) { | ||
| 426 | + hls_window = ::atoi(conf->arg0().c_str()); | ||
| 427 | + } | ||
| 428 | + if (hls_window <= 0) { | ||
| 429 | + hls_window = SRS_CONF_DEFAULT_HLS_WINDOW; | ||
| 430 | + } | ||
| 431 | + | ||
| 414 | if ((ret = reopen()) != ERROR_SUCCESS) { | 432 | if ((ret = reopen()) != ERROR_SUCCESS) { |
| 415 | return ret; | 433 | return ret; |
| 416 | } | 434 | } |
| @@ -555,9 +573,7 @@ int SrsHLS::on_video(SrsSharedPtrMessage* video) | @@ -555,9 +573,7 @@ int SrsHLS::on_video(SrsSharedPtrMessage* video) | ||
| 555 | // reopen the muxer for a gop | 573 | // reopen the muxer for a gop |
| 556 | if (sample->frame_type == SrsCodecVideoAVCFrameKeyFrame) { | 574 | if (sample->frame_type == SrsCodecVideoAVCFrameKeyFrame) { |
| 557 | int64_t diff = stream_dts - m3u8_dts; | 575 | int64_t diff = stream_dts - m3u8_dts; |
| 558 | - // 10s. | ||
| 559 | - // TODO: config it. | ||
| 560 | - if (diff / 90000 >= 10) { | 576 | + if (diff / 90000 >= hls_fragment) { |
| 561 | if ((ret = reopen()) != ERROR_SUCCESS) { | 577 | if ((ret = reopen()) != ERROR_SUCCESS) { |
| 562 | return ret; | 578 | return ret; |
| 563 | } | 579 | } |
| @@ -603,12 +619,39 @@ int SrsHLS::reopen() | @@ -603,12 +619,39 @@ int SrsHLS::reopen() | ||
| 603 | segments.push_back(current); | 619 | segments.push_back(current); |
| 604 | current = NULL; | 620 | current = NULL; |
| 605 | 621 | ||
| 622 | + // the segments to remove | ||
| 623 | + std::vector<SrsM3u8Segment*> segment_to_remove; | ||
| 624 | + | ||
| 625 | + // shrink the segments. | ||
| 626 | + double duration = 0; | ||
| 627 | + std::vector<SrsM3u8Segment*>::reverse_iterator it; | ||
| 628 | + for (it = segments.rbegin(); it != segments.rend(); ++it) { | ||
| 629 | + SrsM3u8Segment* segment = *it; | ||
| 630 | + duration += segment->duration; | ||
| 631 | + | ||
| 632 | + if ((int)duration > hls_window) { | ||
| 633 | + segment_to_remove.push_back(segment); | ||
| 634 | + } | ||
| 635 | + } | ||
| 636 | + if (!segment_to_remove.empty()) { | ||
| 637 | + segments.erase(segments.begin(), segments.begin() + segment_to_remove.size()); | ||
| 638 | + } | ||
| 639 | + | ||
| 640 | + // refresh the m3u8, donot contains the removed ts | ||
| 606 | if ((ret = refresh_m3u8()) != ERROR_SUCCESS) { | 641 | if ((ret = refresh_m3u8()) != ERROR_SUCCESS) { |
| 607 | return ret; | 642 | return ret; |
| 608 | } | 643 | } |
| 644 | + | ||
| 645 | + // remove the ts file. | ||
| 646 | + for (it = segment_to_remove.rbegin(); it != segment_to_remove.rend(); ++it) { | ||
| 647 | + SrsM3u8Segment* segment = *it; | ||
| 648 | + unlink(segment->full_path.c_str()); | ||
| 649 | + srs_freep(segment); | ||
| 650 | + } | ||
| 609 | } | 651 | } |
| 610 | // new segment. | 652 | // new segment. |
| 611 | current = new SrsM3u8Segment(); | 653 | current = new SrsM3u8Segment(); |
| 654 | + current->sequence_no = file_index; | ||
| 612 | m3u8_dts = current->segment_start_dts = stream_dts; | 655 | m3u8_dts = current->segment_start_dts = stream_dts; |
| 613 | 656 | ||
| 614 | // generate filename. | 657 | // generate filename. |
| @@ -74,6 +74,8 @@ private: | @@ -74,6 +74,8 @@ private: | ||
| 74 | std::string stream; | 74 | std::string stream; |
| 75 | std::string app; | 75 | std::string app; |
| 76 | std::string hls_path; | 76 | std::string hls_path; |
| 77 | + int hls_fragment; | ||
| 78 | + int hls_window; | ||
| 77 | private: | 79 | private: |
| 78 | int file_index; | 80 | int file_index; |
| 79 | std::string m3u8; | 81 | std::string m3u8; |
-
请 注册 或 登录 后发表评论