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
eca92369
Commit
eca92369
authored
Sep 06, 2020
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
优化与拦截代码
parent
74d6689a
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
103 行增加
和
167 行删除
+103
-167
server/FFmpegSource.cpp
+0
-24
server/FFmpegSource.h
+1
-5
src/Common/MediaSink.h
+6
-1
src/Common/MediaSource.cpp
+0
-0
src/Common/MediaSource.h
+51
-30
src/Common/MultiMediaSourceMuxer.cpp
+23
-63
src/Common/MultiMediaSourceMuxer.h
+22
-44
没有找到文件。
server/FFmpegSource.cpp
查看文件 @
eca92369
...
...
@@ -245,30 +245,6 @@ bool FFmpegSource::close(MediaSource &sender, bool force) {
return
true
;
}
int
FFmpegSource
::
totalReaderCount
(
MediaSource
&
sender
)
{
auto
listener
=
_listener
.
lock
();
if
(
listener
){
return
listener
->
totalReaderCount
(
sender
);
}
return
sender
.
readerCount
();
}
void
FFmpegSource
::
onNoneReader
(
MediaSource
&
sender
){
auto
listener
=
_listener
.
lock
();
if
(
listener
){
listener
->
onNoneReader
(
sender
);
return
;
}
MediaSourceEvent
::
onNoneReader
(
sender
);
}
void
FFmpegSource
::
onRegist
(
MediaSource
&
sender
,
bool
regist
){
auto
listener
=
_listener
.
lock
();
if
(
listener
){
listener
->
onRegist
(
sender
,
regist
);
}
}
void
FFmpegSource
::
onGetMediaSource
(
const
MediaSource
::
Ptr
&
src
)
{
auto
listener
=
src
->
getListener
();
if
(
listener
.
lock
().
get
()
!=
this
)
{
...
...
server/FFmpegSource.h
查看文件 @
eca92369
...
...
@@ -40,7 +40,7 @@ private:
~
FFmpegSnap
()
=
delete
;
};
class
FFmpegSource
:
public
std
::
enable_shared_from_this
<
FFmpegSource
>
,
public
MediaSourceEvent
{
class
FFmpegSource
:
public
std
::
enable_shared_from_this
<
FFmpegSource
>
,
public
MediaSourceEvent
Interceptor
{
public
:
typedef
shared_ptr
<
FFmpegSource
>
Ptr
;
typedef
function
<
void
(
const
SockException
&
ex
)
>
onPlay
;
...
...
@@ -60,9 +60,6 @@ private:
//MediaSourceEvent override
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
int
totalReaderCount
(
MediaSource
&
sender
)
override
;
void
onNoneReader
(
MediaSource
&
sender
)
override
;
void
onRegist
(
MediaSource
&
sender
,
bool
regist
)
override
;
private
:
Process
_process
;
...
...
@@ -72,7 +69,6 @@ private:
string
_src_url
;
string
_dst_url
;
function
<
void
()
>
_onClose
;
std
::
weak_ptr
<
MediaSourceEvent
>
_listener
;
Ticker
_replay_ticker
;
};
...
...
src/Common/MediaSink.h
查看文件 @
eca92369
...
...
@@ -37,6 +37,11 @@ public:
virtual
void
addTrack
(
const
Track
::
Ptr
&
track
)
=
0
;
/**
* 添加所有Track完毕
*/
virtual
void
addTrackCompleted
()
{}
/**
* 重置track
*/
virtual
void
resetTracks
()
=
0
;
...
...
@@ -70,7 +75,7 @@ public:
* 这样会增加生成流的延时,如果添加了音视频双Track,那么可以不调用此方法
* 否则为了降低流注册延时,请手动调用此方法
*/
void
addTrackCompleted
();
void
addTrackCompleted
()
override
;
/**
* 重置track
...
...
src/Common/MediaSource.cpp
查看文件 @
eca92369
差异被折叠。
点击展开。
src/Common/MediaSource.h
查看文件 @
eca92369
...
...
@@ -44,33 +44,54 @@ public:
virtual
~
MediaSourceEvent
(){};
// 通知拖动进度条
virtual
bool
seekTo
(
MediaSource
&
sender
,
uint32_t
ui32Stamp
)
{
return
false
;
}
// 通知其停止
推
流
virtual
bool
close
(
MediaSource
&
sender
,
bool
force
)
{
return
false
;
}
// 观看总人数
virtual
bool
seekTo
(
MediaSource
&
sender
,
uint32_t
stamp
)
{
return
false
;
}
// 通知其停止
产生
流
virtual
bool
close
(
MediaSource
&
sender
,
bool
force
)
{
return
false
;
}
//
获取
观看总人数
virtual
int
totalReaderCount
(
MediaSource
&
sender
)
=
0
;
// 开启或关闭录制
virtual
bool
setupRecord
(
MediaSource
&
sender
,
Recorder
::
type
type
,
bool
start
,
const
string
&
custom_path
)
{
return
false
;
};
// 获取录制状态
virtual
bool
isRecording
(
MediaSource
&
sender
,
Recorder
::
type
type
)
{
return
false
;
};
// 通知无人观看
virtual
void
onNoneReader
(
MediaSource
&
sender
);
//流注册或注销事件
virtual
void
onRegist
(
MediaSource
&
sender
,
bool
regist
)
{};
////////////////////////仅供MultiMediaSourceMuxer对象继承////////////////////////
// 开启或关闭录制
virtual
bool
setupRecord
(
MediaSource
&
sender
,
Recorder
::
type
type
,
bool
start
,
const
string
&
custom_path
)
{
return
false
;
};
// 获取录制状态
virtual
bool
isRecording
(
MediaSource
&
sender
,
Recorder
::
type
type
)
{
return
false
;
};
private
:
Timer
::
Ptr
_async_close_timer
;
};
//该对象用于拦截感兴趣的MediaSourceEvent事件
class
MediaSourceEventInterceptor
:
public
MediaSourceEvent
{
public
:
MediaSourceEventInterceptor
(){}
~
MediaSourceEventInterceptor
()
override
{}
bool
seekTo
(
MediaSource
&
sender
,
uint32_t
stamp
)
override
;
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
int
totalReaderCount
(
MediaSource
&
sender
)
override
;
void
onNoneReader
(
MediaSource
&
sender
)
override
;
void
onRegist
(
MediaSource
&
sender
,
bool
regist
)
override
;;
bool
setupRecord
(
MediaSource
&
sender
,
Recorder
::
type
type
,
bool
start
,
const
string
&
custom_path
)
override
;
bool
isRecording
(
MediaSource
&
sender
,
Recorder
::
type
type
)
override
;
protected
:
std
::
weak_ptr
<
MediaSourceEvent
>
_listener
;
};
/**
* 解析url获取媒体相关信息
*/
class
MediaInfo
{
public
:
MediaInfo
()
{}
~
MediaInfo
()
{}
MediaInfo
(
const
string
&
url
){
parse
(
url
);
}
~
MediaInfo
()
{}
MediaInfo
()
{}
MediaInfo
(
const
string
&
url
)
{
parse
(
url
);
}
void
parse
(
const
string
&
url
);
public
:
string
_schema
;
string
_host
;
...
...
@@ -92,7 +113,7 @@ public:
typedef
unordered_map
<
string
,
AppStreamMap
>
VhostAppStreamMap
;
typedef
unordered_map
<
string
,
VhostAppStreamMap
>
SchemaVhostAppStreamMap
;
MediaSource
(
const
string
&
s
trSchema
,
const
string
&
strVhost
,
const
string
&
strApp
,
const
string
&
strI
d
)
;
MediaSource
(
const
string
&
s
chema
,
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream_i
d
)
;
virtual
~
MediaSource
()
;
// 获取协议类型
...
...
@@ -107,7 +128,7 @@ public:
// 设置TrackSource
void
setTrackSource
(
const
std
::
weak_ptr
<
TrackSource
>
&
track_src
);
// 获取所有Track
vector
<
Track
::
Ptr
>
getTracks
(
bool
trackR
eady
=
true
)
const
override
;
vector
<
Track
::
Ptr
>
getTracks
(
bool
r
eady
=
true
)
const
override
;
// 设置监听者
virtual
void
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
);
...
...
@@ -120,12 +141,12 @@ public:
virtual
int
totalReaderCount
();
// 获取流当前时间戳
virtual
uint32_t
getTimeStamp
(
TrackType
t
rackT
ype
)
{
return
0
;
};
virtual
uint32_t
getTimeStamp
(
TrackType
type
)
{
return
0
;
};
// 设置时间戳
virtual
void
setTimeStamp
(
uint32_t
uiS
tamp
)
{};
virtual
void
setTimeStamp
(
uint32_t
s
tamp
)
{};
// 拖动进度条
bool
seekTo
(
uint32_t
ui32S
tamp
);
bool
seekTo
(
uint32_t
s
tamp
);
// 关闭该流
bool
close
(
bool
force
);
// 该流无人观看
...
...
@@ -141,26 +162,26 @@ public:
static
void
findAsync
(
const
MediaInfo
&
info
,
const
std
::
shared_ptr
<
TcpSession
>
&
session
,
const
function
<
void
(
const
Ptr
&
src
)
>
&
cb
);
// 遍历所有流
static
void
for_each_media
(
const
function
<
void
(
const
Ptr
&
src
)
>
&
cb
);
// 从mp4文件生成MediaSource
static
MediaSource
::
Ptr
createFromMP4
(
const
string
&
schema
,
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream
,
const
string
&
file
Path
=
""
,
bool
checkA
pp
=
true
);
static
MediaSource
::
Ptr
createFromMP4
(
const
string
&
schema
,
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream
,
const
string
&
file
_path
=
""
,
bool
check_a
pp
=
true
);
protected
:
void
regist
()
;
bool
un
regist
();
//媒体注册
void
regist
();
private
:
static
Ptr
find_l
(
const
string
&
schema
,
const
string
&
vhost
,
const
string
&
app
,
const
string
&
id
,
bool
bMake
);
static
void
findAsync_l
(
const
MediaInfo
&
info
,
const
std
::
shared_ptr
<
TcpSession
>
&
session
,
bool
retry
,
const
function
<
void
(
const
MediaSource
::
Ptr
&
src
)
>
&
cb
);
//媒体注销
bool
unregist
();
//触发媒体事件
void
emitEvent
(
bool
regist
);
private
:
string
_strSchema
;
string
_strVhost
;
string
_strApp
;
string
_strId
;
std
::
weak_ptr
<
MediaSourceEvent
>
_listener
;
string
_schema
;
string
_vhost
;
string
_app
;
string
_stream_id
;
weak_ptr
<
TrackSource
>
_track_source
;
static
SchemaVhostAppStreamMap
g_mapMediaSrc
;
static
recursive_mutex
g_mtxMediaSrc
;
std
::
weak_ptr
<
MediaSourceEvent
>
_listener
;
};
///缓存刷新策略类
...
...
@@ -221,9 +242,9 @@ private:
}
private
:
bool
_key_pos
=
false
;
policy
_policy
;
std
::
shared_ptr
<
packet_list
>
_cache
;
bool
_key_pos
=
false
;
};
}
/* namespace mediakit */
...
...
src/Common/MultiMediaSourceMuxer.cpp
查看文件 @
eca92369
...
...
@@ -11,15 +11,11 @@
#include "MultiMediaSourceMuxer.h"
namespace
mediakit
{
///////////////////////////////MultiMuxerPrivate//////////////////////////////////
MultiMuxerPrivate
::~
MultiMuxerPrivate
()
{}
MultiMuxerPrivate
::
MultiMuxerPrivate
(
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream
,
float
dur_sec
,
bool
enable_rtsp
,
bool
enable_rtmp
,
bool
enable_hls
,
bool
enable_mp4
)
{
MultiMuxerPrivate
::
MultiMuxerPrivate
(
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream
,
float
dur_sec
,
bool
enable_rtsp
,
bool
enable_rtmp
,
bool
enable_hls
,
bool
enable_mp4
)
{
if
(
enable_rtmp
)
{
_rtmp
=
std
::
make_shared
<
RtmpMediaSourceMuxer
>
(
vhost
,
app
,
stream
,
std
::
make_shared
<
TitleMeta
>
(
dur_sec
));
_enable_rtxp
=
true
;
...
...
@@ -73,7 +69,7 @@ void MultiMuxerPrivate::setMediaListener(const std::weak_ptr<MediaSourceEvent> &
if
(
hls_src
)
{
hls_src
->
setListener
(
listener
);
}
_
meida_
listener
=
listener
;
_listener
=
listener
;
}
int
MultiMuxerPrivate
::
totalReaderCount
()
const
{
...
...
@@ -99,7 +95,7 @@ bool MultiMuxerPrivate::setupRecord(MediaSource &sender, Recorder::type type, bo
auto
hls_src
=
getHlsMediaSource
();
if
(
hls_src
)
{
//设置HlsMediaSource的事件监听器
hls_src
->
setListener
(
_
meida_
listener
);
hls_src
->
setListener
(
_listener
);
hls_src
->
setTrackSource
(
shared_from_this
());
}
}
else
if
(
!
start
&&
_hls
)
{
...
...
@@ -146,7 +142,7 @@ void MultiMuxerPrivate::setTimeStamp(uint32_t stamp) {
}
void
MultiMuxerPrivate
::
setTrackListener
(
Listener
*
listener
)
{
_listener
=
listener
;
_
track_
listener
=
listener
;
}
void
MultiMuxerPrivate
::
onTrackReady
(
const
Track
::
Ptr
&
track
)
{
...
...
@@ -206,8 +202,8 @@ void MultiMuxerPrivate::onAllTrackReady() {
hls_src
->
setTrackSource
(
shared_from_this
());
}
if
(
_listener
)
{
_listener
->
onAllTrackReady
();
if
(
_
track_
listener
)
{
_
track_
listener
->
onAllTrackReady
();
}
}
...
...
@@ -219,22 +215,18 @@ MediaSource::Ptr MultiMuxerPrivate::getHlsMediaSource() const {
return
nullptr
;
}
/////////////////////////////////////////////////////////////////
///////////////////////////////
MultiMediaSourceMuxer
//////////////////////////////////
MultiMediaSourceMuxer
::~
MultiMediaSourceMuxer
()
{}
MultiMediaSourceMuxer
::
MultiMediaSourceMuxer
(
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream
,
float
dur_sec
,
bool
enable_rtsp
,
bool
enable_rtmp
,
bool
enable_hls
,
bool
enable_mp4
)
{
MultiMediaSourceMuxer
::
MultiMediaSourceMuxer
(
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream
,
float
dur_sec
,
bool
enable_rtsp
,
bool
enable_rtmp
,
bool
enable_hls
,
bool
enable_mp4
)
{
_muxer
.
reset
(
new
MultiMuxerPrivate
(
vhost
,
app
,
stream
,
dur_sec
,
enable_rtsp
,
enable_rtmp
,
enable_hls
,
enable_mp4
));
_muxer
->
setTrackListener
(
this
);
}
void
MultiMediaSourceMuxer
::
setMediaListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
)
{
//拦截事件
_muxer
->
setMediaListener
(
shared_from_this
());
_listener
=
listener
;
}
...
...
@@ -255,46 +247,14 @@ vector<Track::Ptr> MultiMediaSourceMuxer::getTracks(bool trackReady) const {
return
_muxer
->
getTracks
(
trackReady
);
}
bool
MultiMediaSourceMuxer
::
seekTo
(
MediaSource
&
sender
,
uint32_t
ui32Stamp
)
{
auto
listener
=
_listener
.
lock
();
if
(
!
listener
)
{
return
false
;
}
return
listener
->
seekTo
(
sender
,
ui32Stamp
);
}
bool
MultiMediaSourceMuxer
::
close
(
MediaSource
&
sender
,
bool
force
)
{
auto
listener
=
_listener
.
lock
();
if
(
!
listener
)
{
return
false
;
}
return
listener
->
close
(
sender
,
force
);
}
int
MultiMediaSourceMuxer
::
totalReaderCount
(
MediaSource
&
sender
)
{
auto
listener
=
_listener
.
lock
();
if
(
!
listener
)
{
return
_muxer
->
totalReaderCount
();
return
totalReaderCount
();
}
return
listener
->
totalReaderCount
(
sender
);
}
void
MultiMediaSourceMuxer
::
onNoneReader
(
MediaSource
&
sender
){
auto
listener
=
_listener
.
lock
();
if
(
!
listener
)
{
MediaSourceEvent
::
onNoneReader
(
sender
);
return
;
}
listener
->
onNoneReader
(
sender
);
}
void
MultiMediaSourceMuxer
::
onRegist
(
MediaSource
&
sender
,
bool
regist
){
auto
listener
=
_listener
.
lock
();
if
(
listener
)
{
listener
->
onRegist
(
sender
,
regist
);
}
}
bool
MultiMediaSourceMuxer
::
setupRecord
(
MediaSource
&
sender
,
Recorder
::
type
type
,
bool
start
,
const
string
&
custom_path
)
{
return
_muxer
->
setupRecord
(
sender
,
type
,
start
,
custom_path
);
}
...
...
@@ -313,9 +273,9 @@ void MultiMediaSourceMuxer::addTrackCompleted() {
void
MultiMediaSourceMuxer
::
onAllTrackReady
(){
_muxer
->
setMediaListener
(
shared_from_this
());
auto
track_
listener
=
_track_listener
.
lock
();
if
(
track_
listener
){
track_
listener
->
onAllTrackReady
();
auto
listener
=
_track_listener
.
lock
();
if
(
listener
){
listener
->
onAllTrackReady
();
}
}
...
...
@@ -370,19 +330,19 @@ public:
return
_frame
->
getCodecId
();
}
private
:
Frame
::
Ptr
_frame
;
int64_t
_dts
;
int64_t
_pts
;
Frame
::
Ptr
_frame
;
};
void
MultiMediaSourceMuxer
::
inputFrame
(
const
Frame
::
Ptr
&
frame
)
{
GET_CONFIG
(
bool
,
modify_stamp
,
General
::
kModifyStamp
);
if
(
!
modify_stamp
)
{
GET_CONFIG
(
bool
,
modify_stamp
,
General
::
kModifyStamp
);
if
(
!
modify_stamp
)
{
//未开启时间戳覆盖
_muxer
->
inputFrame
(
frame
);
}
else
{
}
else
{
//开启了时间戳覆盖
FrameModifyStamp
::
Ptr
new_frame
=
std
::
make_shared
<
FrameModifyStamp
>
(
frame
,
_stamp
[
frame
->
getTrackType
()]);
FrameModifyStamp
::
Ptr
new_frame
=
std
::
make_shared
<
FrameModifyStamp
>
(
frame
,
_stamp
[
frame
->
getTrackType
()]);
//输入时间戳覆盖后的帧
_muxer
->
inputFrame
(
new_frame
);
}
...
...
src/Common/MultiMediaSourceMuxer.h
查看文件 @
eca92369
...
...
@@ -17,7 +17,7 @@
#include "Record/HlsRecorder.h"
namespace
mediakit
{
class
MultiMuxerPrivate
:
public
MediaSink
,
public
std
::
enable_shared_from_this
<
MultiMuxerPrivate
>
{
class
MultiMuxerPrivate
:
public
MediaSink
,
public
std
::
enable_shared_from_this
<
MultiMuxerPrivate
>
{
public
:
friend
class
MultiMediaSourceMuxer
;
typedef
std
::
shared_ptr
<
MultiMuxerPrivate
>
Ptr
;
...
...
@@ -47,17 +47,17 @@ private:
MediaSource
::
Ptr
getHlsMediaSource
()
const
;
private
:
bool
_enable_rtxp
=
false
;
bool
_enable_record
=
false
;
Listener
*
_track_listener
=
nullptr
;
RtmpMediaSourceMuxer
::
Ptr
_rtmp
;
RtspMediaSourceMuxer
::
Ptr
_rtsp
;
MediaSinkInterface
::
Ptr
_hls
;
MediaSinkInterface
::
Ptr
_mp4
;
Listener
*
_listener
=
nullptr
;
std
::
weak_ptr
<
MediaSourceEvent
>
_meida_listener
;
bool
_enable_rtxp
=
false
;
bool
_enable_record
=
false
;
std
::
weak_ptr
<
MediaSourceEvent
>
_listener
;
};
class
MultiMediaSourceMuxer
:
public
MediaSourceEvent
,
public
MediaSinkInterface
,
public
TrackSource
,
public
MultiMuxerPrivate
::
Listener
,
public
std
::
enable_shared_from_this
<
MultiMediaSourceMuxer
>
{
class
MultiMediaSourceMuxer
:
public
MediaSourceEvent
Interceptor
,
public
MediaSinkInterface
,
public
TrackSource
,
public
MultiMuxerPrivate
::
Listener
,
public
std
::
enable_shared_from_this
<
MultiMediaSourceMuxer
>
{
public
:
typedef
MultiMuxerPrivate
::
Listener
Listener
;
typedef
std
::
shared_ptr
<
MultiMediaSourceMuxer
>
Ptr
;
...
...
@@ -84,11 +84,18 @@ public:
int
totalReaderCount
()
const
;
/**
* 判断是否生效(是否正在转其他协议)
*/
bool
isEnabled
();
/**
* 设置MediaSource时间戳
* @param stamp 时间戳
*/
void
setTimeStamp
(
uint32_t
stamp
);
/////////////////////////////////TrackSource override/////////////////////////////////
/**
* 获取所有Track
* @param trackReady 是否筛选过滤未就绪的track
...
...
@@ -96,21 +103,7 @@ public:
*/
vector
<
Track
::
Ptr
>
getTracks
(
bool
trackReady
=
true
)
const
override
;
/**
* 通知拖动进度条
* @param sender 事件发送者
* @param ui32Stamp 目标时间戳
* @return 是否成功
*/
bool
seekTo
(
MediaSource
&
sender
,
uint32_t
ui32Stamp
)
override
;
/**
* 通知停止流生成
* @param sender 事件发送者
* @param force 是否强制关闭
* @return 成功与否
*/
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
/////////////////////////////////MediaSourceEvent override/////////////////////////////////
/**
* 观看总人数
...
...
@@ -120,19 +113,6 @@ public:
int
totalReaderCount
(
MediaSource
&
sender
)
override
;
/**
* 触发无人观看事件
* @param sender 触发者
*/
void
onNoneReader
(
MediaSource
&
sender
)
override
;
/**
* 媒体注册注销事件
* @param sender 触发者
* @param regist 是否为注册事件
*/
void
onRegist
(
MediaSource
&
sender
,
bool
regist
)
override
;
/**
* 设置录制状态
* @param type 录制类型
* @param start 开始或停止
...
...
@@ -148,6 +128,8 @@ public:
*/
bool
isRecording
(
MediaSource
&
sender
,
Recorder
::
type
type
)
override
;
/////////////////////////////////MediaSinkInterface override/////////////////////////////////
/**
* 添加track,内部会调用Track的clone方法
* 只会克隆sps pps这些信息 ,而不会克隆Delegate相关关系
...
...
@@ -158,12 +140,7 @@ public:
/**
* 添加track完毕
*/
void
addTrackCompleted
();
/**
* 所有track全部就绪
*/
void
onAllTrackReady
()
override
;
void
addTrackCompleted
()
override
;
/**
* 重置track
...
...
@@ -176,16 +153,17 @@ public:
*/
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
override
;
/////////////////////////////////MultiMuxerPrivate::Listener override/////////////////////////////////
/**
*
判断是否生效(是否正在转其他协议)
*
所有track全部就绪
*/
bool
isEnabled
()
;
void
onAllTrackReady
()
override
;
private
:
Stamp
_stamp
[
2
];
MultiMuxerPrivate
::
Ptr
_muxer
;
std
::
weak_ptr
<
MediaSourceEvent
>
_listener
;
std
::
weak_ptr
<
MultiMuxerPrivate
::
Listener
>
_track_listener
;
Stamp
_stamp
[
2
];
};
}
//namespace mediakit
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论