正在显示
2 个修改的文件
包含
38 行增加
和
21 行删除
@@ -76,9 +76,10 @@ vhost dev { | @@ -76,9 +76,10 @@ vhost dev { | ||
76 | hls_path ./objs/nginx/html; | 76 | hls_path ./objs/nginx/html; |
77 | hls_fragment 5; | 77 | hls_fragment 5; |
78 | hls_window 30; | 78 | hls_window 30; |
79 | - forward 127.0.0.1:19350; | 79 | + #forward 127.0.0.1:19350; |
80 | + forward 127.0.0.1:1936; | ||
80 | transcode { | 81 | transcode { |
81 | - enabled on; | 82 | + enabled off; |
82 | ffmpeg ./objs/ffmpeg/bin/ffmpeg; | 83 | ffmpeg ./objs/ffmpeg/bin/ffmpeg; |
83 | engine dev { | 84 | engine dev { |
84 | enabled on; | 85 | enabled on; |
@@ -31,6 +31,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -31,6 +31,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
31 | #include <stdlib.h> | 31 | #include <stdlib.h> |
32 | #include <string.h> | 32 | #include <string.h> |
33 | 33 | ||
34 | +#include <algorithm> | ||
35 | + | ||
34 | #include <srs_core_error.hpp> | 36 | #include <srs_core_error.hpp> |
35 | #include <srs_core_codec.hpp> | 37 | #include <srs_core_codec.hpp> |
36 | #include <srs_core_amf0.hpp> | 38 | #include <srs_core_amf0.hpp> |
@@ -704,6 +706,7 @@ int SrsHls::reopen() | @@ -704,6 +706,7 @@ int SrsHls::reopen() | ||
704 | hls_path = conf->arg0(); | 706 | hls_path = conf->arg0(); |
705 | } | 707 | } |
706 | 708 | ||
709 | + // TODO: create all parents dirs. | ||
707 | // create dir for app. | 710 | // create dir for app. |
708 | if ((ret = create_dir()) != ERROR_SUCCESS) { | 711 | if ((ret = create_dir()) != ERROR_SUCCESS) { |
709 | return ret; | 712 | return ret; |
@@ -712,10 +715,19 @@ int SrsHls::reopen() | @@ -712,10 +715,19 @@ int SrsHls::reopen() | ||
712 | // start new segment. | 715 | // start new segment. |
713 | if (current) { | 716 | if (current) { |
714 | current->duration = (stream_dts - current->segment_start_dts) / 90000.0; | 717 | current->duration = (stream_dts - current->segment_start_dts) / 90000.0; |
718 | + srs_assert(current->duration > 0); | ||
719 | + | ||
720 | + // assert segment duplicate. | ||
721 | + std::vector<SrsM3u8Segment*>::iterator it; | ||
722 | + it = std::find(segments.begin(), segments.end(), current); | ||
723 | + srs_assert(it == segments.end()); | ||
724 | + | ||
725 | + // valid, add to segments. | ||
715 | segments.push_back(current); | 726 | segments.push_back(current); |
716 | 727 | ||
717 | srs_trace("reap ts segment, sequence_no=%d, uri=%s, duration=%.2f, start=%"PRId64"", | 728 | srs_trace("reap ts segment, sequence_no=%d, uri=%s, duration=%.2f, start=%"PRId64"", |
718 | - current->sequence_no, current->uri.c_str(), current->duration, current->segment_start_dts); | 729 | + current->sequence_no, current->uri.c_str(), current->duration, |
730 | + current->segment_start_dts); | ||
719 | 731 | ||
720 | // close the muxer of finished segment. | 732 | // close the muxer of finished segment. |
721 | srs_freep(current->muxer); | 733 | srs_freep(current->muxer); |
@@ -726,31 +738,32 @@ int SrsHls::reopen() | @@ -726,31 +738,32 @@ int SrsHls::reopen() | ||
726 | 738 | ||
727 | // shrink the segments. | 739 | // shrink the segments. |
728 | double duration = 0; | 740 | double duration = 0; |
729 | - std::vector<SrsM3u8Segment*>::reverse_iterator it; | ||
730 | - for (it = segments.rbegin(); it != segments.rend(); ++it) { | ||
731 | - SrsM3u8Segment* segment = *it; | 741 | + int remove_index = -1; |
742 | + for (int i = segments.size() - 1; i >= 0; i--) { | ||
743 | + SrsM3u8Segment* segment = segments[i]; | ||
744 | + duration += segment->duration; | ||
732 | 745 | ||
733 | - // once find the overflow segment, clear all segments before it. | ||
734 | if ((int)duration > hls_window) { | 746 | if ((int)duration > hls_window) { |
735 | - segment_to_remove.push_back(segment); | ||
736 | - continue; | 747 | + remove_index = i; |
748 | + break; | ||
737 | } | 749 | } |
738 | - | ||
739 | - duration += segment->duration; | ||
740 | } | 750 | } |
741 | - if (!segment_to_remove.empty()) { | ||
742 | - segments.erase(segments.begin(), segments.begin() + segment_to_remove.size()); | ||
743 | - | ||
744 | - // refresh the m3u8, donot contains the removed ts | ||
745 | - ret = refresh_m3u8(); | 751 | + for (int i = 0; i < remove_index && !segments.empty(); i++) { |
752 | + SrsM3u8Segment* segment = *segments.begin(); | ||
753 | + segments.erase(segments.begin()); | ||
754 | + segment_to_remove.push_back(segment); | ||
746 | } | 755 | } |
747 | 756 | ||
757 | + // refresh the m3u8, donot contains the removed ts | ||
758 | + ret = refresh_m3u8(); | ||
759 | + | ||
748 | // remove the ts file. | 760 | // remove the ts file. |
749 | - for (it = segment_to_remove.rbegin(); it != segment_to_remove.rend(); ++it) { | ||
750 | - SrsM3u8Segment* segment = *it; | 761 | + for (int i = 0; i < (int)segment_to_remove.size(); i++) { |
762 | + SrsM3u8Segment* segment = segment_to_remove[i]; | ||
751 | unlink(segment->full_path.c_str()); | 763 | unlink(segment->full_path.c_str()); |
752 | srs_freep(segment); | 764 | srs_freep(segment); |
753 | } | 765 | } |
766 | + segment_to_remove.clear(); | ||
754 | 767 | ||
755 | // check ret of refresh m3u8 | 768 | // check ret of refresh m3u8 |
756 | if (ret != ERROR_SUCCESS) { | 769 | if (ret != ERROR_SUCCESS) { |
@@ -760,13 +773,15 @@ int SrsHls::reopen() | @@ -760,13 +773,15 @@ int SrsHls::reopen() | ||
760 | } | 773 | } |
761 | // new segment. | 774 | // new segment. |
762 | current = new SrsM3u8Segment(); | 775 | current = new SrsM3u8Segment(); |
763 | - current->sequence_no = file_index; | 776 | + current->sequence_no = file_index++; |
764 | m3u8_dts = current->segment_start_dts = stream_dts; | 777 | m3u8_dts = current->segment_start_dts = stream_dts; |
765 | 778 | ||
766 | // generate filename. | 779 | // generate filename. |
767 | char filename[128]; | 780 | char filename[128]; |
768 | - snprintf(filename, sizeof(filename), "%s-%d.ts", stream.c_str(), file_index++); | 781 | + snprintf(filename, sizeof(filename), |
782 | + "%s-%d.ts", stream.c_str(), current->sequence_no); | ||
769 | 783 | ||
784 | + // TODO: use temp file and rename it. | ||
770 | current->full_path = hls_path; | 785 | current->full_path = hls_path; |
771 | current->full_path += "/"; | 786 | current->full_path += "/"; |
772 | current->full_path += app; | 787 | current->full_path += app; |
@@ -780,7 +795,8 @@ int SrsHls::reopen() | @@ -780,7 +795,8 @@ int SrsHls::reopen() | ||
780 | srs_error("open hls muxer failed. ret=%d", ret); | 795 | srs_error("open hls muxer failed. ret=%d", ret); |
781 | return ret; | 796 | return ret; |
782 | } | 797 | } |
783 | - srs_info("open HLS muxer success. vhost=%s, path=%s", vhost.c_str(), current->full_path.c_str()); | 798 | + srs_info("open HLS muxer success. vhost=%s, path=%s", |
799 | + vhost.c_str(), current->full_path.c_str()); | ||
784 | 800 | ||
785 | // segment open, flush the audio. | 801 | // segment open, flush the audio. |
786 | // @see: ngx_rtmp_hls_open_fragment | 802 | // @see: ngx_rtmp_hls_open_fragment |
-
请 注册 或 登录 后发表评论