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
1b613c55
Commit
1b613c55
authored
Oct 21, 2018
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
整理Rtp打包解包
parent
8ed20587
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
238 行增加
和
124 行删除
+238
-124
src/Player/PlayerBase.h
+2
-88
src/Player/Track.cpp
+5
-0
src/Player/Track.h
+100
-0
src/RTP/AACRtpCodec.cpp
+19
-17
src/RTP/AACRtpCodec.h
+9
-13
src/RTP/H264RtpCodec.cpp
+90
-3
src/RTP/H264RtpCodec.h
+13
-3
没有找到文件。
src/Player/PlayerBase.h
查看文件 @
1b613c55
...
...
@@ -34,9 +34,10 @@
#include "Player.h"
#include "Network/Socket.h"
#include "Util/mini.h"
#include "Common/MediaSource.h"
#include "Util/RingBuffer.h"
#include "Common/MediaSource.h"
#include "Frame.h"
#include "Track.h"
using
namespace
std
;
using
namespace
ZL
::
Util
;
...
...
@@ -46,93 +47,6 @@ using namespace ZL::Network;
namespace
ZL
{
namespace
Player
{
class
TrackFormat
{
public
:
typedef
std
::
shared_ptr
<
TrackFormat
>
Ptr
;
typedef
RingBuffer
<
Frame
::
Ptr
>
RingType
;
typedef
RingType
::
RingReader
::
Ptr
ReaderType
;
typedef
enum
{
VideoCodecInvalid
=
-
1
,
VideoCodecH264
=
0
,
VideoCodecMax
}
VideoCodecID
;
typedef
enum
{
AudioCodecInvalid
=
-
1
,
AudioCodecAAC
=
0
,
AudioCodecMax
}
AudioCodecID
;
TrackFormat
(){
_ring
=
std
::
make_shared
<
RingType
>
();
}
virtual
~
TrackFormat
(){}
virtual
TrackType
getTrackType
()
const
=
0
;
virtual
int
getCodecId
()
const
=
0
;
ReaderType
attachReader
(
bool
useBuffer
=
false
){
return
_ring
->
attach
(
useBuffer
);
}
void
writeFrame
(
const
Frame
::
Ptr
&
frame
,
bool
keypos
=
true
){
_ring
->
write
(
frame
,
keypos
);
}
private
:
RingType
::
Ptr
_ring
;
};
class
VideoTrackFormat
:
public
TrackFormat
{
public
:
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;};
virtual
int
getVideoHeight
()
const
=
0
;
virtual
int
getVideoWidth
()
const
=
0
;
virtual
float
getVideoFps
()
const
=
0
;
};
class
AudioTrackFormat
:
public
TrackFormat
{
public
:
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;};
virtual
int
getAudioSampleRate
()
const
=
0
;
virtual
int
getAudioSampleBit
()
const
=
0
;
virtual
int
getAudioChannel
()
const
=
0
;
};
class
H264TrackFormat
:
public
VideoTrackFormat
{
public
:
H264TrackFormat
(
const
string
&
sps
,
const
string
&
pps
){
_sps
=
sps
;
_pps
=
pps
;
}
const
string
&
getSps
()
const
{
return
_sps
;
}
const
string
&
getPps
()
const
{
return
_pps
;
}
int
getCodecId
()
const
override
{
return
TrackFormat
::
VideoCodecH264
;
}
private
:
string
_sps
;
string
_pps
;
};
class
AACTrackFormat
:
public
AudioTrackFormat
{
public
:
AACTrackFormat
(
const
string
&
aac_cfg
){
_cfg
=
aac_cfg
;
}
const
string
&
getAacCfg
()
const
{
return
_cfg
;
}
int
getCodecId
()
const
override
{
return
TrackFormat
::
AudioCodecAAC
;
}
private
:
string
_cfg
;
};
class
MediaFormat
{
public
:
virtual
~
MediaFormat
(){};
...
...
src/Player/Track.cpp
0 → 100644
查看文件 @
1b613c55
//
// Created by xzl on 2018/10/21.
//
#include "Track.h"
src/Player/Track.h
0 → 100644
查看文件 @
1b613c55
//
// Created by xzl on 2018/10/21.
//
#ifndef ZLMEDIAKIT_TRACK_H
#define ZLMEDIAKIT_TRACK_H
#include <memory>
#include <string>
#include "Frame.h"
#include "Util/RingBuffer.h"
#include "Rtsp/Rtsp.h"
using
namespace
std
;
using
namespace
ZL
::
Util
;
class
TrackFormat
{
public
:
typedef
std
::
shared_ptr
<
TrackFormat
>
Ptr
;
typedef
RingBuffer
<
Frame
::
Ptr
>
RingType
;
typedef
enum
{
CodecInvalid
=
-
1
,
CodecH264
=
0
,
CodecAAC
=
0x0100
,
CodecMax
}
CodecID
;
TrackFormat
(){
_ring
=
std
::
make_shared
<
RingType
>
();
}
virtual
~
TrackFormat
(){}
virtual
TrackType
getTrackType
()
const
=
0
;
virtual
int
getCodecId
()
const
=
0
;
void
writeFrame
(
const
Frame
::
Ptr
&
frame
,
bool
keypos
=
true
){
_ring
->
write
(
frame
,
keypos
);
}
RingType
::
Ptr
&
getRing
()
{
return
_ring
;
}
private
:
RingType
::
Ptr
_ring
;
};
class
VideoTrackFormat
:
public
TrackFormat
{
public
:
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;};
virtual
int
getVideoHeight
()
const
=
0
;
virtual
int
getVideoWidth
()
const
=
0
;
virtual
float
getVideoFps
()
const
=
0
;
};
class
AudioTrackFormat
:
public
TrackFormat
{
public
:
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;};
virtual
int
getAudioSampleRate
()
const
=
0
;
virtual
int
getAudioSampleBit
()
const
=
0
;
virtual
int
getAudioChannel
()
const
=
0
;
};
class
H264TrackFormat
:
public
VideoTrackFormat
{
public
:
H264TrackFormat
(
const
string
&
sps
,
const
string
&
pps
){
_sps
=
sps
;
_pps
=
pps
;
}
const
string
&
getSps
()
const
{
return
_sps
;
}
const
string
&
getPps
()
const
{
return
_pps
;
}
int
getCodecId
()
const
override
{
return
TrackFormat
::
CodecH264
;
}
private
:
string
_sps
;
string
_pps
;
};
class
AACTrackFormat
:
public
AudioTrackFormat
{
public
:
AACTrackFormat
(
const
string
&
aac_cfg
){
_cfg
=
aac_cfg
;
}
const
string
&
getAacCfg
()
const
{
return
_cfg
;
}
int
getCodecId
()
const
override
{
return
TrackFormat
::
CodecAAC
;
}
private
:
string
_cfg
;
};
#endif //ZLMEDIAKIT_TRACK_H
src/RTP/AACRtp
Encoder
.cpp
→
src/RTP/AACRtp
Codec
.cpp
查看文件 @
1b613c55
...
...
@@ -2,9 +2,9 @@
// Created by xzl on 2018/10/18.
//
#include "AACRtp
Encoder
.h"
#include "AACRtp
Codec
.h"
void
AACRtp
Encoder
::
inputFame
(
const
Frame
::
Ptr
&
frame
,
bool
key_pos
)
{
void
AACRtp
Codec
::
inputFame
(
const
Frame
::
Ptr
&
frame
,
bool
key_pos
)
{
RtpCodec
::
inputFame
(
frame
,
key_pos
);
GET_CONFIG_AND_REGISTER
(
uint32_t
,
cycleMS
,
Config
::
Rtp
::
kCycleMS
);
...
...
@@ -37,7 +37,7 @@ void AACRtpEncoder::inputFame(const Frame::Ptr &frame, bool key_pos) {
}
}
void
AACRtp
Encoder
::
makeAACRtp
(
const
void
*
pData
,
unsigned
int
uiLen
,
bool
bMark
,
uint32_t
uiStamp
)
{
void
AACRtp
Codec
::
makeAACRtp
(
const
void
*
pData
,
unsigned
int
uiLen
,
bool
bMark
,
uint32_t
uiStamp
)
{
uint16_t
u16RtpLen
=
uiLen
+
12
;
m_ui32TimeStamp
=
(
m_ui32SampleRate
/
1000
)
*
uiStamp
;
uint32_t
ts
=
htonl
(
m_ui32TimeStamp
);
...
...
@@ -75,30 +75,32 @@ void AACRtpEncoder::makeAACRtp(const void *pData, unsigned int uiLen, bool bMark
/////////////////////////////////////////////////////////////////////////////////////
void
AACRtp
Decoder
::
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
)
{
RtpCodec
::
inputRtp
(
rtp
,
key_pos
);
void
AACRtp
Codec
::
inputRtp
(
const
RtpPacket
::
Ptr
&
rtppack
,
bool
key_pos
)
{
RtpCodec
::
inputRtp
(
rtp
pack
,
key_pos
);
auto
&
rtppack
=
*
rtp
;
char
*
frame
=
(
char
*
)
rtppack
.
payload
+
rtppack
.
offset
;
int
length
=
rtppack
.
length
-
rtppack
.
offset
;
char
*
frame
=
(
char
*
)
rtppack
->
payload
+
rtppack
->
offset
;
int
length
=
rtppack
->
length
-
rtppack
->
offset
;
if
(
m_adts
->
aac_frame_length
+
length
-
4
>
sizeof
(
AdtsFrame
::
buffer
))
{
m_adts
->
aac_frame_length
=
7
;
WarnL
<<
"aac负载数据太长"
;
return
;
}
memcpy
(
m_adts
->
buffer
+
m_adts
->
aac_frame_length
,
frame
+
4
,
length
-
4
);
m_adts
->
aac_frame_length
+=
(
length
-
4
);
if
(
rtppack
.
mark
==
true
)
{
m_adts
->
sequence
=
rtppack
.
sequence
;
//todo(xzl) 完成时间戳转换
// m_adts->timeStamp = rtppack.timeStamp * (1000.0 / m_iSampleRate);
if
(
rtppack
->
mark
==
true
)
{
m_adts
->
sequence
=
rtppack
->
sequence
;
//todo(xzl) 此处完成时间戳转换
// m_adts->timeStamp = rtppack->timeStamp * (1000.0 / m_iSampleRate);
writeAdtsHeader
(
*
m_adts
,
m_adts
->
buffer
);
RtpCodec
::
inputFame
(
m_adts
,
false
);
m_adts
->
aac_frame_length
=
7
;
onGetAdts
(
m_adts
);
}
return
;
}
AACRtpDecoder
::
AACRtpDecoder
()
{
m_adts
=
std
::
make_shared
<
AdtsFrame
>
();
void
AACRtpCodec
::
onGetAdts
(
const
AdtsFrame
::
Ptr
&
frame
)
{
RtpCodec
::
inputFame
(
frame
,
false
);
m_adts
=
m_framePool
.
obtain
();
m_adts
->
aac_frame_length
=
7
;
}
src/RTP/AACRtp
Encoder
.h
→
src/RTP/AACRtp
Codec
.h
查看文件 @
1b613c55
...
...
@@ -8,34 +8,30 @@
#include "RtpCodec.h"
class
AACRtp
Encoder
:
public
RtpEncoder
{
class
AACRtp
Codec
:
public
RtpEncoder
{
public
:
AACRtp
Encoder
(
uint32_t
ui32Ssrc
,
AACRtp
Codec
(
uint32_t
ui32Ssrc
,
uint32_t
ui32MtuSize
,
uint32_t
ui32SampleRate
,
uint8_t
ui8PlayloadType
=
97
,
uint8_t
ui8Interleaved
=
TrackAudio
*
2
)
:
RtpEncoder
(
ui32Ssrc
,
ui32MtuSize
,
ui32SampleRate
,
ui8PlayloadType
,
ui8Interleaved
)
{
m_framePool
.
setSize
(
32
);
m_adts
=
m_framePool
.
obtain
();
}
~
AACRtp
Encoder
(){}
~
AACRtp
Codec
(){}
void
inputFame
(
const
Frame
::
Ptr
&
frame
,
bool
key_pos
)
override
;
void
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
)
override
;
private
:
void
makeAACRtp
(
const
void
*
pData
,
unsigned
int
uiLen
,
bool
bMark
,
uint32_t
uiStamp
);
void
onGetAdts
(
const
AdtsFrame
::
Ptr
&
frame
);
private
:
unsigned
char
m_aucSectionBuf
[
1600
];
};
class
AACRtpDecoder
:
public
RtpCodec
{
public
:
AACRtpDecoder
();
~
AACRtpDecoder
(){}
void
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
)
override
;
private
:
AdtsFrame
::
Ptr
m_adts
;
ResourcePool
<
AdtsFrame
>
m_framePool
;
};
#endif //ZLMEDIAKIT_AACRTPCODEC_H
src/RTP/H264Rtp
Encoder
.cpp
→
src/RTP/H264Rtp
Codec
.cpp
查看文件 @
1b613c55
...
...
@@ -2,9 +2,9 @@
// Created by xzl on 2018/10/18.
//
#include "H264Rtp
Encoder
.h"
#include "H264Rtp
Codec
.h"
void
H264Rtp
Encoder
::
inputFame
(
const
Frame
::
Ptr
&
frame
,
bool
key_pos
)
{
void
H264Rtp
Codec
::
inputFame
(
const
Frame
::
Ptr
&
frame
,
bool
key_pos
)
{
RtpCodec
::
inputFame
(
frame
,
key_pos
);
GET_CONFIG_AND_REGISTER
(
uint32_t
,
cycleMS
,
Config
::
Rtp
::
kCycleMS
);
...
...
@@ -53,7 +53,7 @@ void H264RtpEncoder::inputFame(const Frame::Ptr &frame, bool key_pos) {
}
}
void
H264Rtp
Encoder
::
makeH264Rtp
(
const
void
*
data
,
unsigned
int
len
,
bool
mark
,
uint32_t
uiStamp
)
{
void
H264Rtp
Codec
::
makeH264Rtp
(
const
void
*
data
,
unsigned
int
len
,
bool
mark
,
uint32_t
uiStamp
)
{
uint16_t
ui16RtpLen
=
len
+
12
;
m_ui32TimeStamp
=
(
m_ui32SampleRate
/
1000
)
*
uiStamp
;
uint32_t
ts
=
htonl
(
m_ui32TimeStamp
);
...
...
@@ -90,3 +90,90 @@ void H264RtpEncoder::makeH264Rtp(const void* data, unsigned int len, bool mark,
RtpCodec
::
inputRtp
(
pRtppkt
,
type
==
5
);
m_ui16Sequence
++
;
}
////////////////////////////////////////////////////////////////////////
void
H264RtpCodec
::
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
)
{
RtpCodec
::
inputRtp
(
rtp
,
decodeRtp
(
rtp
,
key_pos
));
}
bool
H264RtpCodec
::
decodeRtp
(
const
RtpPacket
::
Ptr
&
rtppack
,
bool
key_pos
)
{
/**
* h264帧类型
* Type==1:P/B frame
* Type==5:IDR frame
* Type==6:SEI frame
* Type==7:SPS frame
* Type==8:PPS frame
*/
const
uint8_t
*
frame
=
(
uint8_t
*
)
rtppack
->
payload
+
rtppack
->
offset
;
int
length
=
rtppack
->
length
-
rtppack
->
offset
;
NALU
nal
;
MakeNalu
(
*
frame
,
nal
);
if
(
nal
.
type
>=
0
&&
nal
.
type
<
24
)
{
//a full frame
m_h264frame
->
buffer
.
assign
(
"\x0\x0\x0\x1"
,
4
);
m_h264frame
->
buffer
.
append
((
char
*
)
frame
,
length
);
m_h264frame
->
type
=
nal
.
type
;
m_h264frame
->
timeStamp
=
rtppack
->
timeStamp
/
90
;
m_h264frame
->
sequence
=
rtppack
->
sequence
;
auto
isIDR
=
m_h264frame
->
type
==
5
;
onGetH264
(
m_h264frame
);
return
(
isIDR
);
//i frame
}
if
(
nal
.
type
==
28
)
{
//FU-A
FU
fu
;
MakeFU
(
frame
[
1
],
fu
);
if
(
fu
.
S
==
1
)
{
//FU-A start
char
tmp
=
(
nal
.
forbidden_zero_bit
<<
7
|
nal
.
nal_ref_idc
<<
5
|
fu
.
type
);
m_h264frame
->
buffer
.
assign
(
"\x0\x0\x0\x1"
,
4
);
m_h264frame
->
buffer
.
push_back
(
tmp
);
m_h264frame
->
buffer
.
append
((
char
*
)
frame
+
2
,
length
-
2
);
m_h264frame
->
type
=
fu
.
type
;
m_h264frame
->
timeStamp
=
rtppack
->
timeStamp
/
90
;
m_h264frame
->
sequence
=
rtppack
->
sequence
;
return
(
m_h264frame
->
type
==
5
);
//i frame
}
if
(
rtppack
->
sequence
!=
(
uint16_t
)(
m_h264frame
->
sequence
+
1
))
{
m_h264frame
->
buffer
.
clear
();
WarnL
<<
"丢包,帧废弃:"
<<
rtppack
->
sequence
<<
","
<<
m_h264frame
->
sequence
;
return
false
;
}
m_h264frame
->
sequence
=
rtppack
->
sequence
;
if
(
fu
.
E
==
1
)
{
//FU-A end
m_h264frame
->
buffer
.
append
((
char
*
)
frame
+
2
,
length
-
2
);
m_h264frame
->
timeStamp
=
rtppack
->
timeStamp
/
90
;
auto
isIDR
=
m_h264frame
->
type
==
5
;
onGetH264
(
m_h264frame
);
return
isIDR
;
}
//FU-A mid
m_h264frame
->
buffer
.
append
((
char
*
)
frame
+
2
,
length
-
2
);
return
false
;
}
WarnL
<<
"不支持的rtp类型:"
<<
nal
.
type
<<
" "
<<
rtppack
->
sequence
;
return
false
;
// 29 FU-B 单NAL单元B模式
// 24 STAP-A 单一时间的组合包
// 25 STAP-B 单一时间的组合包
// 26 MTAP16 多个时间的组合包
// 27 MTAP24 多个时间的组合包
// 0 udef
// 30 udef
// 31 udef
}
void
H264RtpCodec
::
onGetH264
(
const
H264Frame
::
Ptr
&
frame
)
{
RtpCodec
::
inputFame
(
frame
,
frame
->
type
==
5
);
m_h264frame
=
m_framePool
.
obtain
();
m_h264frame
->
buffer
.
clear
();
}
src/RTP/H264Rtp
Encoder
.h
→
src/RTP/H264Rtp
Codec
.h
查看文件 @
1b613c55
...
...
@@ -6,23 +6,33 @@
#define ZLMEDIAKIT_H264RTPCODEC_H
#include "RtpCodec.h"
#include "Util/ResourcePool.h"
class
H264RtpEncoder
:
public
RtpEncoder
{
using
namespace
ZL
::
Util
;
class
H264RtpCodec
:
public
RtpEncoder
{
public
:
H264Rtp
Encoder
(
uint32_t
ui32Ssrc
,
H264Rtp
Codec
(
uint32_t
ui32Ssrc
,
uint32_t
ui32MtuSize
=
1400
,
uint32_t
ui32SampleRate
=
90000
,
uint8_t
ui8PlayloadType
=
96
,
uint8_t
ui8Interleaved
=
TrackVideo
*
2
)
:
RtpEncoder
(
ui32Ssrc
,
ui32MtuSize
,
ui32SampleRate
,
ui8PlayloadType
,
ui8Interleaved
)
{
m_framePool
.
setSize
(
32
);
m_h264frame
=
m_framePool
.
obtain
();
}
~
H264Rtp
Encoder
(){}
~
H264Rtp
Codec
(){}
void
inputFame
(
const
Frame
::
Ptr
&
frame
,
bool
key_pos
)
override
;
void
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
)
override
;
private
:
void
makeH264Rtp
(
const
void
*
pData
,
unsigned
int
uiLen
,
bool
bMark
,
uint32_t
uiStamp
);
bool
decodeRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
);
void
onGetH264
(
const
H264Frame
::
Ptr
&
frame
);
private
:
unsigned
char
m_aucSectionBuf
[
1600
];
H264Frame
::
Ptr
m_h264frame
;
ResourcePool
<
H264Frame
>
m_framePool
;
};
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论