mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
fix #420, remove ts for hls ram mode.
This commit is contained in:
parent
679583dad6
commit
26b76c0e4c
7 changed files with 111 additions and 29 deletions
|
@ -344,6 +344,7 @@ Remark:
|
||||||
|
|
||||||
### SRS 2.0 history
|
### SRS 2.0 history
|
||||||
|
|
||||||
|
* v2.0, 2015-05-30, fix [#420](https://github.com/simple-rtmp-server/srs/issues/420) remove ts for hls ram mode.
|
||||||
* v2.0, 2015-05-30, fix [#209](https://github.com/simple-rtmp-server/srs/issues/209) cleanup hls when stop and timeout. 2.0.173.
|
* v2.0, 2015-05-30, fix [#209](https://github.com/simple-rtmp-server/srs/issues/209) cleanup hls when stop and timeout. 2.0.173.
|
||||||
* v2.0, 2015-05-29, fix [#409](https://github.com/simple-rtmp-server/srs/issues/409) support pure video hls. 2.0.172.
|
* v2.0, 2015-05-29, fix [#409](https://github.com/simple-rtmp-server/srs/issues/409) support pure video hls. 2.0.172.
|
||||||
* v2.0, 2015-05-28, support [srs-dolphin][srs-dolphin], the multiple-process SRS.
|
* v2.0, 2015-05-28, support [srs-dolphin][srs-dolphin], the multiple-process SRS.
|
||||||
|
|
|
@ -787,12 +787,19 @@ int SrsHlsMuxer::segment_close(string log_desc)
|
||||||
for (int i = 0; i < (int)segment_to_remove.size(); i++) {
|
for (int i = 0; i < (int)segment_to_remove.size(); i++) {
|
||||||
SrsHlsSegment* segment = segment_to_remove[i];
|
SrsHlsSegment* segment = segment_to_remove[i];
|
||||||
|
|
||||||
if (hls_cleanup) {
|
if (hls_cleanup && should_write_file) {
|
||||||
if (unlink(segment->full_path.c_str()) < 0) {
|
if (unlink(segment->full_path.c_str()) < 0) {
|
||||||
srs_warn("cleanup unlink path failed, file=%s.", segment->full_path.c_str());
|
srs_warn("cleanup unlink path failed, file=%s.", segment->full_path.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (should_write_cache) {
|
||||||
|
if ((ret = handler->on_remove_ts(req, segment->uri)) != ERROR_SUCCESS) {
|
||||||
|
srs_warn("remove the ts from ram hls failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
srs_freep(segment);
|
srs_freep(segment);
|
||||||
}
|
}
|
||||||
segment_to_remove.clear();
|
segment_to_remove.clear();
|
||||||
|
|
|
@ -64,20 +64,25 @@ public:
|
||||||
virtual ~ISrsHlsHandler();
|
virtual ~ISrsHlsHandler();
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* when publish stream
|
* when publish stream
|
||||||
*/
|
*/
|
||||||
virtual int on_hls_publish(SrsRequest* req) = 0;
|
virtual int on_hls_publish(SrsRequest* req) = 0;
|
||||||
/**
|
/**
|
||||||
* when update the m3u8 file.
|
* when update the m3u8 file.
|
||||||
*/
|
*/
|
||||||
virtual int on_update_m3u8(SrsRequest* r, std::string m3u8) = 0;
|
virtual int on_update_m3u8(SrsRequest* r, std::string m3u8) = 0;
|
||||||
/**
|
/**
|
||||||
* when reap new ts file.
|
* when reap new ts file.
|
||||||
*/
|
*/
|
||||||
virtual int on_update_ts(SrsRequest* r, std::string uri, std::string ts) = 0;
|
virtual int on_update_ts(SrsRequest* r, std::string uri, std::string ts) = 0;
|
||||||
/**
|
/**
|
||||||
* when unpublish stream
|
* when remove the specified ts file,
|
||||||
*/
|
* for the hls to remove the expired ts not in hls window.
|
||||||
|
*/
|
||||||
|
virtual int on_remove_ts(SrsRequest* r, std::string uri) = 0;
|
||||||
|
/**
|
||||||
|
* when unpublish stream
|
||||||
|
*/
|
||||||
virtual int on_hls_unpublish(SrsRequest* req) = 0;
|
virtual int on_hls_unpublish(SrsRequest* req) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1878,6 +1878,7 @@ int SrsHlsTsStream::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
||||||
|
|
||||||
SrsHlsEntry::SrsHlsEntry()
|
SrsHlsEntry::SrsHlsEntry()
|
||||||
{
|
{
|
||||||
|
tmpl = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsHttpServer::SrsHttpServer(SrsServer* svr)
|
SrsHttpServer::SrsHttpServer(SrsServer* svr)
|
||||||
|
@ -1948,6 +1949,7 @@ int SrsHttpServer::initialize()
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: FIXME: rename for HTTP FLV mount.
|
||||||
int SrsHttpServer::http_mount(SrsSource* s, SrsRequest* r)
|
int SrsHttpServer::http_mount(SrsSource* s, SrsRequest* r)
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
@ -2063,6 +2065,7 @@ int SrsHttpServer::hls_update_m3u8(SrsRequest* r, string m3u8)
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsHlsEntry* tmpl = thls[r->vhost];
|
SrsHlsEntry* tmpl = thls[r->vhost];
|
||||||
|
srs_assert(tmpl);
|
||||||
|
|
||||||
entry = new SrsHlsEntry();
|
entry = new SrsHlsEntry();
|
||||||
mount = tmpl->mount;
|
mount = tmpl->mount;
|
||||||
|
@ -2075,6 +2078,7 @@ int SrsHttpServer::hls_update_m3u8(SrsRequest* r, string m3u8)
|
||||||
// remove the default vhost mount
|
// remove the default vhost mount
|
||||||
mount = srs_string_replace(mount, SRS_CONSTS_RTMP_DEFAULT_VHOST"/", "/");
|
mount = srs_string_replace(mount, SRS_CONSTS_RTMP_DEFAULT_VHOST"/", "/");
|
||||||
|
|
||||||
|
entry->tmpl = tmpl;
|
||||||
entry->mount = mount;
|
entry->mount = mount;
|
||||||
shls[sid] = entry;
|
shls[sid] = entry;
|
||||||
|
|
||||||
|
@ -2109,32 +2113,18 @@ int SrsHttpServer::hls_update_ts(SrsRequest* r, string uri, string ts)
|
||||||
|
|
||||||
std::string sid = r->get_stream_url();
|
std::string sid = r->get_stream_url();
|
||||||
|
|
||||||
// when no hls mounted, ignore.
|
// when no hls mounted, init with empty m3u8.
|
||||||
if (shls.find(sid) == shls.end()) {
|
if (shls.find(sid) == shls.end()) {
|
||||||
return ret;
|
if ((ret = hls_update_m3u8(r, "")) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsHlsEntry* entry = shls[sid];
|
SrsHlsEntry* entry = shls[sid];
|
||||||
srs_assert(entry);
|
srs_assert(entry);
|
||||||
|
srs_assert(entry->tmpl);
|
||||||
|
|
||||||
std::string mount = entry->mount;
|
std::string mount = hls_mount_generate(r, uri, entry->tmpl->mount);
|
||||||
|
|
||||||
// the ts is relative from the m3u8, the same start dir.
|
|
||||||
size_t pos = string::npos;
|
|
||||||
if ((pos = mount.rfind("/")) != string::npos) {
|
|
||||||
mount = mount.substr(0, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
// replace the vhost variable
|
|
||||||
mount = srs_string_replace(mount, "[vhost]", r->vhost);
|
|
||||||
mount = srs_string_replace(mount, "[app]", r->app);
|
|
||||||
|
|
||||||
// remove the default vhost mount
|
|
||||||
mount = srs_string_replace(mount, SRS_CONSTS_RTMP_DEFAULT_VHOST"/", "/");
|
|
||||||
|
|
||||||
// mount with ts.
|
|
||||||
mount += "/";
|
|
||||||
mount += uri;
|
|
||||||
|
|
||||||
if (entry->streams.find(mount) == entry->streams.end()) {
|
if (entry->streams.find(mount) == entry->streams.end()) {
|
||||||
ISrsHttpHandler* he = new SrsHlsTsStream();
|
ISrsHttpHandler* he = new SrsHlsTsStream();
|
||||||
|
@ -2156,6 +2146,40 @@ int SrsHttpServer::hls_update_ts(SrsRequest* r, string uri, string ts)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SrsHttpServer::hls_remove_ts(SrsRequest* r, string uri)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
std::string sid = r->get_stream_url();
|
||||||
|
|
||||||
|
// when no hls mounted, ignore.
|
||||||
|
if (shls.find(sid) == shls.end()) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
SrsHlsEntry* entry = shls[sid];
|
||||||
|
srs_assert(entry);
|
||||||
|
srs_assert(entry->tmpl);
|
||||||
|
|
||||||
|
std::string mount = hls_mount_generate(r, uri, entry->tmpl->mount);
|
||||||
|
|
||||||
|
// ignore when no ts mounted.
|
||||||
|
if (entry->streams.find(mount) == entry->streams.end()) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update the ts stream.
|
||||||
|
SrsHlsTsStream* hts = dynamic_cast<SrsHlsTsStream*>(entry->streams[mount]);
|
||||||
|
if (hts) {
|
||||||
|
hts->set_ts("");
|
||||||
|
// TODO: FIXME: unmount and remove the http handler.
|
||||||
|
}
|
||||||
|
srs_trace("hls remove ts ok, mount=%s", mount.c_str());
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void SrsHttpServer::unmount_hls(SrsRequest* r)
|
void SrsHttpServer::unmount_hls(SrsRequest* r)
|
||||||
{
|
{
|
||||||
std::string sid = r->get_stream_url();
|
std::string sid = r->get_stream_url();
|
||||||
|
@ -2423,6 +2447,30 @@ int SrsHttpServer::initialize_hls_streaming()
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string SrsHttpServer::hls_mount_generate(SrsRequest* r, string uri, string tmpl)
|
||||||
|
{
|
||||||
|
std::string mount = tmpl;
|
||||||
|
|
||||||
|
// the ts is relative from the m3u8, the same start dir.
|
||||||
|
size_t pos = string::npos;
|
||||||
|
if ((pos = mount.rfind("/")) != string::npos) {
|
||||||
|
mount = mount.substr(0, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
// replace the vhost variable
|
||||||
|
mount = srs_string_replace(mount, "[vhost]", r->vhost);
|
||||||
|
mount = srs_string_replace(mount, "[app]", r->app);
|
||||||
|
|
||||||
|
// remove the default vhost mount
|
||||||
|
mount = srs_string_replace(mount, SRS_CONSTS_RTMP_DEFAULT_VHOST"/", "/");
|
||||||
|
|
||||||
|
// mount with ts.
|
||||||
|
mount += "/";
|
||||||
|
mount += uri;
|
||||||
|
|
||||||
|
return mount;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SRS_AUTO_HTTP_CORE
|
#ifdef SRS_AUTO_HTTP_CORE
|
||||||
|
|
|
@ -650,11 +650,15 @@ public:
|
||||||
/**
|
/**
|
||||||
* the srs hls entry.
|
* the srs hls entry.
|
||||||
*/
|
*/
|
||||||
|
// TODO: FIXME: use hte hls template and entry.
|
||||||
struct SrsHlsEntry
|
struct SrsHlsEntry
|
||||||
{
|
{
|
||||||
// for template, the mount contains variables.
|
// for template, the mount contains variables.
|
||||||
// for concrete stream, the mount is url to access.
|
// for concrete stream, the mount is url to access.
|
||||||
std::string mount;
|
std::string mount;
|
||||||
|
|
||||||
|
// the template to create the entry
|
||||||
|
SrsHlsEntry* tmpl;
|
||||||
|
|
||||||
// key: the m3u8/ts file path.
|
// key: the m3u8/ts file path.
|
||||||
// value: the http handler.
|
// value: the http handler.
|
||||||
|
@ -696,6 +700,7 @@ public:
|
||||||
virtual int mount_hls(SrsRequest* r);
|
virtual int mount_hls(SrsRequest* r);
|
||||||
virtual int hls_update_m3u8(SrsRequest* r, std::string m3u8);
|
virtual int hls_update_m3u8(SrsRequest* r, std::string m3u8);
|
||||||
virtual int hls_update_ts(SrsRequest* r, std::string uri, std::string ts);
|
virtual int hls_update_ts(SrsRequest* r, std::string uri, std::string ts);
|
||||||
|
virtual int hls_remove_ts(SrsRequest* r, std::string uri);
|
||||||
virtual void unmount_hls(SrsRequest* r);
|
virtual void unmount_hls(SrsRequest* r);
|
||||||
// interface ISrsReloadHandler.
|
// interface ISrsReloadHandler.
|
||||||
public:
|
public:
|
||||||
|
@ -709,6 +714,7 @@ private:
|
||||||
virtual int initialize_static_file();
|
virtual int initialize_static_file();
|
||||||
virtual int initialize_flv_streaming();
|
virtual int initialize_flv_streaming();
|
||||||
virtual int initialize_hls_streaming();
|
virtual int initialize_hls_streaming();
|
||||||
|
virtual std::string hls_mount_generate(SrsRequest* r, std::string uri, std::string tmpl);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1411,6 +1411,20 @@ int SrsServer::on_update_ts(SrsRequest* r, string uri, string ts)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SrsServer::on_remove_ts(SrsRequest* r, string uri)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
#ifdef SRS_AUTO_HTTP_SERVER
|
||||||
|
if ((ret = http_stream_mux->hls_remove_ts(r, uri)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int SrsServer::on_hls_unpublish(SrsRequest* r)
|
int SrsServer::on_hls_unpublish(SrsRequest* r)
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
|
@ -375,6 +375,7 @@ public:
|
||||||
virtual int on_hls_publish(SrsRequest* r);
|
virtual int on_hls_publish(SrsRequest* r);
|
||||||
virtual int on_update_m3u8(SrsRequest* r, std::string m3u8);
|
virtual int on_update_m3u8(SrsRequest* r, std::string m3u8);
|
||||||
virtual int on_update_ts(SrsRequest* r, std::string uri, std::string ts);
|
virtual int on_update_ts(SrsRequest* r, std::string uri, std::string ts);
|
||||||
|
virtual int on_remove_ts(SrsRequest* r, std::string uri);
|
||||||
virtual int on_hls_unpublish(SrsRequest* r);
|
virtual int on_hls_unpublish(SrsRequest* r);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue