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
38a00264
Commit
38a00264
authored
4 years ago
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修复FFmpeg拉流代理功能缺陷的问题:#533
parent
67e49cb6
隐藏空白字符变更
内嵌
并排
正在显示
11 个修改的文件
包含
71 行增加
和
24 行删除
+71
-24
server/FFmpegSource.cpp
+4
-10
src/Common/MediaSource.cpp
+24
-2
src/Common/MediaSource.h
+6
-3
src/Common/MultiMediaSourceMuxer.cpp
+2
-2
src/FMP4/FMP4MediaSourceMuxer.h
+1
-1
src/Record/HlsRecorder.h
+1
-1
src/Rtmp/RtmpMediaSourceImp.h
+15
-1
src/Rtmp/RtmpMediaSourceMuxer.h
+1
-1
src/Rtsp/RtspMediaSourceImp.h
+15
-1
src/Rtsp/RtspMediaSourceMuxer.h
+1
-1
src/TS/TSMediaSourceMuxer.h
+1
-1
没有找到文件。
server/FFmpegSource.cpp
查看文件 @
38a00264
...
...
@@ -233,7 +233,7 @@ void FFmpegSource::setOnClose(const function<void()> &cb){
}
bool
FFmpegSource
::
close
(
MediaSource
&
sender
,
bool
force
)
{
auto
listener
=
_listener
.
lock
();
auto
listener
=
getDelegate
();
if
(
listener
&&
!
listener
->
close
(
sender
,
force
)){
//关闭失败
return
false
;
...
...
@@ -258,17 +258,11 @@ std::shared_ptr<SockInfo> FFmpegSource::getOriginSock(MediaSource &sender) const
}
void
FFmpegSource
::
onGetMediaSource
(
const
MediaSource
::
Ptr
&
src
)
{
auto
listener
=
src
->
getListener
();
auto
listener
=
src
->
getListener
(
true
);
if
(
listener
.
lock
().
get
()
!=
this
)
{
//防止多次进入onGetMediaSource函数导致无
效
递归调用的bug
_listener
=
listener
;
//防止多次进入onGetMediaSource函数导致无
限
递归调用的bug
setDelegate
(
listener
)
;
src
->
setListener
(
shared_from_this
());
}
else
{
WarnL
<<
"多次触发onGetMediaSource事件:"
<<
src
->
getSchema
()
<<
"/"
<<
src
->
getVhost
()
<<
"/"
<<
src
->
getApp
()
<<
"/"
<<
src
->
getId
();
}
}
...
...
This diff is collapsed.
Click to expand it.
src/Common/MediaSource.cpp
查看文件 @
38a00264
...
...
@@ -92,8 +92,19 @@ void MediaSource::setListener(const std::weak_ptr<MediaSourceEvent> &listener){
_listener
=
listener
;
}
const
std
::
weak_ptr
<
MediaSourceEvent
>&
MediaSource
::
getListener
()
const
{
return
_listener
;
std
::
weak_ptr
<
MediaSourceEvent
>
MediaSource
::
getListener
(
bool
next
)
const
{
if
(
!
next
)
{
return
_listener
;
}
auto
listener
=
dynamic_pointer_cast
<
MediaSourceEventInterceptor
>
(
_listener
.
lock
());
if
(
!
listener
)
{
//不是MediaSourceEventInterceptor对象或者对象已经销毁
return
_listener
;
}
//获取被拦截的对象
auto
next_obj
=
listener
->
getDelegate
();
//有则返回之
return
next_obj
?
next_obj
:
_listener
;
}
int
MediaSource
::
totalReaderCount
(){
...
...
@@ -644,6 +655,17 @@ bool MediaSourceEventInterceptor::stopSendRtp(MediaSource &sender){
return
false
;
}
void
MediaSourceEventInterceptor
::
setDelegate
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
)
{
if
(
listener
.
lock
().
get
()
==
this
)
{
throw
std
::
invalid_argument
(
"can not set self as a delegate"
);
}
_listener
=
listener
;
}
std
::
shared_ptr
<
MediaSourceEvent
>
MediaSourceEventInterceptor
::
getDelegate
()
const
{
return
_listener
.
lock
();
}
/////////////////////////////////////FlushPolicy//////////////////////////////////////
static
bool
isFlushAble_default
(
bool
is_video
,
uint64_t
last_stamp
,
uint64_t
new_stamp
,
int
cache_size
)
{
...
...
This diff is collapsed.
Click to expand it.
src/Common/MediaSource.h
查看文件 @
38a00264
...
...
@@ -97,6 +97,9 @@ public:
MediaSourceEventInterceptor
(){}
~
MediaSourceEventInterceptor
()
override
{}
void
setDelegate
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
);
std
::
shared_ptr
<
MediaSourceEvent
>
getDelegate
()
const
;
MediaOriginType
getOriginType
(
MediaSource
&
sender
)
const
override
;
string
getOriginUrl
(
MediaSource
&
sender
)
const
override
;
std
::
shared_ptr
<
SockInfo
>
getOriginSock
(
MediaSource
&
sender
)
const
override
;
...
...
@@ -112,7 +115,7 @@ public:
void
startSendRtp
(
MediaSource
&
sender
,
const
string
&
dst_url
,
uint16_t
dst_port
,
uint32_t
ssrc
,
bool
is_udp
,
const
function
<
void
(
const
SockException
&
ex
)
>
&
cb
)
override
;
bool
stopSendRtp
(
MediaSource
&
sender
)
override
;
pr
otected
:
pr
ivate
:
std
::
weak_ptr
<
MediaSourceEvent
>
_listener
;
};
...
...
@@ -226,9 +229,9 @@ public:
////////////////MediaSourceEvent相关接口实现////////////////
// 设置监听者
void
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
);
v
irtual
v
oid
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
);
// 获取监听者
const
std
::
weak_ptr
<
MediaSourceEvent
>&
getListener
(
)
const
;
std
::
weak_ptr
<
MediaSourceEvent
>
getListener
(
bool
next
=
false
)
const
;
// 本协议获取观看者个数,可能返回本协议的观看人数,也可能返回总人数
virtual
int
readerCount
()
=
0
;
...
...
This diff is collapsed.
Click to expand it.
src/Common/MultiMediaSourceMuxer.cpp
查看文件 @
38a00264
...
...
@@ -291,7 +291,7 @@ MultiMediaSourceMuxer::MultiMediaSourceMuxer(const string &vhost, const string &
}
void
MultiMediaSourceMuxer
::
setMediaListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
)
{
_listener
=
listener
;
setDelegate
(
listener
)
;
//拦截事件
_muxer
->
setMediaListener
(
shared_from_this
());
}
...
...
@@ -313,7 +313,7 @@ vector<Track::Ptr> MultiMediaSourceMuxer::getTracks(MediaSource &sender, bool tr
}
int
MultiMediaSourceMuxer
::
totalReaderCount
(
MediaSource
&
sender
)
{
auto
listener
=
_listener
.
lock
();
auto
listener
=
getDelegate
();
if
(
!
listener
)
{
return
totalReaderCount
();
}
...
...
This diff is collapsed.
Click to expand it.
src/FMP4/FMP4MediaSourceMuxer.h
查看文件 @
38a00264
...
...
@@ -32,7 +32,7 @@ public:
~
FMP4MediaSourceMuxer
()
override
=
default
;
void
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
){
_listener
=
listener
;
setDelegate
(
listener
)
;
_media_src
->
setListener
(
shared_from_this
());
}
...
...
This diff is collapsed.
Click to expand it.
src/Record/HlsRecorder.h
查看文件 @
38a00264
...
...
@@ -34,7 +34,7 @@ public:
}
void
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
)
{
_listener
=
listener
;
setDelegate
(
listener
)
;
_hls
->
getMediaSource
()
->
setListener
(
shared_from_this
());
//先注册媒体流,后续可以按需生成
_hls
->
getMediaSource
()
->
registHls
(
false
);
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/RtmpMediaSourceImp.h
查看文件 @
38a00264
...
...
@@ -86,7 +86,7 @@ public:
_muxer
->
setMediaListener
(
getListener
());
_muxer
->
setTrackListener
(
static_pointer_cast
<
RtmpMediaSourceImp
>
(
shared_from_this
()));
//让_muxer对象拦截一部分事件(比如说录像相关事件)
setListener
(
_muxer
);
MediaSource
::
setListener
(
_muxer
);
for
(
auto
&
track
:
_demuxer
->
getTracks
(
false
)){
_muxer
->
addTrack
(
track
);
...
...
@@ -119,6 +119,20 @@ public:
}
}
/**
* 设置事件监听器
* @param listener 监听器
*/
void
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
)
override
{
if
(
_muxer
)
{
//_muxer对象不能处理的事件再给listener处理
_muxer
->
setMediaListener
(
listener
);
}
else
{
//未创建_muxer对象,事件全部给listener处理
MediaSource
::
setListener
(
listener
);
}
}
private
:
bool
_all_track_ready
=
false
;
bool
_recreate_metadata
=
false
;
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/RtmpMediaSourceMuxer.h
查看文件 @
38a00264
...
...
@@ -32,7 +32,7 @@ public:
~
RtmpMediaSourceMuxer
()
override
{}
void
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
){
_listener
=
listener
;
setDelegate
(
listener
)
;
_media_src
->
setListener
(
shared_from_this
());
}
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/RtspMediaSourceImp.h
查看文件 @
38a00264
...
...
@@ -77,7 +77,7 @@ public:
_muxer
->
setMediaListener
(
getListener
());
_muxer
->
setTrackListener
(
static_pointer_cast
<
RtspMediaSourceImp
>
(
shared_from_this
()));
//让_muxer对象拦截一部分事件(比如说录像相关事件)
setListener
(
_muxer
);
MediaSource
::
setListener
(
_muxer
);
for
(
auto
&
track
:
_demuxer
->
getTracks
(
false
)){
_muxer
->
addTrack
(
track
);
...
...
@@ -102,6 +102,20 @@ public:
_all_track_ready
=
true
;
}
/**
* 设置事件监听器
* @param listener 监听器
*/
void
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
)
override
{
if
(
_muxer
)
{
//_muxer对象不能处理的事件再给listener处理
_muxer
->
setMediaListener
(
listener
);
}
else
{
//未创建_muxer对象,事件全部给listener处理
MediaSource
::
setListener
(
listener
);
}
}
private
:
RtspDemuxer
::
Ptr
_demuxer
;
MultiMediaSourceMuxer
::
Ptr
_muxer
;
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/RtspMediaSourceMuxer.h
查看文件 @
38a00264
...
...
@@ -32,7 +32,7 @@ public:
~
RtspMediaSourceMuxer
()
override
{}
void
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
){
_listener
=
listener
;
setDelegate
(
listener
)
;
_media_src
->
setListener
(
shared_from_this
());
}
...
...
This diff is collapsed.
Click to expand it.
src/TS/TSMediaSourceMuxer.h
查看文件 @
38a00264
...
...
@@ -31,7 +31,7 @@ public:
~
TSMediaSourceMuxer
()
override
=
default
;
void
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
){
_listener
=
listener
;
setDelegate
(
listener
)
;
_media_src
->
setListener
(
shared_from_this
());
}
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论