1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-15 04:42:04 +00:00

Merge branch '2.0release' into develop

This commit is contained in:
winlin 2015-03-30 14:08:26 +08:00
commit 40f186ba82
5 changed files with 41 additions and 49 deletions

View file

@ -13,6 +13,7 @@ RMB 500-999
* [2015-xx-xx xx:xx] xxx * [2015-xx-xx xx:xx] xxx
RMB 100-499 RMB 100-499
* [2015-03-30 13:34] 扶凯
* [2015-03-29 11-07] 姚伟斌 * [2015-03-29 11-07] 姚伟斌
* [2015-03-14 20:21] 万伟 * [2015-03-14 20:21] 万伟
* [2015-03-11 09:44] 叶发养 * [2015-03-11 09:44] 叶发养

View file

@ -215,12 +215,21 @@ int SrsHlsMuxer::update_config(SrsRequest* r, string entry_prefix,
hls_entry_prefix = entry_prefix; hls_entry_prefix = entry_prefix;
hls_path = path; hls_path = path;
hls_m3u8_file = m3u8_file;
hls_ts_file = ts_file; hls_ts_file = ts_file;
hls_fragment = fragment; hls_fragment = fragment;
hls_aof_ratio = aof_ratio; hls_aof_ratio = aof_ratio;
hls_window = window; hls_window = window;
// generate the m3u8 dir and path.
m3u8 = path + "/" + m3u8_file;
m3u8 = srs_path_build_stream(m3u8, req->vhost, req->app, req->stream);
m3u8_dir = m3u8;
size_t pos = string::npos;
if ((pos = m3u8_dir.rfind("/")) != string::npos) {
m3u8_dir = m3u8_dir.substr(0, pos);
}
// we always keep the target duration increasing. // we always keep the target duration increasing.
int max_td = srs_max(target_duration, (int)(fragment * _srs_config->get_hls_td_ratio(r->vhost))); int max_td = srs_max(target_duration, (int)(fragment * _srs_config->get_hls_td_ratio(r->vhost)));
srs_info("hls update target duration %d=>%d, aof=%.2f", target_duration, max_td, aof_ratio); srs_info("hls update target duration %d=>%d, aof=%.2f", target_duration, max_td, aof_ratio);
@ -251,12 +260,6 @@ int SrsHlsMuxer::segment_open(int64_t segment_start_dts)
return ret; return ret;
} }
// TODO: create all parents dirs.
// create dir for app.
if (should_write_file && (ret = create_dir(current->full_path)) != ERROR_SUCCESS) {
return ret;
}
// when segment open, the current segment must be NULL. // when segment open, the current segment must be NULL.
srs_assert(!current); srs_assert(!current);
@ -304,16 +307,30 @@ int SrsHlsMuxer::segment_open(int64_t segment_start_dts)
ss << current->sequence_no; ss << current->sequence_no;
ts_file = srs_string_replace(ts_file, "[seq]", ss.str()); ts_file = srs_string_replace(ts_file, "[seq]", ss.str());
} }
// replace variables
current->full_path = hls_path + "/" + ts_file; current->full_path = hls_path + "/" + ts_file;
// the ts url, relative or absolute url.
std::string ts_url = current->full_path;
if (srs_string_starts_with(ts_url, m3u8_dir)) {
ts_url = ts_url.substr(m3u8_dir.length());
}
while (srs_string_starts_with(ts_url, "/")) {
ts_url = ts_url.substr(1);
}
current->uri += hls_entry_prefix; current->uri += hls_entry_prefix;
if (!hls_entry_prefix.empty() && !srs_string_ends_with(hls_entry_prefix, "/")) { if (!hls_entry_prefix.empty() && !srs_string_ends_with(hls_entry_prefix, "/")) {
current->uri += "/"; current->uri += "/";
} }
current->uri += ts_file; current->uri += ts_url;
// create dir recursively for hls.
if (should_write_file && (ret = srs_create_dir_recursively(m3u8_dir)) != ERROR_SUCCESS) {
srs_error("create app dir %s failed. ret=%d", m3u8_dir.c_str(), ret);
return ret;
}
srs_info("create app dir %s ok", m3u8_dir.c_str());
// open temp ts file.
std::string tmp_file = current->full_path + ".tmp"; std::string tmp_file = current->full_path + ".tmp";
if ((ret = current->muxer->open(tmp_file.c_str())) != ERROR_SUCCESS) { if ((ret = current->muxer->open(tmp_file.c_str())) != ERROR_SUCCESS) {
srs_error("open hls muxer failed. ret=%d", ret); srs_error("open hls muxer failed. ret=%d", ret);
@ -527,23 +544,16 @@ int SrsHlsMuxer::refresh_m3u8()
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
std::string m3u8_file = hls_path; std::string temp_m3u8 = m3u8 + ".temp";
m3u8_file += "/"; if ((ret = _refresh_m3u8(temp_m3u8)) == ERROR_SUCCESS) {
m3u8_file += hls_m3u8_file; if (should_write_file && rename(temp_m3u8.c_str(), m3u8.c_str()) < 0) {
m3u8_file = srs_path_build_stream(m3u8_file, req->vhost, req->app, req->stream);
m3u8 = m3u8_file;
m3u8_file += ".temp";
if ((ret = _refresh_m3u8(m3u8_file)) == ERROR_SUCCESS) {
if (should_write_file && rename(m3u8_file.c_str(), m3u8.c_str()) < 0) {
ret = ERROR_HLS_WRITE_FAILED; ret = ERROR_HLS_WRITE_FAILED;
srs_error("rename m3u8 file failed. %s => %s, ret=%d", m3u8_file.c_str(), m3u8.c_str(), ret); srs_error("rename m3u8 file failed. %s => %s, ret=%d", temp_m3u8.c_str(), m3u8.c_str(), ret);
} }
} }
// remove the temp file. // remove the temp file.
unlink(m3u8_file.c_str()); unlink(temp_m3u8.c_str());
return ret; return ret;
} }
@ -634,31 +644,6 @@ int SrsHlsMuxer::_refresh_m3u8(string m3u8_file)
return ret; return ret;
} }
int SrsHlsMuxer::create_dir(string filepath)
{
int ret = ERROR_SUCCESS;
if (!should_write_file) {
return ret;
}
std::string app_dir = filepath;
size_t pos = string::npos;
if ((pos = app_dir.rfind("/")) != string::npos) {
app_dir = app_dir.substr(0, pos);
}
// TODO: cleanup the dir when startup.
if ((ret = srs_create_dir_recursively(app_dir)) != ERROR_SUCCESS) {
srs_error("create app dir %s failed. ret=%d", app_dir.c_str(), ret);
return ret;
}
srs_info("create app dir %s ok", app_dir.c_str());
return ret;
}
SrsHlsCache::SrsHlsCache() SrsHlsCache::SrsHlsCache()
{ {
cache = new SrsTsCache(); cache = new SrsTsCache();

View file

@ -169,8 +169,8 @@ private:
private: private:
std::string hls_entry_prefix; std::string hls_entry_prefix;
std::string hls_path; std::string hls_path;
std::string hls_m3u8_file;
std::string hls_ts_file; std::string hls_ts_file;
std::string m3u8_dir;
double hls_aof_ratio; double hls_aof_ratio;
int hls_fragment; int hls_fragment;
int hls_window; int hls_window;
@ -244,7 +244,6 @@ public:
private: private:
virtual int refresh_m3u8(); virtual int refresh_m3u8();
virtual int _refresh_m3u8(std::string m3u8_file); virtual int _refresh_m3u8(std::string m3u8_file);
virtual int create_dir(std::string filepath);
}; };
/** /**

View file

@ -226,6 +226,11 @@ bool srs_string_ends_with(string str, string flag)
return str.rfind(flag) == str.length() - flag.length(); return str.rfind(flag) == str.length() - flag.length();
} }
bool srs_string_starts_with(string str, string flag)
{
return str.find(flag) == 0;
}
int srs_do_create_dir_recursively(string dir) int srs_do_create_dir_recursively(string dir)
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;

View file

@ -60,6 +60,8 @@ extern std::string srs_string_trim_start(std::string str, std::string trim_chars
extern std::string srs_string_remove(std::string str, std::string remove_chars); extern std::string srs_string_remove(std::string str, std::string remove_chars);
// whether string end with // whether string end with
extern bool srs_string_ends_with(std::string str, std::string flag); extern bool srs_string_ends_with(std::string str, std::string flag);
// whether string starts with
extern bool srs_string_starts_with(std::string str, std::string flag);
// create dir recursively // create dir recursively
extern int srs_create_dir_recursively(std::string dir); extern int srs_create_dir_recursively(std::string dir);