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
47d8e37e
Commit
47d8e37e
authored
4 years ago
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完善mp4点播
parent
278591d5
显示空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
28 行增加
和
40 行删除
+28
-40
src/Record/MP4Demuxer.cpp
+5
-11
src/Record/MP4Demuxer.h
+1
-1
src/Record/MP4Reader.cpp
+20
-25
src/Record/MP4Reader.h
+2
-3
没有找到文件。
src/Record/MP4Demuxer.cpp
查看文件 @
47d8e37e
...
...
@@ -158,7 +158,7 @@ struct Context{
BufferRaw
::
Ptr
buffer
;
};
Frame
::
Ptr
MP4Demuxer
::
readFrame
(
bool
&
keyFrame
,
bool
&
eof
)
{
Frame
::
Ptr
MP4Demuxer
::
readFrame
(
bool
&
keyFrame
)
{
static
mov_reader_onread
mov_reader_onread
=
[](
void
*
param
,
uint32_t
track_id
,
const
void
*
buffer
,
size_t
bytes
,
int64_t
pts
,
int64_t
dts
,
int
flags
)
{
Context
*
ctx
=
(
Context
*
)
param
;
ctx
->
pts
=
pts
;
...
...
@@ -178,24 +178,18 @@ Frame::Ptr MP4Demuxer::readFrame(bool &keyFrame, bool &eof) {
Context
ctx
=
{
this
,
0
};
auto
ret
=
mov_reader_read2
(
_mov_reader
.
get
(),
mov_onalloc
,
mov_reader_onread
,
&
ctx
);
switch
(
ret
)
{
case
0
:
{
eof
=
true
;
WarnL
<<
"读取mp4文件完毕"
;
}
break
;
case
0
:
return
nullptr
;
case
1
:
{
keyFrame
=
ctx
.
flags
&
MOV_AV_FLAG_KEYFREAME
;
return
makeFrame
(
ctx
.
track_id
,
ctx
.
buffer
,
ctx
.
pts
,
ctx
.
dts
);
return
makeFrame
(
ctx
.
track_id
,
ctx
.
buffer
,
ctx
.
pts
,
ctx
.
dts
);
}
break
;
default
:
eof
=
true
;
WarnL
<<
"读取mp4文件数据失败:"
<<
ret
;
break
;
}
return
nullptr
;
}
}
template
<
typename
Parent
>
...
...
This diff is collapsed.
Click to expand it.
src/Record/MP4Demuxer.h
查看文件 @
47d8e37e
...
...
@@ -38,7 +38,7 @@ public:
MP4Demuxer
(
const
char
*
file
);
~
MP4Demuxer
()
override
;
int64_t
seekTo
(
int64_t
stamp_ms
);
Frame
::
Ptr
readFrame
(
bool
&
keyFrame
,
bool
&
eof
);
Frame
::
Ptr
readFrame
(
bool
&
keyFrame
);
vector
<
Track
::
Ptr
>
getTracks
(
bool
trackReady
)
const
override
;
uint64_t
getDurationMS
()
const
;
private
:
...
...
This diff is collapsed.
Click to expand it.
src/Record/MP4Reader.cpp
查看文件 @
47d8e37e
...
...
@@ -62,32 +62,27 @@ MP4Reader::MP4Reader(const string &strVhost,const string &strApp, const string &
}
bool
MP4Reader
::
readSample
()
{
bool
eof
=
false
;
bool
keyFrame
=
false
;
while
(
!
eof
)
{
auto
frame
=
_demuxer
->
readFrame
(
keyFrame
,
eof
);
bool
eof
=
false
;
while
(
true
)
{
auto
frame
=
_demuxer
->
readFrame
(
keyFrame
);
if
(
!
frame
)
{
eof
=
true
;
break
;
}
_mediaMuxer
->
inputFrame
(
frame
);
if
(
frame
->
dts
()
>
nextStampForSto
p
())
{
if
(
frame
->
dts
()
>
getCurrentStam
p
())
{
break
;
}
}
if
(
!
eof
&&
_mediaMuxer
->
totalReaderCount
()
>
0
){
//文件未看完且观看者大于0个
_alive
.
resetTime
();
}
//重头开始循环读取
GET_CONFIG
(
bool
,
fileRepeat
,
Record
::
kFileRepeat
);
if
(
eof
&&
fileRepeat
){
//文件看完了,且需要从头开始看
GET_CONFIG
(
bool
,
fileRepeat
,
Record
::
kFileRepeat
);
if
(
eof
&&
fileRepeat
)
{
//需要从头开始看
seekTo
(
0
);
}
//读取mp4完毕后10秒才销毁对象
return
_alive
.
elapsedTime
()
<
10
*
1000
;
return
!
eof
;
}
void
MP4Reader
::
startReadMP4
()
{
...
...
@@ -97,9 +92,8 @@ void MP4Reader::startReadMP4() {
//先获取关键帧
seekTo
(
0
);
//设置下次读取停止事件
setNextStampForStop
(
_seek_to
+
sampleMS
);
//读sampleMS毫秒的数据用于产生MediaSource
setCurrentStamp
(
getCurrentStamp
()
+
sampleMS
);
readSample
();
//启动定时器
...
...
@@ -109,14 +103,14 @@ void MP4Reader::startReadMP4() {
},
_poller
);
}
uint32_t
MP4Reader
::
nextStampForSto
p
()
{
uint32_t
MP4Reader
::
getCurrentStam
p
()
{
return
_seek_to
+
_seek_ticker
.
elapsedTime
();
}
void
MP4Reader
::
set
NextStampForSto
p
(
uint32_t
ui32Stamp
){
void
MP4Reader
::
set
CurrentStam
p
(
uint32_t
ui32Stamp
){
_seek_to
=
ui32Stamp
;
_seek_ticker
.
resetTime
();
_
alive
.
resetTime
(
);
_
mediaMuxer
->
setTimeStamp
(
ui32Stamp
);
}
bool
MP4Reader
::
seekTo
(
MediaSource
&
sender
,
uint32_t
ui32Stamp
){
...
...
@@ -134,26 +128,27 @@ bool MP4Reader::seekTo(uint32_t ui32Stamp){
//seek失败
return
false
;
}
InfoL
<<
stamp
;
//设置当前时间戳
setNextStampForStop
(
stamp
);
if
(
!
_have_video
){
//没有视频,不需要搜索关键帧
//设置当前时间戳
setCurrentStamp
(
stamp
);
return
true
;
}
//搜索到下一帧关键帧
bool
eof
=
false
;
bool
keyFrame
=
false
;
while
(
!
eof
)
{
auto
frame
=
_demuxer
->
readFrame
(
keyFrame
,
eof
);
auto
frame
=
_demuxer
->
readFrame
(
keyFrame
);
if
(
!
frame
){
eof
=
true
;
break
;
}
if
(
keyFrame
||
frame
->
keyFrame
()
||
frame
->
configFrame
()){
//定位到key帧
_mediaMuxer
->
inputFrame
(
frame
);
setNextStampForStop
(
frame
->
dts
());
//设置当前时间戳
setCurrentStamp
(
frame
->
dts
());
return
true
;
}
}
...
...
This diff is collapsed.
Click to expand it.
src/Record/MP4Reader.h
查看文件 @
47d8e37e
...
...
@@ -58,15 +58,14 @@ private:
int
totalReaderCount
(
MediaSource
&
sender
)
override
;
bool
readSample
();
uint32_t
nextStampForSto
p
();
void
set
NextStampForSto
p
(
uint32_t
ui32Stamp
);
uint32_t
getCurrentStam
p
();
void
set
CurrentStam
p
(
uint32_t
ui32Stamp
);
bool
seekTo
(
uint32_t
ui32Stamp
);
private
:
recursive_mutex
_mtx
;
MultiMediaSourceMuxer
::
Ptr
_mediaMuxer
;
uint32_t
_seek_to
;
Ticker
_seek_ticker
;
Ticker
_alive
;
Timer
::
Ptr
_timer
;
EventPoller
::
Ptr
_poller
;
MP4Demuxer
::
Ptr
_demuxer
;
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论