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
a28c76a3
Commit
a28c76a3
authored
3 years ago
by
xia-chu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
限制未就绪状态track的最大帧缓存数量
parent
25924713
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
14 行增加
和
5 行删除
+14
-5
src/Common/MediaSink.cpp
+14
-5
没有找到文件。
src/Common/MediaSink.cpp
查看文件 @
a28c76a3
...
...
@@ -11,10 +11,13 @@
#include "MediaSink.h"
//最多等待未初始化的Track 10秒,超时之后会忽略未初始化的Track
#define MAX_WAIT_MS_READY 10000
static
size_t
constexpr
kMaxWaitReadyMS
=
10000
;
//如果直播流只有单Track,最多等待3秒,超时后未收到其他Track的数据,则认为是单Track
#define MAX_WAIT_MS_ADD_TRACK 3000
static
size_t
constexpr
kMaxAddTrackMS
=
3000
;
//如果track未就绪,我们先缓存帧数据,但是有最大个数限制(100帧时大约4秒),防止内存溢出
static
size_t
constexpr
kMaxUnreadyFrame
=
100
;
namespace
mediakit
{
...
...
@@ -37,8 +40,14 @@ void MediaSink::addTrack(const Track::Ptr &track_in) {
if
(
_all_track_ready
)
{
onTrackFrame
(
frame
);
}
else
{
auto
&
frame_unread
=
_frame_unread
[
frame
->
getCodecId
()];
if
(
frame_unread
.
size
()
>
kMaxUnreadyFrame
)
{
//未就绪的的track,不能缓存太多的帧,否则可能内存溢出
frame_unread
.
clear
();
WarnL
<<
"cached frame of unready track("
<<
frame
->
getCodecName
()
<<
") is too much, now cleared"
;
}
//还有Track未就绪,先缓存之
_frame_unread
[
frame
->
getCodecId
()]
.
emplace_back
(
Frame
::
getCacheAbleFrame
(
frame
));
frame_unread
.
emplace_back
(
Frame
::
getCacheAbleFrame
(
frame
));
}
}));
}
...
...
@@ -84,7 +93,7 @@ void MediaSink::checkTrackIfReady(const Track::Ptr &track){
}
if
(
!
_all_track_ready
){
if
(
_ticker
.
elapsedTime
()
>
MAX_WAIT_MS_READY
){
if
(
_ticker
.
elapsedTime
()
>
kMaxWaitReadyMS
){
//如果超过规定时间,那么不再等待并忽略未准备好的Track
emitAllTrackReady
();
return
;
...
...
@@ -101,7 +110,7 @@ void MediaSink::checkTrackIfReady(const Track::Ptr &track){
return
;
}
if
(
_track_map
.
size
()
==
1
&&
_ticker
.
elapsedTime
()
>
MAX_WAIT_MS_ADD_TRACK
){
if
(
_track_map
.
size
()
==
1
&&
_ticker
.
elapsedTime
()
>
kMaxAddTrackMS
){
//如果只有一个Track,那么在该Track添加后,我们最多还等待若干时间(可能后面还会添加Track)
emitAllTrackReady
();
return
;
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论