diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp index c8237b808..45a7731c9 100644 --- a/trunk/src/app/srs_app_hls.cpp +++ b/trunk/src/app/srs_app_hls.cpp @@ -557,6 +557,12 @@ int SrsHlsMuxer::segment_open(int64_t segment_start_dts) current->uri += hls_entry_prefix; if (!hls_entry_prefix.empty() && !srs_string_ends_with(hls_entry_prefix, "/")) { current->uri += "/"; + + // add the http dir to uri. + string http_dir = srs_path_dirname(m3u8_url); + if (!http_dir.empty()) { + current->uri += http_dir + "/"; + } } current->uri += ts_url; diff --git a/trunk/src/app/srs_app_http_hooks.cpp b/trunk/src/app/srs_app_http_hooks.cpp index 50fc1aac7..013f8912c 100644 --- a/trunk/src/app/srs_app_http_hooks.cpp +++ b/trunk/src/app/srs_app_http_hooks.cpp @@ -39,6 +39,7 @@ using namespace std; #include #include #include +#include #define SRS_HTTP_RESPONSE_OK SRS_XSTR(ERROR_SUCCESS) @@ -315,6 +316,12 @@ int SrsHttpHooks::on_hls(int cid, string url, SrsRequest* req, string file, stri int client_id = cid; std::string cwd = _srs_config->cwd(); + // the ts_url is under the same dir of m3u8_url. + string prefix = srs_path_dirname(m3u8_url); + if (!prefix.empty() && !srs_string_is_http(ts_url)) { + ts_url = prefix + "/" + ts_url; + } + SrsJsonObject* obj = SrsJsonAny::object(); SrsAutoFree(SrsJsonObject, obj); @@ -358,7 +365,7 @@ int SrsHttpHooks::on_hls_notify(int cid, std::string url, SrsRequest* req, std:: int client_id = cid; std::string cwd = _srs_config->cwd(); - if (srs_string_starts_with(ts_url, "http://") || srs_string_starts_with(ts_url, "https://")) { + if (srs_string_is_http(ts_url)) { url = ts_url; } diff --git a/trunk/src/app/srs_app_utility.cpp b/trunk/src/app/srs_app_utility.cpp index 29ad90c6d..740a9f5f3 100644 --- a/trunk/src/app/srs_app_utility.cpp +++ b/trunk/src/app/srs_app_utility.cpp @@ -29,6 +29,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#include #ifdef SRS_OSX #include @@ -47,6 +48,7 @@ using namespace std; #include #include #include +#include // the longest time to wait for a process to quit. #define SRS_PROCESS_QUIT_TIMEOUT_MS 1000 @@ -1340,6 +1342,11 @@ string srs_get_peer_ip(int fd) return ip; } +bool srs_string_is_http(string url) +{ + return srs_string_starts_with(url, "http://", "https://"); +} + bool srs_is_digit_number(const string& str) { if (str.empty()) { diff --git a/trunk/src/app/srs_app_utility.hpp b/trunk/src/app/srs_app_utility.hpp index c20b92c3d..16de800b1 100644 --- a/trunk/src/app/srs_app_utility.hpp +++ b/trunk/src/app/srs_app_utility.hpp @@ -662,6 +662,9 @@ extern int srs_get_local_port(int fd); // where peer ip is the client public ip which connected to server. extern std::string srs_get_peer_ip(int fd); +// whether the url is starts with http:// or https:// +extern bool srs_string_is_http(std::string url); + // whether string is digit number // is_digit("1234567890") === true // is_digit("0123456789") === false diff --git a/trunk/src/main/srs_main_ingest_hls.cpp b/trunk/src/main/srs_main_ingest_hls.cpp index 109ac7e5e..5c3e23fc7 100644 --- a/trunk/src/main/srs_main_ingest_hls.cpp +++ b/trunk/src/main/srs_main_ingest_hls.cpp @@ -460,7 +460,7 @@ int SrsIngestSrsInput::parseM3u8(SrsHttpUri* url, double& td, double& duration) std::string m3u8_url = body.substr(0, pos); body = body.substr(pos + 1); - if (!srs_string_starts_with(m3u8_url, "http://")) { + if (!srs_string_is_http(m3u8_url)) { m3u8_url = srs_path_dirname(url->get_url()) + "/" + m3u8_url; } srs_trace("parse sub m3u8, url=%s", m3u8_url.c_str()); @@ -594,7 +594,7 @@ int SrsIngestSrsInput::SrsTsPiece::fetch(string m3u8) SrsHttpClient client; std::string ts_url = url; - if (!srs_string_starts_with(ts_url, "http://")) { + if (!srs_string_is_http(ts_url)) { ts_url = srs_path_dirname(m3u8) + "/" + url; }