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
2e9ff3ed
Commit
2e9ff3ed
authored
3 years ago
by
ziyue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
HLS: 修复hls直播ts/m3u8文件更新导致mmap失效,触发bus error的bug
parent
fe575af0
显示空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
28 行增加
和
22 行删除
+28
-22
src/Http/HttpBody.cpp
+12
-11
src/Http/HttpBody.h
+4
-3
src/Http/HttpFileManager.cpp
+5
-4
src/Http/HttpFileManager.h
+1
-1
src/Record/HlsMaker.cpp
+3
-1
src/Record/HlsMakerImp.cpp
+3
-2
没有找到文件。
src/Http/HttpBody.cpp
查看文件 @
2e9ff3ed
...
...
@@ -45,29 +45,30 @@ Buffer::Ptr HttpStringBody::readData(size_t size) {
//////////////////////////////////////////////////////////////////
HttpFileBody
::
HttpFileBody
(
const
string
&
filePath
)
{
HttpFileBody
::
HttpFileBody
(
const
string
&
filePath
,
bool
use_mmap
)
{
std
::
shared_ptr
<
FILE
>
fp
(
fopen
(
filePath
.
data
(),
"rb"
),
[](
FILE
*
fp
)
{
if
(
fp
)
{
fclose
(
fp
);
}
});
if
(
!
fp
)
{
init
(
fp
,
0
,
0
);
init
(
fp
,
0
,
0
,
use_mmap
);
}
else
{
init
(
fp
,
0
,
File
::
fileSize
(
fp
.
get
()));
init
(
fp
,
0
,
File
::
fileSize
(
fp
.
get
())
,
use_mmap
);
}
}
HttpFileBody
::
HttpFileBody
(
const
std
::
shared_ptr
<
FILE
>
&
fp
,
size_t
offset
,
size_t
max_size
)
{
init
(
fp
,
offset
,
max_size
);
HttpFileBody
::
HttpFileBody
(
const
std
::
shared_ptr
<
FILE
>
&
fp
,
size_t
offset
,
size_t
max_size
,
bool
use_mmap
)
{
init
(
fp
,
offset
,
max_size
,
use_mmap
);
}
void
HttpFileBody
::
init
(
const
std
::
shared_ptr
<
FILE
>
&
fp
,
size_t
offset
,
size_t
max_size
)
{
void
HttpFileBody
::
init
(
const
std
::
shared_ptr
<
FILE
>
&
fp
,
size_t
offset
,
size_t
max_size
,
bool
use_mmap
)
{
_fp
=
fp
;
_max_size
=
max_size
;
#ifdef ENABLE_MMAP
if
(
use_mmap
)
{
do
{
if
(
!
_fp
)
{
if
(
!
_fp
)
{
//文件不存在
break
;
}
...
...
@@ -81,18 +82,18 @@ void HttpFileBody::init(const std::shared_ptr<FILE> &fp, size_t offset, size_t m
WarnL
<<
"mmap failed:"
<<
get_uv_errmsg
(
false
);
break
;
}
_map_addr
.
reset
(
ptr
,[
max_size
,
fp
](
char
*
ptr
)
{
munmap
(
ptr
,
max_size
);
_map_addr
.
reset
(
ptr
,
[
max_size
,
fp
](
char
*
ptr
)
{
munmap
(
ptr
,
max_size
);
});
}
while
(
false
);
}
#endif
if
(
!
_map_addr
&&
offset
&&
fp
.
get
())
{
if
(
!
_map_addr
&&
offset
&&
fp
.
get
())
{
//未映射,那么fseek设置偏移量
fseek64
(
fp
.
get
(),
offset
,
SEEK_SET
);
}
}
class
BufferMmap
:
public
Buffer
{
public
:
typedef
std
::
shared_ptr
<
BufferMmap
>
Ptr
;
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpBody.h
查看文件 @
2e9ff3ed
...
...
@@ -107,16 +107,17 @@ public:
* @param fp 文件句柄,文件的偏移量必须为0
* @param offset 相对文件头的偏移量
* @param max_size 最大读取字节数,未判断是否大于文件真实大小
* @param use_mmap 是否使用mmap方式访问文件
*/
HttpFileBody
(
const
std
::
shared_ptr
<
FILE
>
&
fp
,
size_t
offset
,
size_t
max_size
);
HttpFileBody
(
const
string
&
file_path
);
HttpFileBody
(
const
std
::
shared_ptr
<
FILE
>
&
fp
,
size_t
offset
,
size_t
max_size
,
bool
use_mmap
=
true
);
HttpFileBody
(
const
string
&
file_path
,
bool
use_mmap
=
true
);
~
HttpFileBody
()
override
=
default
;
ssize_t
remainSize
()
override
;
Buffer
::
Ptr
readData
(
size_t
size
)
override
;
private
:
void
init
(
const
std
::
shared_ptr
<
FILE
>
&
fp
,
size_t
offset
,
size_t
max_size
);
void
init
(
const
std
::
shared_ptr
<
FILE
>
&
fp
,
size_t
offset
,
size_t
max_size
,
bool
use_mmap
);
private
:
size_t
_max_size
;
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpFileManager.cpp
查看文件 @
2e9ff3ed
...
...
@@ -405,7 +405,7 @@ static void accessFile(TcpSession &sender, const Parser &parser, const MediaInfo
return
;
}
auto
response_file
=
[
file_exist
](
const
HttpServerCookie
::
Ptr
&
cookie
,
const
HttpFileManager
::
invoker
&
cb
,
const
string
&
strFile
,
const
Parser
&
parser
)
{
auto
response_file
=
[
file_exist
,
is_hls
](
const
HttpServerCookie
::
Ptr
&
cookie
,
const
HttpFileManager
::
invoker
&
cb
,
const
string
&
strFile
,
const
Parser
&
parser
)
{
StrCaseMap
httpHeader
;
if
(
cookie
)
{
auto
lck
=
cookie
->
getLock
();
...
...
@@ -421,7 +421,7 @@ static void accessFile(TcpSession &sender, const Parser &parser, const MediaInfo
}
cb
(
code
,
HttpFileManager
::
getContentType
(
strFile
.
data
()),
headerOut
,
body
);
};
invoker
.
responseFile
(
parser
.
getHeader
(),
httpHeader
,
strFile
);
invoker
.
responseFile
(
parser
.
getHeader
(),
httpHeader
,
strFile
,
!
is_hls
);
};
if
(
!
is_hls
)
{
...
...
@@ -576,7 +576,8 @@ HttpResponseInvokerImp::HttpResponseInvokerImp(const HttpResponseInvokerImp::Htt
void
HttpResponseInvokerImp
::
responseFile
(
const
StrCaseMap
&
requestHeader
,
const
StrCaseMap
&
responseHeader
,
const
string
&
filePath
)
const
{
const
string
&
filePath
,
bool
use_mmap
)
const
{
StrCaseMap
&
httpHeader
=
const_cast
<
StrCaseMap
&>
(
responseHeader
);
std
::
shared_ptr
<
FILE
>
fp
(
fopen
(
filePath
.
data
(),
"rb"
),
[](
FILE
*
fp
)
{
if
(
fp
)
{
...
...
@@ -618,7 +619,7 @@ void HttpResponseInvokerImp::responseFile(const StrCaseMap &requestHeader,
}
//回复文件
HttpBody
::
Ptr
fileBody
=
std
::
make_shared
<
HttpFileBody
>
(
fp
,
iRangeStart
,
iRangeEnd
-
iRangeStart
+
1
);
HttpBody
::
Ptr
fileBody
=
std
::
make_shared
<
HttpFileBody
>
(
fp
,
iRangeStart
,
iRangeEnd
-
iRangeStart
+
1
,
use_mmap
);
(
*
this
)(
code
,
httpHeader
,
fileBody
);
}
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpFileManager.h
查看文件 @
2e9ff3ed
...
...
@@ -35,7 +35,7 @@ public:
void
operator
()(
int
code
,
const
StrCaseMap
&
headerOut
,
const
HttpBody
::
Ptr
&
body
)
const
;
void
operator
()(
int
code
,
const
StrCaseMap
&
headerOut
,
const
string
&
body
)
const
;
void
responseFile
(
const
StrCaseMap
&
requestHeader
,
const
StrCaseMap
&
responseHeader
,
const
string
&
filePath
)
const
;
void
responseFile
(
const
StrCaseMap
&
requestHeader
,
const
StrCaseMap
&
responseHeader
,
const
string
&
filePath
,
bool
use_mmap
=
true
)
const
;
operator
bool
();
private
:
HttpResponseInvokerLambda0
_lambad
;
...
...
This diff is collapsed.
Click to expand it.
src/Record/HlsMaker.cpp
查看文件 @
2e9ff3ed
...
...
@@ -132,8 +132,10 @@ void HlsMaker::flushLastSegment(bool eof){
_seg_dur_list
.
push_back
(
std
::
make_tuple
(
seg_dur
,
std
::
move
(
_last_file_name
)));
_last_file_name
.
clear
();
delOldSegment
();
makeIndexFile
(
eof
);
//先flush ts切片,否则可能存在ts文件未写入完毕就被访问的情况
onFlushLastSegment
(
seg_dur
);
//然后写m3u8文件
makeIndexFile
(
eof
);
}
bool
HlsMaker
::
isLive
()
{
...
...
This diff is collapsed.
Click to expand it.
src/Record/HlsMakerImp.cpp
查看文件 @
2e9ff3ed
...
...
@@ -125,10 +125,11 @@ void HlsMakerImp::onWriteHls(const char *data, size_t len) {
}
void
HlsMakerImp
::
onFlushLastSegment
(
uint32_t
duration_ms
)
{
//关闭并flush文件到磁盘
_file
=
nullptr
;
GET_CONFIG
(
bool
,
broadcastRecordTs
,
Hls
::
kBroadcastRecordTs
);
if
(
broadcastRecordTs
)
{
//关闭ts文件以便获取正确的文件大小
_file
=
nullptr
;
_info
.
time_len
=
duration_ms
/
1000.0
f
;
struct
stat
fileData
;
stat
(
_info
.
file_path
.
data
(),
&
fileData
);
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论