Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
胡斌
/
srs
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
winlin
2015-06-05 20:38:01 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
26b76c0e4cc9a360fa40a87c9f884941a2de0d75
26b76c0e
1 parent
679583da
fix #420, remove ts for hls ram mode.
隐藏空白字符变更
内嵌
并排对比
正在显示
7 个修改的文件
包含
111 行增加
和
29 行删除
README.md
trunk/src/app/srs_app_hls.cpp
trunk/src/app/srs_app_hls.hpp
trunk/src/app/srs_app_http_conn.cpp
trunk/src/app/srs_app_http_conn.hpp
trunk/src/app/srs_app_server.cpp
trunk/src/app/srs_app_server.hpp
README.md
查看文件 @
26b76c0
...
...
@@ -344,6 +344,7 @@ Remark:
### 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-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.
...
...
trunk/src/app/srs_app_hls.cpp
查看文件 @
26b76c0
...
...
@@ -787,12 +787,19 @@ int SrsHlsMuxer::segment_close(string log_desc)
for
(
int
i
=
0
;
i
<
(
int
)
segment_to_remove
.
size
();
i
++
)
{
SrsHlsSegment
*
segment
=
segment_to_remove
[
i
];
if
(
hls_cleanup
)
{
if
(
hls_cleanup
&&
should_write_file
)
{
if
(
unlink
(
segment
->
full_path
.
c_str
())
<
0
)
{
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
);
}
segment_to_remove
.
clear
();
...
...
trunk/src/app/srs_app_hls.hpp
查看文件 @
26b76c0
...
...
@@ -64,20 +64,25 @@ public:
virtual
~
ISrsHlsHandler
();
public
:
/**
* when publish stream
*/
* when publish stream
*/
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
;
/**
* when reap new ts file.
*/
* when reap new ts file.
*/
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
;
};
...
...
trunk/src/app/srs_app_http_conn.cpp
查看文件 @
26b76c0
...
...
@@ -1878,6 +1878,7 @@ int SrsHlsTsStream::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
SrsHlsEntry
::
SrsHlsEntry
()
{
tmpl
=
NULL
;
}
SrsHttpServer
::
SrsHttpServer
(
SrsServer
*
svr
)
...
...
@@ -1948,6 +1949,7 @@ int SrsHttpServer::initialize()
return
ret
;
}
// TODO: FIXME: rename for HTTP FLV mount.
int
SrsHttpServer
::
http_mount
(
SrsSource
*
s
,
SrsRequest
*
r
)
{
int
ret
=
ERROR_SUCCESS
;
...
...
@@ -2063,6 +2065,7 @@ int SrsHttpServer::hls_update_m3u8(SrsRequest* r, string m3u8)
}
SrsHlsEntry
*
tmpl
=
thls
[
r
->
vhost
];
srs_assert
(
tmpl
);
entry
=
new
SrsHlsEntry
();
mount
=
tmpl
->
mount
;
...
...
@@ -2075,6 +2078,7 @@ int SrsHttpServer::hls_update_m3u8(SrsRequest* r, string m3u8)
// remove the default vhost mount
mount
=
srs_string_replace
(
mount
,
SRS_CONSTS_RTMP_DEFAULT_VHOST
"/"
,
"/"
);
entry
->
tmpl
=
tmpl
;
entry
->
mount
=
mount
;
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
();
// when no hls mounted, i
gnore
.
// when no hls mounted, i
nit with empty m3u8
.
if
(
shls
.
find
(
sid
)
==
shls
.
end
())
{
return
ret
;
if
((
ret
=
hls_update_m3u8
(
r
,
""
))
!=
ERROR_SUCCESS
)
{
return
ret
;
}
}
SrsHlsEntry
*
entry
=
shls
[
sid
];
srs_assert
(
entry
);
srs_assert
(
entry
->
tmpl
);
std
::
string
mount
=
entry
->
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
;
std
::
string
mount
=
hls_mount_generate
(
r
,
uri
,
entry
->
tmpl
->
mount
);
if
(
entry
->
streams
.
find
(
mount
)
==
entry
->
streams
.
end
())
{
ISrsHttpHandler
*
he
=
new
SrsHlsTsStream
();
...
...
@@ -2156,6 +2146,40 @@ int SrsHttpServer::hls_update_ts(SrsRequest* r, string uri, string ts)
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
)
{
std
::
string
sid
=
r
->
get_stream_url
();
...
...
@@ -2423,6 +2447,30 @@ int SrsHttpServer::initialize_hls_streaming()
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
#ifdef SRS_AUTO_HTTP_CORE
...
...
trunk/src/app/srs_app_http_conn.hpp
查看文件 @
26b76c0
...
...
@@ -650,11 +650,15 @@ public:
/**
* the srs hls entry.
*/
// TODO: FIXME: use hte hls template and entry.
struct
SrsHlsEntry
{
// for template, the mount contains variables.
// for concrete stream, the mount is url to access.
std
::
string
mount
;
// the template to create the entry
SrsHlsEntry
*
tmpl
;
// key: the m3u8/ts file path.
// value: the http handler.
...
...
@@ -696,6 +700,7 @@ public:
virtual
int
mount_hls
(
SrsRequest
*
r
);
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_remove_ts
(
SrsRequest
*
r
,
std
::
string
uri
);
virtual
void
unmount_hls
(
SrsRequest
*
r
);
// interface ISrsReloadHandler.
public:
...
...
@@ -709,6 +714,7 @@ private:
virtual
int
initialize_static_file
();
virtual
int
initialize_flv_streaming
();
virtual
int
initialize_hls_streaming
();
virtual
std
::
string
hls_mount_generate
(
SrsRequest
*
r
,
std
::
string
uri
,
std
::
string
tmpl
);
};
#endif
...
...
trunk/src/app/srs_app_server.cpp
查看文件 @
26b76c0
...
...
@@ -1411,6 +1411,20 @@ int SrsServer::on_update_ts(SrsRequest* r, string uri, string ts)
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
ret
=
ERROR_SUCCESS
;
...
...
trunk/src/app/srs_app_server.hpp
查看文件 @
26b76c0
...
...
@@ -375,6 +375,7 @@ public:
virtual
int
on_hls_publish
(
SrsRequest
*
r
);
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_remove_ts
(
SrsRequest
*
r
,
std
::
string
uri
);
virtual
int
on_hls_unpublish
(
SrsRequest
*
r
);
};
...
...
请
注册
或
登录
后发表评论