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
393f123e
Commit
393f123e
authored
6 years ago
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
整理代码 添加注释
parent
0f6a7c16
显示空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
115 行增加
和
43 行删除
+115
-43
src/Player/Frame.h
+17
-2
src/RTP/AACRtpCodec.cpp
+20
-8
src/RTP/AACRtpCodec.h
+31
-13
src/RTP/H264RtpCodec.cpp
+19
-7
src/RTP/H264RtpCodec.h
+28
-13
没有找到文件。
src/Player/Frame.h
查看文件 @
393f123e
...
...
@@ -13,7 +13,16 @@ class Frame : public Buffer {
public
:
typedef
std
::
shared_ptr
<
Frame
>
Ptr
;
virtual
~
Frame
(){}
/**
* 时间戳
*/
virtual
uint32_t
stamp
()
=
0
;
/**
* 前缀长度,譬如264前缀为0x00 00 00 01,那么前缀长度就是4
* aac前缀则为7个字节
*/
virtual
uint32_t
prefixSize
()
=
0
;
};
class
H264Frame
:
public
Frame
{
...
...
@@ -29,15 +38,17 @@ public:
uint32_t
stamp
()
override
{
return
timeStamp
;
}
uint32_t
prefixSize
()
override
{
return
iPrefixSize
;
}
public
:
uint16_t
sequence
;
uint32_t
timeStamp
;
unsigned
char
type
;
string
buffer
;
uint32_t
iPrefixSize
=
4
;
};
//ADTS 头中相对有用的信息 采样率、声道数、帧长度
class
AdtsFrame
:
public
Frame
{
public
:
...
...
@@ -52,6 +63,9 @@ public:
uint32_t
stamp
()
override
{
return
timeStamp
;
}
uint32_t
prefixSize
()
override
{
return
iPrefixSize
;
}
public
:
unsigned
int
syncword
;
//12 bslbf 同步字The bit string ‘1111 1111 1111’,说明一个ADTS帧的开始
unsigned
int
id
;
//1 bslbf MPEG 标示符, 设置为1
...
...
@@ -75,6 +89,7 @@ public:
unsigned
char
buffer
[
2
*
1024
+
7
];
uint16_t
sequence
;
uint32_t
timeStamp
;
uint32_t
iPrefixSize
=
4
;
}
;
...
...
This diff is collapsed.
Click to expand it.
src/RTP/AACRtpCodec.cpp
查看文件 @
393f123e
...
...
@@ -18,12 +18,12 @@ AACRtpEncoder::AACRtpEncoder(uint32_t ui32Ssrc,
}
void
AACRtpEncoder
::
inputFame
(
const
Frame
::
Ptr
&
frame
,
bool
key_pos
)
{
RtpCodec
::
inputFame
(
frame
,
key_pos
);
RtpCodec
::
inputFame
(
frame
,
false
);
GET_CONFIG_AND_REGISTER
(
uint32_t
,
cycleMS
,
Config
::
Rtp
::
kCycleMS
);
auto
uiStamp
=
frame
->
stamp
();
auto
pcData
=
frame
->
data
();
auto
iLen
=
frame
->
size
();
auto
pcData
=
frame
->
data
()
+
frame
->
prefixSize
()
;
auto
iLen
=
frame
->
size
()
-
frame
->
prefixSize
()
;
uiStamp
%=
cycleMS
;
char
*
ptr
=
(
char
*
)
pcData
;
...
...
@@ -87,9 +87,21 @@ void AACRtpEncoder::makeAACRtp(const void *pData, unsigned int uiLen, bool bMark
}
/////////////////////////////////////////////////////////////////////////////////////
AACRtpDecoder
::
AACRtpDecoder
(
uint32_t
ui32SampleRate
)
{
m_adts
=
obtainFrame
();
m_sampleRate
=
ui32SampleRate
;
}
AdtsFrame
::
Ptr
AACRtpDecoder
::
obtainFrame
()
{
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
auto
frame
=
m_framePool
.
obtain
();
frame
->
aac_frame_length
=
7
;
frame
->
iPrefixSize
=
7
;
return
frame
;
}
void
AACRtpDecoder
::
inputRtp
(
const
RtpPacket
::
Ptr
&
rtppack
,
bool
key_pos
)
{
RtpCodec
::
inputRtp
(
rtppack
,
key_pos
);
RtpCodec
::
inputRtp
(
rtppack
,
false
);
int
length
=
rtppack
->
length
-
rtppack
->
offset
;
if
(
m_adts
->
aac_frame_length
+
length
-
4
>
sizeof
(
AdtsFrame
::
buffer
))
{
...
...
@@ -102,7 +114,7 @@ void AACRtpDecoder::inputRtp(const RtpPacket::Ptr &rtppack, bool key_pos) {
if
(
rtppack
->
mark
==
true
)
{
m_adts
->
sequence
=
rtppack
->
sequence
;
//todo(xzl) 此处完成时间戳转换
// m_adts->timeStamp = rtppack->timeStamp * (1000.0 / m_iS
ampleRate);
m_adts
->
timeStamp
=
rtppack
->
timeStamp
*
(
1000.0
/
m_s
ampleRate
);
writeAdtsHeader
(
*
m_adts
,
m_adts
->
buffer
);
onGetAdts
(
m_adts
);
}
...
...
@@ -111,9 +123,9 @@ void AACRtpDecoder::inputRtp(const RtpPacket::Ptr &rtppack, bool key_pos) {
void
AACRtpDecoder
::
onGetAdts
(
const
AdtsFrame
::
Ptr
&
frame
)
{
//写入环形缓存
RtpCodec
::
inputFame
(
frame
,
false
);
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
m_adts
=
m_framePool
.
obtain
();
m_adts
->
aac_frame_length
=
7
;
m_adts
=
obtainFrame
();
}
This diff is collapsed.
Click to expand it.
src/RTP/AACRtpCodec.h
查看文件 @
393f123e
...
...
@@ -5,44 +5,62 @@
#ifndef ZLMEDIAKIT_AACRTPCODEC_H
#define ZLMEDIAKIT_AACRTPCODEC_H
#include "RtpCodec.h"
/**
* aac rtp转adts类
*/
class
AACRtpDecoder
:
public
RtpCodec
{
public
:
AACRtpDecoder
()
{
m_framePool
.
setSize
(
32
);
m_adts
=
m_framePool
.
obtain
();
}
/**
* @param ui32SampleRate 采样率,用于时间戳转换用
*/
AACRtpDecoder
(
uint32_t
ui32SampleRate
);
~
AACRtpDecoder
()
{}
void
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
)
override
;
/**
* 输入rtp并解码
* @param rtp rtp数据包
* @param key_pos 此参数内部强制转换为false,请忽略之
*/
void
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
=
false
)
override
;
private
:
void
onGetAdts
(
const
AdtsFrame
::
Ptr
&
frame
);
AdtsFrame
::
Ptr
obtainFrame
();
private
:
AdtsFrame
::
Ptr
m_adts
;
ResourcePool
<
AdtsFrame
>
m_framePool
;
uint32_t
m_sampleRate
;
};
/**
* aac adts转rtp类
*/
class
AACRtpEncoder
:
public
RtpInfo
,
public
RtpCodec
{
public
:
/**
* @param ui32Ssrc ssrc
* @param ui32MtuSize mtu 大小
* @param ui32SampleRate 采样率
* @param ui8PlayloadType pt类型
* @param ui8Interleaved rtsp interleaved 值
*/
AACRtpEncoder
(
uint32_t
ui32Ssrc
,
uint32_t
ui32MtuSize
,
uint32_t
ui32SampleRate
,
uint8_t
ui8PlayloadType
=
97
,
uint8_t
ui8Interleaved
=
TrackAudio
*
2
);
~
AACRtpEncoder
()
{}
void
inputFame
(
const
Frame
::
Ptr
&
frame
,
bool
key_pos
)
override
;
/**
* 输入aac 数据,必须带dats头
* @param frame 带dats头的aac数据
* @param key_pos 此参数内部强制转换为false,请忽略之
*/
void
inputFame
(
const
Frame
::
Ptr
&
frame
,
bool
key_pos
=
false
)
override
;
private
:
void
makeAACRtp
(
const
void
*
pData
,
unsigned
int
uiLen
,
bool
bMark
,
uint32_t
uiStamp
);
private
:
unsigned
char
m_aucSectionBuf
[
1600
];
};
...
...
This diff is collapsed.
Click to expand it.
src/RTP/H264RtpCodec.cpp
查看文件 @
393f123e
...
...
@@ -4,11 +4,24 @@
#include "H264RtpCodec.h"
H264RtpDecoder
::
H264RtpDecoder
()
{
m_h264frame
=
obtainFrame
();
}
H264Frame
::
Ptr
H264RtpDecoder
::
obtainFrame
()
{
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
auto
frame
=
m_framePool
.
obtain
();
frame
->
buffer
.
clear
();
frame
->
iPrefixSize
=
4
;
return
frame
;
}
void
H264RtpDecoder
::
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
)
{
RtpCodec
::
inputRtp
(
rtp
,
decodeRtp
(
rtp
,
key_pos
));
RtpCodec
::
inputRtp
(
rtp
,
decodeRtp
(
rtp
));
}
bool
H264RtpDecoder
::
decodeRtp
(
const
RtpPacket
::
Ptr
&
rtppack
,
bool
key_pos
)
{
bool
H264RtpDecoder
::
decodeRtp
(
const
RtpPacket
::
Ptr
&
rtppack
)
{
/**
* h264帧类型
* Type==1:P/B frame
...
...
@@ -85,11 +98,10 @@ bool H264RtpDecoder::decodeRtp(const RtpPacket::Ptr &rtppack, bool key_pos) {
void
H264RtpDecoder
::
onGetH264
(
const
H264Frame
::
Ptr
&
frame
)
{
//写入环形缓存
RtpCodec
::
inputFame
(
frame
,
frame
->
type
==
5
);
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
m_h264frame
=
m_framePool
.
obtain
();
m_h264frame
->
buffer
.
clear
();
m_h264frame
=
obtainFrame
();
}
////////////////////////////////////////////////////////////////////////
H264RtpEncoder
::
H264RtpEncoder
(
uint32_t
ui32Ssrc
,
...
...
@@ -109,8 +121,8 @@ void H264RtpEncoder::inputFame(const Frame::Ptr &frame, bool key_pos) {
GET_CONFIG_AND_REGISTER
(
uint32_t
,
cycleMS
,
Config
::
Rtp
::
kCycleMS
);
auto
uiStamp
=
frame
->
stamp
();
auto
pcData
=
frame
->
data
();
auto
iLen
=
frame
->
size
();
auto
pcData
=
frame
->
data
()
+
frame
->
prefixSize
()
;
auto
iLen
=
frame
->
size
()
-
frame
->
prefixSize
()
;
uiStamp
%=
cycleMS
;
int
iSize
=
m_ui32MtuSize
-
2
;
...
...
This diff is collapsed.
Click to expand it.
src/RTP/H264RtpCodec.h
查看文件 @
393f123e
...
...
@@ -10,42 +10,57 @@
using
namespace
ZL
::
Util
;
/**
* h264 rtp解码类
*/
class
H264RtpDecoder
:
public
RtpCodec
{
public
:
H264RtpDecoder
()
{
m_framePool
.
setSize
(
32
);
m_h264frame
=
m_framePool
.
obtain
();
}
H264RtpDecoder
();
~
H264RtpDecoder
()
{}
void
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
)
override
;
/**
* 输入264 rtp包
* @param rtp rtp包
* @param key_pos 此参数忽略之
*/
void
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
=
true
)
override
;
private
:
bool
decodeRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
);
bool
decodeRtp
(
const
RtpPacket
::
Ptr
&
rtp
);
void
onGetH264
(
const
H264Frame
::
Ptr
&
frame
);
H264Frame
::
Ptr
obtainFrame
();
private
:
H264Frame
::
Ptr
m_h264frame
;
ResourcePool
<
H264Frame
>
m_framePool
;
};
/**
* 264 rtp打包类
*/
class
H264RtpEncoder
:
public
RtpInfo
,
public
RtpCodec
{
public
:
/**
* @param ui32Ssrc ssrc
* @param ui32MtuSize mtu大小
* @param ui32SampleRate 采样率,强制为90000
* @param ui8PlayloadType pt类型
* @param ui8Interleaved rtsp interleaved
*/
H264RtpEncoder
(
uint32_t
ui32Ssrc
,
uint32_t
ui32MtuSize
=
1400
,
uint32_t
ui32SampleRate
=
90000
,
uint8_t
ui8PlayloadType
=
96
,
uint8_t
ui8Interleaved
=
TrackVideo
*
2
);
~
H264RtpEncoder
()
{}
/**
* 输入264帧
* @param frame 帧数据,必须
* @param key_pos
*/
void
inputFame
(
const
Frame
::
Ptr
&
frame
,
bool
key_pos
)
override
;
private
:
void
makeH264Rtp
(
const
void
*
pData
,
unsigned
int
uiLen
,
bool
bMark
,
uint32_t
uiStamp
);
private
:
unsigned
char
m_aucSectionBuf
[
1600
];
};
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论