mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Fix SrsHlsMuxer::segment_close bug, reopen segment when close failed.
This commit is contained in:
parent
d306ee7506
commit
1626942d29
3 changed files with 22 additions and 3 deletions
|
@ -143,9 +143,12 @@ srs_error_t SrsFragment::rename()
|
||||||
ss << tempdur;
|
ss << tempdur;
|
||||||
full_path = srs_string_replace(full_path, "[duration]", ss.str());
|
full_path = srs_string_replace(full_path, "[duration]", ss.str());
|
||||||
}
|
}
|
||||||
if (::rename(tmp_file.c_str(), full_path.c_str()) < 0) {
|
|
||||||
|
int r0 = ::rename(tmp_file.c_str(), full_path.c_str());
|
||||||
|
if (r0 < 0) {
|
||||||
return srs_error_new(ERROR_SYSTEM_FRAGMENT_RENAME, "rename %s to %s", tmp_file.c_str(), full_path.c_str());
|
return srs_error_new(ERROR_SYSTEM_FRAGMENT_RENAME, "rename %s to %s", tmp_file.c_str(), full_path.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
filepath = full_path;
|
filepath = full_path;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -575,6 +575,16 @@ srs_error_t SrsHlsMuxer::flush_video(SrsTsMessageCache* cache)
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsHlsMuxer::segment_close()
|
srs_error_t SrsHlsMuxer::segment_close()
|
||||||
|
{
|
||||||
|
srs_error_t err = do_segment_close();
|
||||||
|
|
||||||
|
// We always cleanup current segment.
|
||||||
|
srs_freep(current);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_error_t SrsHlsMuxer::do_segment_close()
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
@ -614,7 +624,6 @@ srs_error_t SrsHlsMuxer::segment_close()
|
||||||
|
|
||||||
// rename from tmp to real path
|
// rename from tmp to real path
|
||||||
if ((err = current->rename()) != srs_success) {
|
if ((err = current->rename()) != srs_success) {
|
||||||
srs_freep(current);
|
|
||||||
return srs_error_wrap(err, "rename");
|
return srs_error_wrap(err, "rename");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -631,7 +640,6 @@ srs_error_t SrsHlsMuxer::segment_close()
|
||||||
if ((err = current->unlink_tmpfile()) != srs_success) {
|
if ((err = current->unlink_tmpfile()) != srs_success) {
|
||||||
return srs_error_wrap(err, "rename");
|
return srs_error_wrap(err, "rename");
|
||||||
}
|
}
|
||||||
srs_freep(current);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// shrink the segments.
|
// shrink the segments.
|
||||||
|
@ -1013,6 +1021,13 @@ srs_error_t SrsHlsController::reap_segment()
|
||||||
|
|
||||||
// close current ts.
|
// close current ts.
|
||||||
if ((err = muxer->segment_close()) != srs_success) {
|
if ((err = muxer->segment_close()) != srs_success) {
|
||||||
|
// When close segment error, we must reopen it for next packet to write.
|
||||||
|
srs_error_t r0 = muxer->segment_open();
|
||||||
|
if (r0 != srs_success) {
|
||||||
|
srs_warn("close segment err %s", srs_error_desc(r0).c_str());
|
||||||
|
srs_freep(r0);
|
||||||
|
}
|
||||||
|
|
||||||
return srs_error_wrap(err, "hls: segment close");
|
return srs_error_wrap(err, "hls: segment close");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -236,6 +236,7 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual srs_error_t segment_close();
|
virtual srs_error_t segment_close();
|
||||||
private:
|
private:
|
||||||
|
virtual srs_error_t do_segment_close();
|
||||||
virtual srs_error_t write_hls_key();
|
virtual srs_error_t write_hls_key();
|
||||||
virtual srs_error_t refresh_m3u8();
|
virtual srs_error_t refresh_m3u8();
|
||||||
virtual srs_error_t _refresh_m3u8(std::string m3u8_file);
|
virtual srs_error_t _refresh_m3u8(std::string m3u8_file);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue