Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
4f072eb3
Commit
4f072eb3
authored
Feb 06, 2018
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加踢出推流器功能
parent
cf8b6f6b
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
49 行增加
和
9 行删除
+49
-9
src/Common/MediaSource.h
+28
-0
src/MediaFile/MediaReader.cpp
+4
-0
src/MediaFile/MediaReader.h
+1
-0
src/Rtmp/RtmpSession.cpp
+3
-2
src/Rtmp/RtmpSession.h
+7
-1
src/Rtsp/Rtsp.h
+6
-6
没有找到文件。
src/Common/MediaSource.h
查看文件 @
4f072eb3
...
...
@@ -55,11 +55,17 @@ public:
virtual
~
MediaSourceEvent
(){};
public
:
virtual
bool
seekTo
(
uint32_t
ui32Stamp
){
//拖动进度条
return
false
;
}
virtual
uint32_t
getStamp
()
{
//获取时间戳
return
0
;
}
virtual
bool
shutDown
()
{
//通知其停止推流
return
false
;
}
};
class
MediaInfo
{
...
...
@@ -151,9 +157,30 @@ public:
}
return
listener
->
getStamp
();
}
bool
shutDown
()
{
auto
listener
=
m_listener
.
lock
();
if
(
!
listener
){
return
false
;
}
return
listener
->
shutDown
();
}
void
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
){
m_listener
=
listener
;
}
template
<
typename
FUN
>
static
void
for_each_media
(
FUN
&&
fun
){
lock_guard
<
recursive_mutex
>
lock
(
g_mtxMediaSrc
);
for
(
auto
&
pr0
:
g_mapMediaSrc
){
for
(
auto
&
pr1
:
pr0
.
second
){
for
(
auto
&
pr2
:
pr1
.
second
){
for
(
auto
&
pr3
:
pr2
.
second
){
fun
(
pr0
.
first
,
pr1
.
first
,
pr2
.
first
,
pr3
.
first
,
pr3
.
second
.
lock
());
}
}
}
}
}
private
:
template
<
typename
FUN
>
static
bool
searchMedia
(
const
string
&
schema
,
...
...
@@ -195,6 +222,7 @@ private:
}
}
};
void
unregisted
();
protected
:
std
::
weak_ptr
<
MediaSourceEvent
>
m_listener
;
...
...
src/MediaFile/MediaReader.cpp
查看文件 @
4f072eb3
...
...
@@ -181,6 +181,10 @@ void MediaReader::startReadMP4() {
uint32_t
MediaReader
::
getStamp
()
{
return
m_iSeekTime
+
m_ticker
.
elapsedTime
();
}
bool
MediaReader
::
shutDown
(){
AsyncTaskThread
::
Instance
().
CancelTask
(
reinterpret_cast
<
uint64_t
>
(
this
));
return
true
;
}
bool
MediaReader
::
readSample
(
int
iTimeInc
)
{
TimeTicker
();
...
...
src/MediaFile/MediaReader.h
查看文件 @
4f072eb3
...
...
@@ -51,6 +51,7 @@ public:
public
:
bool
seekTo
(
uint32_t
ui32Stamp
)
override
;
uint32_t
getStamp
()
override
;
bool
shutDown
()
override
;
private
:
#ifdef ENABLE_MP4V2
...
...
src/Rtmp/RtmpSession.cpp
查看文件 @
4f072eb3
...
...
@@ -145,7 +145,7 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) {
sendReply
(
"onStatus"
,
nullptr
,
status
);
if
(
!
ok
)
{
WarnL
<<
"onPublish:"
<<
(
authSuccess
?
"Already publishing:"
:
err
.
data
())
<<
(
authSuccess
?
"Already publishing:"
:
err
.
data
())
<<
" "
<<
m_mediaInfo
.
m_vhost
<<
" "
<<
m_mediaInfo
.
m_app
<<
" "
<<
m_mediaInfo
.
m_streamid
<<
endl
;
...
...
@@ -154,6 +154,7 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) {
}
m_bPublisherSrcRegisted
=
false
;
m_pPublisherSrc
.
reset
(
new
RtmpToRtspMediaSource
(
m_mediaInfo
.
m_vhost
,
m_mediaInfo
.
m_app
,
m_mediaInfo
.
m_streamid
));
m_pPublisherSrc
->
setListener
(
dynamic_pointer_cast
<
MediaSourceEvent
>
(
shared_from_this
()));
};
weak_ptr
<
RtmpSession
>
weakSelf
=
dynamic_pointer_cast
<
RtmpSession
>
(
shared_from_this
());
...
...
@@ -213,7 +214,7 @@ void RtmpSession::doPlay(AMFDecoder &dec){
sendReply
(
"onStatus"
,
nullptr
,
status
);
if
(
!
ok
)
{
WarnL
<<
"onPlayed:"
<<
(
authSuccess
?
"No such stream:"
:
err
.
data
())
<<
(
authSuccess
?
"No such stream:"
:
err
.
data
())
<<
" "
<<
m_mediaInfo
.
m_vhost
<<
" "
<<
m_mediaInfo
.
m_app
<<
" "
<<
m_mediaInfo
.
m_streamid
...
...
src/Rtmp/RtmpSession.h
查看文件 @
4f072eb3
...
...
@@ -44,7 +44,7 @@ using namespace ZL::Network;
namespace
ZL
{
namespace
Rtmp
{
class
RtmpSession
:
public
TcpLimitedSession
<
MAX_TCP_SESSION
>
,
public
RtmpProtocol
{
class
RtmpSession
:
public
TcpLimitedSession
<
MAX_TCP_SESSION
>
,
public
RtmpProtocol
,
public
MediaSourceEvent
{
public
:
typedef
std
::
shared_ptr
<
RtmpSession
>
Ptr
;
RtmpSession
(
const
std
::
shared_ptr
<
ThreadPool
>
&
_th
,
const
Socket
::
Ptr
&
_sock
);
...
...
@@ -95,6 +95,12 @@ private:
invoke
<<
str
<<
m_dNowReqID
<<
reply
<<
status
;
sendResponse
(
MSG_CMD
,
invoke
.
data
());
}
bool
shutDown
()
override
{
InfoL
<<
"kick out:"
<<
m_mediaInfo
.
m_vhost
<<
" "
<<
m_mediaInfo
.
m_app
<<
" "
<<
m_mediaInfo
.
m_streamid
;
safeShutdown
();
return
true
;
}
};
}
/* namespace Rtmp */
...
...
src/Rtsp/Rtsp.h
查看文件 @
4f072eb3
...
...
@@ -114,7 +114,7 @@ public:
auto
field
=
FindField
(
line
.
c_str
(),
NULL
,
": "
);
auto
value
=
FindField
(
line
.
c_str
(),
": "
,
NULL
);
if
(
field
.
size
()
!=
0
)
{
m_map
Value
s
[
field
]
=
value
;
m_map
Header
s
[
field
]
=
value
;
}
}
start
=
start
+
line
.
size
()
+
2
;
...
...
@@ -142,8 +142,8 @@ public:
}
const
string
&
operator
[](
const
char
*
name
)
const
{
//rtsp field
auto
it
=
m_map
Value
s
.
find
(
name
);
if
(
it
==
m_map
Value
s
.
end
())
{
auto
it
=
m_map
Header
s
.
find
(
name
);
if
(
it
==
m_map
Header
s
.
end
())
{
return
m_strNull
;
}
return
it
->
second
;
...
...
@@ -157,7 +157,7 @@ public:
m_strFullUrl
.
clear
();
m_strTail
.
clear
();
m_strContent
.
clear
();
m_map
Value
s
.
clear
();
m_map
Header
s
.
clear
();
m_mapUrlArgs
.
clear
();
}
...
...
@@ -169,7 +169,7 @@ public:
}
StrCaseMap
&
getValues
()
const
{
return
m_map
Value
s
;
return
m_map
Header
s
;
}
StrCaseMap
&
getUrlArgs
()
const
{
return
m_mapUrlArgs
;
...
...
@@ -195,7 +195,7 @@ private:
string
m_strContent
;
string
m_strNull
;
string
m_strFullUrl
;
mutable
StrCaseMap
m_map
Value
s
;
mutable
StrCaseMap
m_map
Header
s
;
mutable
StrCaseMap
m_mapUrlArgs
;
};
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论