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
8f730b8d
Commit
8f730b8d
authored
Jun 28, 2021
by
ziyue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
整理代码
parent
430229fe
显示空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
133 行增加
和
140 行删除
+133
-140
src/Extension/Frame.cpp
+25
-19
src/Extension/H264Rtmp.cpp
+46
-53
src/Extension/H264Rtmp.h
+3
-3
src/Extension/H265.cpp
+1
-1
src/Extension/H265Rtmp.cpp
+55
-61
src/Extension/H265Rtmp.h
+3
-3
没有找到文件。
src/Extension/Frame.cpp
查看文件 @
8f730b8d
...
...
@@ -192,10 +192,11 @@ bool FrameMerger::willFlush(const Frame::Ptr &frame) const{
switch
(
frame
->
getCodecId
())
{
case
CodecH264
:
{
auto
type
=
H264_TYPE
(
frame
->
data
()[
frame
->
prefixSize
()]);
if
((
frame
->
data
()[
frame
->
prefixSize
()
+
1
]
&
0x80
)
!=
0
&&
type
>=
H264Frame
::
NAL_B_P
&&
type
<=
H264Frame
::
NAL_IDR
)
{
// sei aud pps sps 不判断
if
((
frame
->
data
()[
frame
->
prefixSize
()
+
1
]
&
0x80
)
!=
0
&&
type
>=
H264Frame
::
NAL_B_P
&&
type
<=
H264Frame
::
NAL_IDR
)
{
// sei aud pps sps 不判断
//264 新一帧的开始,刷新输出
return
true
;
}
else
{
}
else
{
// 不刷新输出
return
false
;
}
...
...
@@ -203,10 +204,11 @@ bool FrameMerger::willFlush(const Frame::Ptr &frame) const{
}
case
CodecH265
:
{
auto
type
=
H265_TYPE
(
frame
->
data
()[
frame
->
prefixSize
()]);
if
((
type
>=
H265Frame
::
NAL_TRAIL_R
&&
type
<=
H265Frame
::
NAL_RSV_IRAP_VCL23
)
&&
(
(
frame
->
data
()[
frame
->
prefixSize
()
+
2
]
>>
7
&
0x01
)
!=
0
))
{
if
((
type
>=
H265Frame
::
NAL_TRAIL_R
&&
type
<=
H265Frame
::
NAL_RSV_IRAP_VCL23
)
&&
((
frame
->
data
()[
frame
->
prefixSize
()
+
2
]
>>
7
&
0x01
)
!=
0
))
{
//first_slice_segment_in_pic_flag is frame start
return
true
;
}
else
{
}
else
{
return
false
;
}
break
;
...
...
@@ -244,11 +246,12 @@ void FrameMerger::doMerge(BufferLikeString &merged, const Frame::Ptr &frame) con
default
:
/*不可达*/
assert
(
0
);
break
;
}
}
bool
FrameMerger
::
shouldDrop
(
const
Frame
::
Ptr
&
frame
)
const
{
switch
(
frame
->
getCodecId
())
{
case
CodecH264
:
{
case
CodecH264
:
{
auto
type
=
H264_TYPE
(
frame
->
data
()[
frame
->
prefixSize
()]);
if
(
type
==
H264Frame
::
NAL_SEI
||
type
==
H264Frame
::
NAL_AUD
)
{
if
(
type
==
H264Frame
::
NAL_SEI
||
type
==
H264Frame
::
NAL_AUD
)
{
// 防止吧AUD或者SEI当成一帧
return
true
;
}
...
...
@@ -257,26 +260,28 @@ bool FrameMerger::shouldDrop(const Frame::Ptr &frame) const{
case
CodecH265
:
{
//如果是新的一帧,前面的缓存需要输出
auto
type
=
H265_TYPE
(
frame
->
data
()[
frame
->
prefixSize
()]);
if
(
type
==
H265Frame
::
NAL_AUD
||
type
==
H265Frame
::
NAL_SEI_PREFIX
||
type
==
H265Frame
::
NAL_SEI_SUFFIX
)
{
if
(
type
==
H265Frame
::
NAL_AUD
||
type
==
H265Frame
::
NAL_SEI_PREFIX
||
type
==
H265Frame
::
NAL_SEI_SUFFIX
)
{
// 防止吧AUD或者SEI当成一帧
return
true
;
}
break
;
}
default
:
break
;
default
:
break
;
}
return
false
;
}
bool
FrameMerger
::
frameCacheHasVCL
(
List
<
Frame
::
Ptr
>
&
frameCached
)
const
{
bool
FrameMerger
::
frameCacheHasVCL
(
List
<
Frame
::
Ptr
>
&
frameCached
)
const
{
bool
hasVCL
=
false
;
bool
isH264OrH265
=
false
;
frameCached
.
for_each
([
&
hasVCL
,
&
isH264OrH265
](
const
Frame
::
Ptr
&
frame
)
{
frameCached
.
for_each
([
&
hasVCL
,
&
isH264OrH265
](
const
Frame
::
Ptr
&
frame
)
{
switch
(
frame
->
getCodecId
())
{
case
CodecH264
:
{
case
CodecH264
:
{
auto
type
=
H264_TYPE
(
frame
->
data
()[
frame
->
prefixSize
()]);
if
(
type
>=
H264Frame
::
NAL_B_P
&&
type
<=
H264Frame
::
NAL_IDR
)
{
if
(
type
>=
H264Frame
::
NAL_B_P
&&
type
<=
H264Frame
::
NAL_IDR
)
{
//有编码数据
hasVCL
=
true
;
hasVCL
=
true
;
}
isH264OrH265
=
true
;
break
;
...
...
@@ -284,24 +289,25 @@ bool FrameMerger::frameCacheHasVCL(List<Frame::Ptr> &frameCached) const{
case
CodecH265
:
{
//如果是新的一帧,前面的缓存需要输出
auto
type
=
H265_TYPE
(
frame
->
data
()[
frame
->
prefixSize
()]);
if
(
type
>=
H265Frame
::
NAL_TRAIL_R
&&
type
<=
H265Frame
::
NAL_RSV_IRAP_VCL23
)
{
if
(
type
>=
H265Frame
::
NAL_TRAIL_R
&&
type
<=
H265Frame
::
NAL_RSV_IRAP_VCL23
)
{
//有编码数据
hasVCL
=
true
;
hasVCL
=
true
;
}
isH264OrH265
=
true
;
break
;
}
default
:
break
;
default
:
break
;
}
});
if
(
isH264OrH265
)
{
if
(
isH264OrH265
)
{
return
hasVCL
;
}
return
true
;
}
void
FrameMerger
::
inputFrame
(
const
Frame
::
Ptr
&
frame
,
const
onOutput
&
cb
)
{
if
(
shouldDrop
(
frame
))
{
if
(
shouldDrop
(
frame
))
{
return
;
}
if
(
willFlush
(
frame
)
&&
frameCacheHasVCL
(
_frameCached
))
{
...
...
src/Extension/H264Rtmp.cpp
查看文件 @
8f730b8d
...
...
@@ -95,22 +95,21 @@ void H264RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) {
}
if
(
pkt
->
buffer
.
size
()
>
9
)
{
auto
iTotalL
en
=
pkt
->
buffer
.
size
();
size_t
iO
ffset
=
5
;
auto
total_l
en
=
pkt
->
buffer
.
size
();
size_t
o
ffset
=
5
;
uint8_t
*
cts_ptr
=
(
uint8_t
*
)
(
pkt
->
buffer
.
data
()
+
2
);
int32_t
cts
=
(((
cts_ptr
[
0
]
<<
16
)
|
(
cts_ptr
[
1
]
<<
8
)
|
(
cts_ptr
[
2
]))
+
0xff800000
)
^
0xff800000
;
auto
pts
=
pkt
->
time_stamp
+
cts
;
while
(
iOffset
+
4
<
iTotalLen
){
uint32_t
iFrameLen
;
memcpy
(
&
iFrameLen
,
pkt
->
buffer
.
data
()
+
iOffset
,
4
);
iFrameLen
=
ntohl
(
iFrameLen
);
iOffset
+=
4
;
if
(
iFrameLen
+
iOffset
>
iTotalLen
){
while
(
offset
+
4
<
total_len
)
{
uint32_t
frame_len
;
memcpy
(
&
frame_len
,
pkt
->
buffer
.
data
()
+
offset
,
4
);
frame_len
=
ntohl
(
frame_len
);
offset
+=
4
;
if
(
frame_len
+
offset
>
total_len
)
{
break
;
}
onGetH264
(
pkt
->
buffer
.
data
()
+
iOffset
,
iFrameLen
,
pkt
->
time_stamp
,
pts
);
iOffset
+=
iFrameL
en
;
onGetH264
(
pkt
->
buffer
.
data
()
+
offset
,
frame_len
,
pkt
->
time_stamp
,
pts
);
offset
+=
frame_l
en
;
}
}
}
...
...
@@ -151,79 +150,73 @@ void H264RtmpEncoder::makeConfigPacket(){
if
(
!
_sps
.
empty
()
&&
!
_pps
.
empty
())
{
//获取到sps/pps
makeVideoConfigPkt
();
_got
SpsPps
=
true
;
_got
_config_frame
=
true
;
}
}
void
H264RtmpEncoder
::
inputFrame
(
const
Frame
::
Ptr
&
frame
)
{
auto
pcData
=
frame
->
data
()
+
frame
->
prefixSize
();
auto
iLen
=
frame
->
size
()
-
frame
->
prefixSize
();
auto
type
=
H264_TYPE
(((
uint8_t
*
)
pcData
)[
0
]);
if
(
type
==
H264Frame
::
NAL_SEI
||
type
==
H264Frame
::
NAL_AUD
){
return
;
}
if
(
!
_gotSpsPps
)
{
//尝试从frame中获取sps pps
auto
data
=
frame
->
data
()
+
frame
->
prefixSize
();
auto
len
=
frame
->
size
()
-
frame
->
prefixSize
();
auto
type
=
H264_TYPE
(((
uint8_t
*
)
data
)[
0
]);
switch
(
type
)
{
case
H264Frame
:
:
NAL_SEI
:
case
H264Frame
:
:
NAL_AUD
:
return
;
case
H264Frame
:
:
NAL_SPS
:
{
//sps
_sps
=
string
(
pcData
,
iL
en
);
if
(
!
_got_config_frame
)
{
_sps
=
string
(
data
,
l
en
);
makeConfigPacket
();
}
break
;
}
case
H264Frame
:
:
NAL_PPS
:
{
//pps
_pps
=
string
(
pcData
,
iL
en
);
if
(
!
_got_config_frame
)
{
_pps
=
string
(
data
,
l
en
);
makeConfigPacket
();
break
;
}
default
:
break
;
}
default
:
break
;
}
if
(
frame
->
configFrame
()
&&
_lastPacket
&&
_lastPacketHasVCL
){
if
(
frame
->
configFrame
()
&&
_rtmp_packet
&&
_has_vcl
)
{
//sps pps flush frame
RtmpCodec
::
inputRtmp
(
_
lastP
acket
);
_
lastPacket
=
nullptr
;
_
lastPacketHasVCL
=
false
;
RtmpCodec
::
inputRtmp
(
_
rtmp_p
acket
);
_
has_vcl
=
false
;
_
rtmp_packet
=
nullptr
;
}
if
(
_lastPacket
&&
(
_lastPacket
->
time_stamp
!=
frame
->
dts
()
||
((
pcData
[
1
]
&
0x80
)
!=
0
&&
type
>=
H264Frame
::
NAL_B_P
&&
type
<=
H264Frame
::
NAL_IDR
&&
_lastPacketHasVCL
)))
{
RtmpCodec
::
inputRtmp
(
_
lastP
acket
);
_
lastPacket
=
nullptr
;
_
lastPacketHasVCL
=
false
;
if
(
_rtmp_packet
&&
(
_rtmp_packet
->
time_stamp
!=
frame
->
dts
()
||
((
data
[
1
]
&
0x80
)
!=
0
&&
type
>=
H264Frame
::
NAL_B_P
&&
type
<=
H264Frame
::
NAL_IDR
&&
_has_vcl
)))
{
RtmpCodec
::
inputRtmp
(
_
rtmp_p
acket
);
_
has_vcl
=
false
;
_
rtmp_packet
=
nullptr
;
}
if
(
type
>=
H264Frame
::
NAL_B_P
&&
type
<=
H264Frame
::
NAL_IDR
)
{
_
lastPacketHasVCL
=
true
;
if
(
type
>=
H264Frame
::
NAL_B_P
&&
type
<=
H264Frame
::
NAL_IDR
)
{
_
has_vcl
=
true
;
}
if
(
!
_lastPacket
)
{
if
(
!
_rtmp_packet
)
{
//I or P or B frame
int8_t
flags
=
FLV_CODEC_H264
;
bool
is_config
=
false
;
flags
|=
(((
frame
->
configFrame
()
||
frame
->
keyFrame
())
?
FLV_KEY_FRAME
:
FLV_INTER_FRAME
)
<<
4
);
_
lastP
acket
=
RtmpPacket
::
create
();
_
lastP
acket
->
buffer
.
push_back
(
flags
);
_
lastP
acket
->
buffer
.
push_back
(
!
is_config
);
_
rtmp_p
acket
=
RtmpPacket
::
create
();
_
rtmp_p
acket
->
buffer
.
push_back
(
flags
);
_
rtmp_p
acket
->
buffer
.
push_back
(
!
is_config
);
int32_t
cts
=
frame
->
pts
()
-
frame
->
dts
();
if
(
cts
<
0
)
{
cts
=
0
;
}
cts
=
htonl
(
cts
);
_lastPacket
->
buffer
.
append
((
char
*
)
&
cts
+
1
,
3
);
_lastPacket
->
chunk_id
=
CHUNK_VIDEO
;
_lastPacket
->
stream_index
=
STREAM_MEDIA
;
_lastPacket
->
time_stamp
=
frame
->
dts
();
_lastPacket
->
type_id
=
MSG_VIDEO
;
_rtmp_packet
->
buffer
.
append
((
char
*
)
&
cts
+
1
,
3
);
_rtmp_packet
->
chunk_id
=
CHUNK_VIDEO
;
_rtmp_packet
->
stream_index
=
STREAM_MEDIA
;
_rtmp_packet
->
time_stamp
=
frame
->
dts
();
_rtmp_packet
->
type_id
=
MSG_VIDEO
;
}
uint32_t
size
=
htonl
((
uint32_t
)
iL
en
);
_
lastP
acket
->
buffer
.
append
((
char
*
)
&
size
,
4
);
_
lastPacket
->
buffer
.
append
(
pcData
,
iL
en
);
_
lastPacket
->
body_size
=
_lastP
acket
->
buffer
.
size
();
uint32_t
size
=
htonl
((
uint32_t
)
l
en
);
_
rtmp_p
acket
->
buffer
.
append
((
char
*
)
&
size
,
4
);
_
rtmp_packet
->
buffer
.
append
(
data
,
l
en
);
_
rtmp_packet
->
body_size
=
_rtmp_p
acket
->
buffer
.
size
();
}
void
H264RtmpEncoder
::
makeVideoConfigPkt
()
{
...
...
src/Extension/H264Rtmp.h
查看文件 @
8f730b8d
...
...
@@ -78,10 +78,10 @@ public:
private
:
void
makeVideoConfigPkt
();
private
:
bool
_has_vcl
=
false
;
bool
_got_config_frame
=
false
;
H264Track
::
Ptr
_track
;
bool
_gotSpsPps
=
false
;
bool
_lastPacketHasVCL
=
false
;
RtmpPacket
::
Ptr
_lastPacket
;
RtmpPacket
::
Ptr
_rtmp_packet
;
};
}
//namespace mediakit
...
...
src/Extension/H265.cpp
查看文件 @
8f730b8d
...
...
@@ -64,7 +64,7 @@ bool H265Frame::configFrame() const {
}
bool
H265Frame
::
isKeyFrame
(
int
type
,
const
char
*
ptr
)
{
if
(
ptr
)
{
if
(
ptr
)
{
return
(((
*
((
uint8_t
*
)
ptr
+
2
))
>>
7
)
&
0x01
)
==
1
&&
(
type
==
NAL_IDR_N_LP
||
type
==
NAL_IDR_W_RADL
);
}
return
false
;
...
...
src/Extension/H265Rtmp.cpp
查看文件 @
8f730b8d
...
...
@@ -73,22 +73,21 @@ void H265RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) {
}
if
(
pkt
->
buffer
.
size
()
>
9
)
{
auto
iTotalL
en
=
pkt
->
buffer
.
size
();
size_t
iO
ffset
=
5
;
auto
total_l
en
=
pkt
->
buffer
.
size
();
size_t
o
ffset
=
5
;
uint8_t
*
cts_ptr
=
(
uint8_t
*
)
(
pkt
->
buffer
.
data
()
+
2
);
int32_t
cts
=
(((
cts_ptr
[
0
]
<<
16
)
|
(
cts_ptr
[
1
]
<<
8
)
|
(
cts_ptr
[
2
]))
+
0xff800000
)
^
0xff800000
;
auto
pts
=
pkt
->
time_stamp
+
cts
;
while
(
iOffset
+
4
<
iTotalLen
){
uint32_t
iFrameLen
;
memcpy
(
&
iFrameLen
,
pkt
->
buffer
.
data
()
+
iOffset
,
4
);
iFrameLen
=
ntohl
(
iFrameLen
);
iOffset
+=
4
;
if
(
iFrameLen
+
iOffset
>
iTotalLen
){
while
(
offset
+
4
<
total_len
)
{
uint32_t
frame_len
;
memcpy
(
&
frame_len
,
pkt
->
buffer
.
data
()
+
offset
,
4
);
frame_len
=
ntohl
(
frame_len
);
offset
+=
4
;
if
(
frame_len
+
offset
>
total_len
)
{
break
;
}
onGetH265
(
pkt
->
buffer
.
data
()
+
iOffset
,
iFrameLen
,
pkt
->
time_stamp
,
pts
);
iOffset
+=
iFrameL
en
;
onGetH265
(
pkt
->
buffer
.
data
()
+
offset
,
frame_len
,
pkt
->
time_stamp
,
pts
);
offset
+=
frame_l
en
;
}
}
}
...
...
@@ -130,87 +129,85 @@ void H265RtmpEncoder::makeConfigPacket(){
if
(
!
_sps
.
empty
()
&&
!
_pps
.
empty
()
&&
!
_vps
.
empty
())
{
//获取到sps/pps
makeVideoConfigPkt
();
_got
SpsPps
=
true
;
_got
_config_frame
=
true
;
}
}
void
H265RtmpEncoder
::
inputFrame
(
const
Frame
::
Ptr
&
frame
)
{
auto
pcD
ata
=
frame
->
data
()
+
frame
->
prefixSize
();
auto
iL
en
=
frame
->
size
()
-
frame
->
prefixSize
();
auto
type
=
H265_TYPE
(((
uint8_t
*
)
pcD
ata
)[
0
]);
auto
d
ata
=
frame
->
data
()
+
frame
->
prefixSize
();
auto
l
en
=
frame
->
size
()
-
frame
->
prefixSize
();
auto
type
=
H265_TYPE
(((
uint8_t
*
)
d
ata
)[
0
]);
if
(
!
_gotSpsPps
)
{
//尝试从frame中获取sps pps
switch
(
type
)
{
case
H265Frame
:
:
NAL_SPS
:
{
//sps
_sps
=
string
(
pcData
,
iL
en
);
if
(
!
_got_config_frame
)
{
_sps
=
string
(
data
,
l
en
);
makeConfigPacket
();
}
break
;
}
case
H265Frame
:
:
NAL_PPS
:
{
//pps
_pps
=
string
(
pcData
,
iL
en
);
if
(
!
_got_config_frame
)
{
_pps
=
string
(
data
,
l
en
);
makeConfigPacket
();
}
break
;
}
case
H265Frame
:
:
NAL_VPS
:
{
//vps
_vps
=
string
(
pcData
,
iL
en
);
if
(
!
_got_config_frame
)
{
_vps
=
string
(
data
,
l
en
);
makeConfigPacket
();
break
;
}
default
:
break
;
}
case
H265Frame
:
:
NAL_AUD
:
case
H265Frame
:
:
NAL_SEI_PREFIX
:
case
H265Frame
:
:
NAL_SEI_SUFFIX
:
return
;
default
:
break
;
}
if
(
type
==
H265Frame
::
NAL_SEI_PREFIX
||
type
==
H265Frame
::
NAL_SEI_SUFFIX
||
type
==
H265Frame
::
NAL_AUD
){
return
;
// 防止sei aud 作为一帧
}
if
(
frame
->
configFrame
()
&&
_lastPacket
&&
_lastPacketHasVCL
){
if
(
frame
->
configFrame
()
&&
_rtmp_packet
&&
_has_vcl
){
// sps pps flush frame
RtmpCodec
::
inputRtmp
(
_
lastP
acket
);
_
lastP
acket
=
nullptr
;
_
lastPacketHasVCL
=
false
;
RtmpCodec
::
inputRtmp
(
_
rtmp_p
acket
);
_
rtmp_p
acket
=
nullptr
;
_
has_vcl
=
false
;
}
if
(
_
lastPacket
&&
(
_lastPacket
->
time_stamp
!=
frame
->
dts
()
||
(
_lastPacketHasVCL
&&
type
>=
H265Frame
::
NAL_TRAIL_R
&&
type
<=
H265Frame
::
NAL_RSV_IRAP_VCL23
&&
(
pcData
[
2
]
>>
7
&
0x01
)
!=
0
)))
{
RtmpCodec
::
inputRtmp
(
_
lastP
acket
);
_
lastPacket
=
nullptr
;
_
lastPacketHasVCL
=
false
;
if
(
_
rtmp_packet
&&
(
_rtmp_packet
->
time_stamp
!=
frame
->
dts
()
||
(
_has_vcl
&&
type
>=
H265Frame
::
NAL_TRAIL_R
&&
type
<=
H265Frame
::
NAL_RSV_IRAP_VCL23
&&
(
data
[
2
]
>>
7
&
0x01
)
!=
0
)))
{
RtmpCodec
::
inputRtmp
(
_
rtmp_p
acket
);
_
has_vcl
=
false
;
_
rtmp_packet
=
nullptr
;
}
if
(
type
>=
H265Frame
::
NAL_TRAIL_R
&&
type
<=
H265Frame
::
NAL_RSV_IRAP_VCL23
)
{
_
lastPacketHasVCL
=
true
;
if
(
type
>=
H265Frame
::
NAL_TRAIL_R
&&
type
<=
H265Frame
::
NAL_RSV_IRAP_VCL23
)
{
_
has_vcl
=
true
;
}
if
(
!
_lastP
acket
)
{
if
(
!
_rtmp_p
acket
)
{
//I or P or B frame
int8_t
flags
=
FLV_CODEC_H265
;
bool
is_config
=
false
;
flags
|=
(((
frame
->
configFrame
()
||
frame
->
keyFrame
())
?
FLV_KEY_FRAME
:
FLV_INTER_FRAME
)
<<
4
);
// to do
// 必须是IDR帧才能是关键帧,否则有可能开始帧会花屏 SPS PPS VPS 打头的是一般I帧,但不一定是IDR帧
// todo 必须是IDR帧才能是关键帧,否则有可能开始帧会花屏 SPS PPS VPS 打头的是一般I帧,但不一定是IDR帧
// RtmpCodec::inputRtmp 时需要判断 是否是IDR帧,做出相应的修改
_lastPacket
=
RtmpPacket
::
create
();
_lastPacket
->
buffer
.
push_back
(
flags
);
_lastPacket
->
buffer
.
push_back
(
!
is_config
);
auto
cts
=
frame
->
pts
()
-
frame
->
dts
();
cts
=
htonl
(
cts
);
_lastPacket
->
buffer
.
append
((
char
*
)
&
cts
+
1
,
3
);
_lastPacket
->
chunk_id
=
CHUNK_VIDEO
;
_lastPacket
->
stream_index
=
STREAM_MEDIA
;
_lastPacket
->
time_stamp
=
frame
->
dts
();
_lastPacket
->
type_id
=
MSG_VIDEO
;
_rtmp_packet
=
RtmpPacket
::
create
();
_rtmp_packet
->
buffer
.
push_back
(
flags
);
_rtmp_packet
->
buffer
.
push_back
(
!
is_config
);
int32_t
cts
=
frame
->
pts
()
-
frame
->
dts
();
if
(
cts
<
0
)
{
cts
=
0
;
}
uint32_t
size
=
htonl
((
uint32_t
)
iLen
);
_lastPacket
->
buffer
.
append
((
char
*
)
&
size
,
4
);
_lastPacket
->
buffer
.
append
(
pcData
,
iLen
);
_lastPacket
->
body_size
=
_lastPacket
->
buffer
.
size
();
cts
=
htonl
(
cts
);
_rtmp_packet
->
buffer
.
append
((
char
*
)
&
cts
+
1
,
3
);
_rtmp_packet
->
chunk_id
=
CHUNK_VIDEO
;
_rtmp_packet
->
stream_index
=
STREAM_MEDIA
;
_rtmp_packet
->
time_stamp
=
frame
->
dts
();
_rtmp_packet
->
type_id
=
MSG_VIDEO
;
}
uint32_t
size
=
htonl
((
uint32_t
)
len
);
_rtmp_packet
->
buffer
.
append
((
char
*
)
&
size
,
4
);
_rtmp_packet
->
buffer
.
append
(
data
,
len
);
_rtmp_packet
->
body_size
=
_rtmp_packet
->
buffer
.
size
();
}
void
H265RtmpEncoder
::
makeVideoConfigPkt
()
{
...
...
@@ -218,7 +215,6 @@ void H265RtmpEncoder::makeVideoConfigPkt() {
int8_t
flags
=
FLV_CODEC_H265
;
flags
|=
(
FLV_KEY_FRAME
<<
4
);
bool
is_config
=
true
;
auto
rtmpPkt
=
RtmpPacket
::
create
();
//header
rtmpPkt
->
buffer
.
push_back
(
flags
);
...
...
@@ -237,10 +233,8 @@ void H265RtmpEncoder::makeVideoConfigPkt() {
WarnL
<<
"生成H265 extra_data 失败"
;
return
;
}
//HEVCDecoderConfigurationRecord
rtmpPkt
->
buffer
.
append
((
char
*
)
extra_data
,
extra_data_size
);
rtmpPkt
->
body_size
=
rtmpPkt
->
buffer
.
size
();
rtmpPkt
->
chunk_id
=
CHUNK_VIDEO
;
rtmpPkt
->
stream_index
=
STREAM_MEDIA
;
...
...
src/Extension/H265Rtmp.h
查看文件 @
8f730b8d
...
...
@@ -78,13 +78,13 @@ private:
void
makeVideoConfigPkt
();
private
:
bool
_gotSpsPps
=
false
;
bool
_has_vcl
=
false
;
bool
_got_config_frame
=
false
;
string
_vps
;
string
_sps
;
string
_pps
;
H265Track
::
Ptr
_track
;
RtmpPacket
::
Ptr
_lastPacket
;
bool
_lastPacketHasVCL
=
false
;
RtmpPacket
::
Ptr
_rtmp_packet
;
};
}
//namespace mediakit
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论