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
625d7e30
Commit
625d7e30
authored
May 11, 2020
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
整理和精简代码
parent
41f1df3a
显示空白字符变更
内嵌
并排
正在显示
23 个修改的文件
包含
306 行增加
和
548 行删除
+306
-548
src/Common/Device.cpp
+3
-1
src/Extension/AAC.h
+19
-48
src/Extension/AACRtmp.cpp
+2
-2
src/Extension/AACRtmp.h
+0
-4
src/Extension/AACRtp.cpp
+2
-2
src/Extension/AACRtp.h
+0
-3
src/Extension/Frame.cpp
+67
-3
src/Extension/Frame.h
+95
-112
src/Extension/G711.h
+13
-116
src/Extension/G711Rtmp.cpp
+4
-4
src/Extension/G711Rtmp.h
+0
-4
src/Extension/G711Rtp.cpp
+8
-11
src/Extension/G711Rtp.h
+0
-4
src/Extension/H264.h
+13
-82
src/Extension/H264Rtmp.h
+0
-4
src/Extension/H264Rtp.h
+0
-4
src/Extension/H265.h
+16
-73
src/Extension/H265Rtmp.h
+0
-4
src/Extension/H265Rtp.h
+0
-4
src/Extension/Track.h
+58
-8
src/Rtmp/Rtmp.h
+1
-40
src/Rtp/RtpProcess.cpp
+5
-3
src/Rtsp/Rtsp.h
+0
-12
没有找到文件。
src/Common/Device.cpp
查看文件 @
625d7e30
...
@@ -163,7 +163,9 @@ void DevChannel::inputG711(const char *data, int len, uint32_t dts){
...
@@ -163,7 +163,9 @@ void DevChannel::inputG711(const char *data, int len, uint32_t dts){
if
(
dts
==
0
)
{
if
(
dts
==
0
)
{
dts
=
(
uint32_t
)
_aTicker
[
1
].
elapsedTime
();
dts
=
(
uint32_t
)
_aTicker
[
1
].
elapsedTime
();
}
}
inputFrame
(
std
::
make_shared
<
G711FrameNoCacheAble
>
(
_audio
->
codecId
,
(
char
*
)
data
,
len
,
dts
,
0
));
auto
frame
=
std
::
make_shared
<
G711FrameNoCacheAble
>
((
char
*
)
data
,
len
,
dts
,
0
);
frame
->
setCodec
(
_audio
->
codecId
);
inputFrame
(
frame
);
}
}
void
DevChannel
::
initVideo
(
const
VideoInfo
&
info
)
{
void
DevChannel
::
initVideo
(
const
VideoInfo
&
info
)
{
...
...
src/Extension/AAC.h
查看文件 @
625d7e30
...
@@ -18,20 +18,12 @@ namespace mediakit{
...
@@ -18,20 +18,12 @@ namespace mediakit{
class
AACFrame
;
class
AACFrame
;
unsigned
const
samplingFrequencyTable
[
16
]
=
{
96000
,
88200
,
unsigned
const
samplingFrequencyTable
[
16
]
=
{
96000
,
88200
,
64000
,
48000
,
44100
,
32000
,
24000
,
22050
,
16000
,
12000
,
11025
,
8000
,
7350
,
0
,
0
,
0
};
64000
,
48000
,
44100
,
32000
,
24000
,
22050
,
16000
,
12000
,
11025
,
8000
,
7350
,
0
,
0
,
0
};
void
makeAdtsHeader
(
const
string
&
strAudioCfg
,
AACFrame
&
adts
);
void
makeAdtsHeader
(
const
string
&
strAudioCfg
,
AACFrame
&
adts
);
void
writeAdtsHeader
(
const
AACFrame
&
adts
,
uint8_t
*
pcAdts
)
;
void
writeAdtsHeader
(
const
AACFrame
&
adts
,
uint8_t
*
pcAdts
)
;
string
makeAdtsConfig
(
const
uint8_t
*
pcAdts
);
string
makeAdtsConfig
(
const
uint8_t
*
pcAdts
);
void
getAACInfo
(
const
AACFrame
&
adts
,
int
&
iSampleRate
,
int
&
iChannel
);
void
getAACInfo
(
const
AACFrame
&
adts
,
int
&
iSampleRate
,
int
&
iChannel
);
/**
/**
* aac帧,包含adts头
* aac帧,包含adts头
*/
*/
...
@@ -46,14 +38,10 @@ public:
...
@@ -46,14 +38,10 @@ public:
return
aac_frame_length
;
return
aac_frame_length
;
}
}
uint32_t
dts
()
const
override
{
uint32_t
dts
()
const
override
{
return
timeStamp
;
return
_dts
;
}
}
uint32_t
prefixSize
()
const
override
{
uint32_t
prefixSize
()
const
override
{
return
iPrefixSize
;
return
_prefix_size
;
}
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;
}
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
...
@@ -83,16 +71,16 @@ public:
...
@@ -83,16 +71,16 @@ public:
unsigned
int
copyright_identification_start
;
//1 bslbf
unsigned
int
copyright_identification_start
;
//1 bslbf
unsigned
int
aac_frame_length
;
// 13 bslbf 一个ADTS帧的长度包括ADTS头和raw data block
unsigned
int
aac_frame_length
;
// 13 bslbf 一个ADTS帧的长度包括ADTS头和raw data block
unsigned
int
adts_buffer_fullness
;
//11 bslbf 0x7FF 说明是码率可变的码流
unsigned
int
adts_buffer_fullness
;
//11 bslbf 0x7FF 说明是码率可变的码流
//no_raw_data_blocks_in_frame 表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧.
//no_raw_data_blocks_in_frame 表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧.
//所以说number_of_raw_data_blocks_in_frame == 0
//所以说number_of_raw_data_blocks_in_frame == 0
//表示说ADTS帧中有一个AAC数据块并不是说没有。(一个AAC原始帧包含一段时间内1024个采样及相关数据)
//表示说ADTS帧中有一个AAC数据块并不是说没有。(一个AAC原始帧包含一段时间内1024个采样及相关数据)
unsigned
int
no_raw_data_blocks_in_frame
;
//2 uimsfb
unsigned
int
no_raw_data_blocks_in_frame
;
//2 uimsfb
unsigned
char
buffer
[
2
*
1024
+
7
];
unsigned
char
buffer
[
2
*
1024
+
7
];
uint32_t
timeStamp
;
uint32_t
_dts
;
uint32_t
iPrefixS
ize
=
7
;
uint32_t
_prefix_s
ize
=
7
;
}
;
};
class
AACFrameNoCacheAble
:
public
Frame
NoCacheAble
{
class
AACFrameNoCacheAble
:
public
Frame
FromPtr
{
public
:
public
:
typedef
std
::
shared_ptr
<
AACFrameNoCacheAble
>
Ptr
;
typedef
std
::
shared_ptr
<
AACFrameNoCacheAble
>
Ptr
;
...
@@ -100,11 +88,7 @@ public:
...
@@ -100,11 +88,7 @@ public:
_ptr
=
ptr
;
_ptr
=
ptr
;
_size
=
size
;
_size
=
size
;
_dts
=
dts
;
_dts
=
dts
;
_prefixSize
=
prefixeSize
;
_prefix_size
=
prefixeSize
;
}
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;
}
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
...
@@ -118,8 +102,7 @@ public:
...
@@ -118,8 +102,7 @@ public:
bool
configFrame
()
const
override
{
bool
configFrame
()
const
override
{
return
false
;
return
false
;
}
}
}
;
};
/**
/**
* aac音频通道
* aac音频通道
...
@@ -173,7 +156,6 @@ public:
...
@@ -173,7 +156,6 @@ public:
/**
/**
* 获取aac两个字节的配置
* 获取aac两个字节的配置
* @return
*/
*/
const
string
&
getAacCfg
()
const
{
const
string
&
getAacCfg
()
const
{
return
_cfg
;
return
_cfg
;
...
@@ -181,7 +163,6 @@ public:
...
@@ -181,7 +163,6 @@ public:
/**
/**
* 返回编码类型
* 返回编码类型
* @return
*/
*/
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecAAC
;
return
CodecAAC
;
...
@@ -189,30 +170,27 @@ public:
...
@@ -189,30 +170,27 @@ public:
/**
/**
* 在获取aac_cfg前是无效的Track
* 在获取aac_cfg前是无效的Track
* @return
*/
*/
bool
ready
()
override
{
bool
ready
()
override
{
return
!
_cfg
.
empty
();
return
!
_cfg
.
empty
();
}
}
/**
/**
* 返回音频采样率
* 返回音频采样率
* @return
*/
*/
int
getAudioSampleRate
()
const
override
{
int
getAudioSampleRate
()
const
override
{
return
_sampleRate
;
return
_sampleRate
;
}
}
/**
/**
* 返回音频采样位数,一般为16或8
* 返回音频采样位数,一般为16或8
* @return
*/
*/
int
getAudioSampleBit
()
const
override
{
int
getAudioSampleBit
()
const
override
{
return
_sampleBit
;
return
_sampleBit
;
}
}
/**
/**
* 返回音频通道数
* 返回音频通道数
* @return
*/
*/
int
getAudioChannel
()
const
override
{
int
getAudioChannel
()
const
override
{
return
_channel
;
return
_channel
;
...
@@ -247,6 +225,7 @@ private:
...
@@ -247,6 +225,7 @@ private:
makeAdtsHeader
(
_cfg
,
aacFrame
);
makeAdtsHeader
(
_cfg
,
aacFrame
);
getAACInfo
(
aacFrame
,
_sampleRate
,
_channel
);
getAACInfo
(
aacFrame
,
_sampleRate
,
_channel
);
}
}
Track
::
Ptr
clone
()
override
{
Track
::
Ptr
clone
()
override
{
return
std
::
make_shared
<
std
::
remove_reference
<
decltype
(
*
this
)
>::
type
>
(
*
this
);
return
std
::
make_shared
<
std
::
remove_reference
<
decltype
(
*
this
)
>::
type
>
(
*
this
);
}
}
...
@@ -260,15 +239,13 @@ private:
...
@@ -260,15 +239,13 @@ private:
int
_channel
=
0
;
int
_channel
=
0
;
};
};
/**
/**
* aac类型SDP
* aac类型SDP
*/
*/
class
AACSdp
:
public
Sdp
{
class
AACSdp
:
public
Sdp
{
public
:
public
:
/**
/**
*
*
构造函数
* @param aac_cfg aac两个字节的配置描述
* @param aac_cfg aac两个字节的配置描述
* @param sample_rate 音频采样率
* @param sample_rate 音频采样率
* @param playload_type rtp playload type 默认98
* @param playload_type rtp playload type 默认98
...
@@ -288,16 +265,13 @@ public:
...
@@ -288,16 +265,13 @@ public:
_printer
<<
"a=fmtp:"
<<
playload_type
<<
" streamtype=5;profile-level-id=1;mode=AAC-hbr;"
_printer
<<
"a=fmtp:"
<<
playload_type
<<
" streamtype=5;profile-level-id=1;mode=AAC-hbr;"
<<
"sizelength=13;indexlength=3;indexdeltalength=3;config="
<<
"sizelength=13;indexlength=3;indexdeltalength=3;config="
<<
configStr
<<
"
\r\n
"
;
<<
configStr
<<
"
\r\n
"
;
_printer
<<
"a=control:trackID="
<<
getTrackType
()
<<
"
\r\n
"
;
_printer
<<
"a=control:trackID="
<<
(
int
)
TrackAudio
<<
"
\r\n
"
;
}
}
string
getSdp
()
const
override
{
string
getSdp
()
const
override
{
return
_printer
;
return
_printer
;
}
}
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecAAC
;
return
CodecAAC
;
}
}
...
@@ -306,6 +280,4 @@ private:
...
@@ -306,6 +280,4 @@ private:
};
};
}
//namespace mediakit
}
//namespace mediakit
#endif //ZLMEDIAKIT_AAC_H
#endif //ZLMEDIAKIT_AAC_H
\ No newline at end of file
src/Extension/AACRtmp.cpp
查看文件 @
625d7e30
...
@@ -21,7 +21,7 @@ AACFrame::Ptr AACRtmpDecoder::obtainFrame() {
...
@@ -21,7 +21,7 @@ AACFrame::Ptr AACRtmpDecoder::obtainFrame() {
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
auto
frame
=
ResourcePoolHelper
<
AACFrame
>::
obtainObj
();
auto
frame
=
ResourcePoolHelper
<
AACFrame
>::
obtainObj
();
frame
->
aac_frame_length
=
7
;
frame
->
aac_frame_length
=
7
;
frame
->
iPrefixS
ize
=
7
;
frame
->
_prefix_s
ize
=
7
;
return
frame
;
return
frame
;
}
}
...
@@ -63,7 +63,7 @@ void AACRtmpDecoder::onGetAAC(const char* pcData, int iLen, uint32_t ui32TimeSta
...
@@ -63,7 +63,7 @@ void AACRtmpDecoder::onGetAAC(const char* pcData, int iLen, uint32_t ui32TimeSta
//拷贝aac负载
//拷贝aac负载
memcpy
(
_adts
->
buffer
+
7
,
pcData
,
iLen
);
memcpy
(
_adts
->
buffer
+
7
,
pcData
,
iLen
);
_adts
->
aac_frame_length
=
7
+
iLen
;
_adts
->
aac_frame_length
=
7
+
iLen
;
_adts
->
timeStamp
=
ui32TimeStamp
;
_adts
->
_dts
=
ui32TimeStamp
;
//adts结构头转成头7个字节
//adts结构头转成头7个字节
writeAdtsHeader
(
*
_adts
,
_adts
->
buffer
);
writeAdtsHeader
(
*
_adts
,
_adts
->
buffer
);
...
...
src/Extension/AACRtmp.h
查看文件 @
625d7e30
...
@@ -33,10 +33,6 @@ public:
...
@@ -33,10 +33,6 @@ public:
*/
*/
bool
inputRtmp
(
const
RtmpPacket
::
Ptr
&
Rtmp
,
bool
key_pos
=
false
)
override
;
bool
inputRtmp
(
const
RtmpPacket
::
Ptr
&
Rtmp
,
bool
key_pos
=
false
)
override
;
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecAAC
;
return
CodecAAC
;
}
}
...
...
src/Extension/AACRtp.cpp
查看文件 @
625d7e30
...
@@ -78,7 +78,7 @@ AACFrame::Ptr AACRtpDecoder::obtainFrame() {
...
@@ -78,7 +78,7 @@ AACFrame::Ptr AACRtpDecoder::obtainFrame() {
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
auto
frame
=
ResourcePoolHelper
<
AACFrame
>::
obtainObj
();
auto
frame
=
ResourcePoolHelper
<
AACFrame
>::
obtainObj
();
frame
->
aac_frame_length
=
ADTS_HEADER_LEN
;
frame
->
aac_frame_length
=
ADTS_HEADER_LEN
;
frame
->
iPrefixS
ize
=
ADTS_HEADER_LEN
;
frame
->
_prefix_s
ize
=
ADTS_HEADER_LEN
;
if
(
frame
->
syncword
==
0
&&
!
_aac_cfg
.
empty
())
{
if
(
frame
->
syncword
==
0
&&
!
_aac_cfg
.
empty
())
{
makeAdtsHeader
(
_aac_cfg
,
*
frame
);
makeAdtsHeader
(
_aac_cfg
,
*
frame
);
}
}
...
@@ -109,7 +109,7 @@ bool AACRtpDecoder::inputRtp(const RtpPacket::Ptr &rtppack, bool key_pos) {
...
@@ -109,7 +109,7 @@ bool AACRtpDecoder::inputRtp(const RtpPacket::Ptr &rtppack, bool key_pos) {
//追加aac数据
//追加aac数据
memcpy
(
_adts
->
buffer
+
_adts
->
aac_frame_length
,
ptr
,
size
);
memcpy
(
_adts
->
buffer
+
_adts
->
aac_frame_length
,
ptr
,
size
);
_adts
->
aac_frame_length
+=
size
;
_adts
->
aac_frame_length
+=
size
;
_adts
->
timeStamp
=
rtppack
->
timeStamp
;
_adts
->
_dts
=
rtppack
->
timeStamp
;
ptr
+=
size
;
ptr
+=
size
;
}
}
...
...
src/Extension/AACRtp.h
查看文件 @
625d7e30
...
@@ -31,9 +31,6 @@ public:
...
@@ -31,9 +31,6 @@ public:
*/
*/
bool
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
=
false
)
override
;
bool
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
=
false
)
override
;
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecAAC
;
return
CodecAAC
;
}
}
...
...
src/Extension/Frame.cpp
查看文件 @
625d7e30
...
@@ -15,6 +15,59 @@ using namespace toolkit;
...
@@ -15,6 +15,59 @@ using namespace toolkit;
namespace
mediakit
{
namespace
mediakit
{
/**
* 该对象的功能是把一个不可缓存的帧转换成可缓存的帧
*/
class
FrameCacheAble
:
public
FrameFromPtr
{
public
:
typedef
std
::
shared_ptr
<
FrameCacheAble
>
Ptr
;
FrameCacheAble
(
const
Frame
::
Ptr
&
frame
){
if
(
frame
->
cacheAble
()){
_frame
=
frame
;
_ptr
=
frame
->
data
();
}
else
{
_buffer
=
std
::
make_shared
<
BufferRaw
>
();
_buffer
->
assign
(
frame
->
data
(),
frame
->
size
());
_ptr
=
_buffer
->
data
();
}
_size
=
frame
->
size
();
_dts
=
frame
->
dts
();
_pts
=
frame
->
pts
();
_prefix_size
=
frame
->
prefixSize
();
_codecid
=
frame
->
getCodecId
();
_key
=
frame
->
keyFrame
();
_config
=
frame
->
configFrame
();
}
virtual
~
FrameCacheAble
()
=
default
;
/**
* 可以被缓存
*/
bool
cacheAble
()
const
override
{
return
true
;
}
CodecId
getCodecId
()
const
override
{
return
_codecid
;
}
bool
keyFrame
()
const
override
{
return
_key
;
}
bool
configFrame
()
const
override
{
return
_config
;
}
private
:
Frame
::
Ptr
_frame
;
BufferRaw
::
Ptr
_buffer
;
CodecId
_codecid
;
bool
_key
;
bool
_config
;
};
Frame
::
Ptr
Frame
::
getCacheAbleFrame
(
const
Frame
::
Ptr
&
frame
){
Frame
::
Ptr
Frame
::
getCacheAbleFrame
(
const
Frame
::
Ptr
&
frame
){
if
(
frame
->
cacheAble
()){
if
(
frame
->
cacheAble
()){
return
frame
;
return
frame
;
...
@@ -30,10 +83,21 @@ const char *CodecInfo::getCodecName() {
...
@@ -30,10 +83,21 @@ const char *CodecInfo::getCodecName() {
SWITCH_CASE
(
CodecAAC
);
SWITCH_CASE
(
CodecAAC
);
SWITCH_CASE
(
CodecG711A
);
SWITCH_CASE
(
CodecG711A
);
SWITCH_CASE
(
CodecG711U
);
SWITCH_CASE
(
CodecG711U
);
default
:
SWITCH_CASE
(
CodecOpus
);
return
"unknown codec"
;
default
:
return
"unknown codec"
;
}
}
}
}
}
//namespace mediakit
TrackType
CodecInfo
::
getTrackType
(){
switch
(
getCodecId
()){
case
CodecH264
:
case
CodecH265
:
return
TrackVideo
;
case
CodecAAC
:
case
CodecG711A
:
case
CodecG711U
:
case
CodecOpus
:
return
TrackAudio
;
default
:
return
TrackInvalid
;
}
}
}
//namespace mediakit
src/Extension/Frame.h
查看文件 @
625d7e30
...
@@ -28,6 +28,7 @@ typedef enum {
...
@@ -28,6 +28,7 @@ typedef enum {
CodecAAC
,
CodecAAC
,
CodecG711A
,
CodecG711A
,
CodecG711U
,
CodecG711U
,
CodecOpus
,
CodecMax
=
0x7FFF
CodecMax
=
0x7FFF
}
CodecId
;
}
CodecId
;
...
@@ -50,20 +51,19 @@ public:
...
@@ -50,20 +51,19 @@ public:
virtual
~
CodecInfo
(){}
virtual
~
CodecInfo
(){}
/**
/**
* 获取音视频类型
*/
virtual
TrackType
getTrackType
()
const
=
0
;
/**
* 获取编解码器类型
* 获取编解码器类型
*/
*/
virtual
CodecId
getCodecId
()
const
=
0
;
virtual
CodecId
getCodecId
()
const
=
0
;
/**
/**
* 获取编码器名称
* 获取编码器名称
* @return 编码器名称
*/
*/
const
char
*
getCodecName
();
const
char
*
getCodecName
();
/**
* 获取音视频类型
*/
TrackType
getTrackType
();
};
};
/**
/**
...
@@ -76,15 +76,11 @@ public:
...
@@ -76,15 +76,11 @@ public:
/**
/**
* 返回解码时间戳,单位毫秒
* 返回解码时间戳,单位毫秒
* @return
*/
*/
virtual
uint32_t
dts
()
const
=
0
;
virtual
uint32_t
dts
()
const
=
0
;
/**
/**
* 返回显示时间戳,单位毫秒
* 返回显示时间戳,单位毫秒
* @return
*/
*/
virtual
uint32_t
pts
()
const
{
virtual
uint32_t
pts
()
const
{
return
dts
();
return
dts
();
...
@@ -98,13 +94,11 @@ public:
...
@@ -98,13 +94,11 @@ public:
/**
/**
* 返回是否为关键帧
* 返回是否为关键帧
* @return
*/
*/
virtual
bool
keyFrame
()
const
=
0
;
virtual
bool
keyFrame
()
const
=
0
;
/**
/**
* 是否为配置帧,譬如sps pps vps
* 是否为配置帧,譬如sps pps vps
* @return
*/
*/
virtual
bool
configFrame
()
const
=
0
;
virtual
bool
configFrame
()
const
=
0
;
...
@@ -115,14 +109,77 @@ public:
...
@@ -115,14 +109,77 @@ public:
/**
/**
* 返回可缓存的frame
* 返回可缓存的frame
* @return
*/
*/
static
Ptr
getCacheAbleFrame
(
const
Ptr
&
frame
);
static
Ptr
getCacheAbleFrame
(
const
Ptr
&
frame
);
};
};
class
FrameImp
:
public
Frame
{
public
:
typedef
std
::
shared_ptr
<
FrameImp
>
Ptr
;
char
*
data
()
const
override
{
return
(
char
*
)
_buffer
.
data
();
}
uint32_t
size
()
const
override
{
return
_buffer
.
size
();
}
uint32_t
dts
()
const
override
{
return
_dts
;
}
uint32_t
pts
()
const
override
{
return
_pts
?
_pts
:
_dts
;
}
uint32_t
prefixSize
()
const
override
{
return
_prefix_size
;
}
CodecId
getCodecId
()
const
override
{
return
_codecid
;
}
bool
keyFrame
()
const
override
{
return
false
;
}
bool
configFrame
()
const
override
{
return
false
;
}
public
:
CodecId
_codecid
=
CodecInvalid
;
string
_buffer
;
uint32_t
_dts
=
0
;
uint32_t
_pts
=
0
;
uint32_t
_prefix_size
=
0
;
};
/**
* 一个Frame类中可以有多个帧,他们通过 0x 00 00 01 分隔
* ZLMediaKit会先把这种复合帧split成单个帧然后再处理
* 一个复合帧可以通过无内存拷贝的方式切割成多个子Frame
* 提供该类的目的是切割复合帧时防止内存拷贝,提高性能
*/
template
<
typename
Parent
>
class
FrameInternal
:
public
Parent
{
public
:
typedef
std
::
shared_ptr
<
FrameInternal
>
Ptr
;
FrameInternal
(
const
Frame
::
Ptr
&
parent_frame
,
char
*
ptr
,
uint32_t
size
,
int
prefix_size
)
:
Parent
(
ptr
,
size
,
parent_frame
->
dts
(),
parent_frame
->
pts
(),
prefix_size
)
{
_parent_frame
=
parent_frame
;
}
bool
cacheAble
()
const
override
{
return
_parent_frame
->
cacheAble
();
}
private
:
Frame
::
Ptr
_parent_frame
;
};
/**
/**
* 循环池辅助类
* 循环池辅助类
* @tparam T
*/
*/
template
<
typename
T
>
template
<
typename
T
>
class
ResourcePoolHelper
{
class
ResourcePoolHelper
{
...
@@ -140,17 +197,16 @@ private:
...
@@ -140,17 +197,16 @@ private:
};
};
/**
/**
* 写帧接口的抽
闲接口
* 写帧接口的抽
象接口类
*/
*/
class
FrameWriterInterface
{
class
FrameWriterInterface
{
public
:
public
:
typedef
std
::
shared_ptr
<
FrameWriterInterface
>
Ptr
;
typedef
std
::
shared_ptr
<
FrameWriterInterface
>
Ptr
;
FrameWriterInterface
(){}
FrameWriterInterface
(){}
virtual
~
FrameWriterInterface
(){}
virtual
~
FrameWriterInterface
(){}
/**
/**
* 写入帧数据
* 写入帧数据
* @param frame 帧
*/
*/
virtual
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
=
0
;
virtual
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
=
0
;
};
};
...
@@ -165,15 +221,15 @@ public:
...
@@ -165,15 +221,15 @@ public:
/**
/**
* inputFrame后触发onWriteFrame回调
* inputFrame后触发onWriteFrame回调
* @param cb
*/
*/
FrameWriterInterfaceHelper
(
const
onWriteFrame
&
cb
){
FrameWriterInterfaceHelper
(
const
onWriteFrame
&
cb
){
_writeCallback
=
cb
;
_writeCallback
=
cb
;
}
}
virtual
~
FrameWriterInterfaceHelper
(){}
virtual
~
FrameWriterInterfaceHelper
(){}
/**
/**
* 写入帧数据
* 写入帧数据
* @param frame 帧
*/
*/
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
override
{
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
override
{
_writeCallback
(
frame
);
_writeCallback
(
frame
);
...
@@ -182,7 +238,6 @@ private:
...
@@ -182,7 +238,6 @@ private:
onWriteFrame
_writeCallback
;
onWriteFrame
_writeCallback
;
};
};
/**
/**
* 支持代理转发的帧环形缓存
* 支持代理转发的帧环形缓存
*/
*/
...
@@ -193,6 +248,9 @@ public:
...
@@ -193,6 +248,9 @@ public:
FrameDispatcher
(){}
FrameDispatcher
(){}
virtual
~
FrameDispatcher
(){}
virtual
~
FrameDispatcher
(){}
/**
* 添加代理
*/
void
addDelegate
(
const
FrameWriterInterface
::
Ptr
&
delegate
){
void
addDelegate
(
const
FrameWriterInterface
::
Ptr
&
delegate
){
//_delegates_write可能多线程同时操作
//_delegates_write可能多线程同时操作
lock_guard
<
mutex
>
lck
(
_mtx
);
lock_guard
<
mutex
>
lck
(
_mtx
);
...
@@ -200,6 +258,9 @@ public:
...
@@ -200,6 +258,9 @@ public:
_need_update
=
true
;
_need_update
=
true
;
}
}
/**
* 删除代理
*/
void
delDelegate
(
void
*
ptr
){
void
delDelegate
(
void
*
ptr
){
//_delegates_write可能多线程同时操作
//_delegates_write可能多线程同时操作
lock_guard
<
mutex
>
lck
(
_mtx
);
lock_guard
<
mutex
>
lck
(
_mtx
);
...
@@ -208,8 +269,7 @@ public:
...
@@ -208,8 +269,7 @@ public:
}
}
/**
/**
* 写入帧数据
* 写入帧并派发
* @param frame 帧
*/
*/
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
override
{
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
override
{
if
(
_need_update
){
if
(
_need_update
){
...
@@ -223,7 +283,13 @@ public:
...
@@ -223,7 +283,13 @@ public:
for
(
auto
&
pr
:
_delegates_read
){
for
(
auto
&
pr
:
_delegates_read
){
pr
.
second
->
inputFrame
(
frame
);
pr
.
second
->
inputFrame
(
frame
);
}
}
}
/**
* 返回代理个数
*/
int
size
()
const
{
return
_delegates_write
.
size
();
}
}
private
:
private
:
mutex
_mtx
;
mutex
_mtx
;
...
@@ -250,105 +316,23 @@ public:
...
@@ -250,105 +316,23 @@ public:
}
}
uint32_t
pts
()
const
override
{
uint32_t
pts
()
const
override
{
if
(
_pts
){
return
_pts
?
_pts
:
dts
();
return
_pts
;
}
return
dts
();
}
}
uint32_t
prefixSize
()
const
override
{
uint32_t
prefixSize
()
const
override
{
return
_prefixSize
;
return
_prefix_size
;
}
bool
cacheAble
()
const
override
{
return
false
;
}
}
protected
:
protected
:
char
*
_ptr
;
char
*
_ptr
;
uint32_t
_size
;
uint32_t
_size
;
uint32_t
_dts
;
uint32_t
_dts
;
uint32_t
_pts
=
0
;
uint32_t
_pts
=
0
;
uint32_t
_prefixSize
;
uint32_t
_prefix_size
;
};
/**
* 不可缓存的帧,在DevChannel类中有用到。
* 该帧类型用于防止内存拷贝,直接使用指针传递数据
* 在大多数情况下,ZLMediaKit是同步对帧数据进行使用和处理的
* 所以提供此类型的帧很有必要,但是有时又无法避免缓存帧做后续处理
* 所以可以通过Frame::getCacheAbleFrame方法拷贝一个可缓存的帧
*/
class
FrameNoCacheAble
:
public
FrameFromPtr
{
public
:
typedef
std
::
shared_ptr
<
FrameNoCacheAble
>
Ptr
;
/**
* 该帧不可缓存
* @return
*/
bool
cacheAble
()
const
override
{
return
false
;
}
};
};
/**
* 该对象的功能是把一个不可缓存的帧转换成可缓存的帧
* @see FrameNoCacheAble
*/
class
FrameCacheAble
:
public
FrameFromPtr
{
public
:
typedef
std
::
shared_ptr
<
FrameCacheAble
>
Ptr
;
FrameCacheAble
(
const
Frame
::
Ptr
&
frame
){
if
(
frame
->
cacheAble
()){
_frame
=
frame
;
_ptr
=
frame
->
data
();
}
else
{
_buffer
=
std
::
make_shared
<
BufferRaw
>
();
_buffer
->
assign
(
frame
->
data
(),
frame
->
size
());
_ptr
=
_buffer
->
data
();
}
_size
=
frame
->
size
();
_dts
=
frame
->
dts
();
_pts
=
frame
->
pts
();
_prefixSize
=
frame
->
prefixSize
();
_trackType
=
frame
->
getTrackType
();
_codec
=
frame
->
getCodecId
();
_key
=
frame
->
keyFrame
();
_config
=
frame
->
configFrame
();
}
virtual
~
FrameCacheAble
()
=
default
;
/**
* 可以被缓存
* @return
*/
bool
cacheAble
()
const
override
{
return
true
;
}
TrackType
getTrackType
()
const
override
{
return
_trackType
;
}
CodecId
getCodecId
()
const
override
{
return
_codec
;
}
bool
keyFrame
()
const
override
{
return
_key
;
}
bool
configFrame
()
const
override
{
return
_config
;
}
private
:
Frame
::
Ptr
_frame
;
BufferRaw
::
Ptr
_buffer
;
TrackType
_trackType
;
CodecId
_codec
;
bool
_key
;
bool
_config
;
};
}
//namespace mediakit
}
//namespace mediakit
#endif //ZLMEDIAKIT_FRAME_H
#endif //ZLMEDIAKIT_FRAME_H
\ No newline at end of file
src/Extension/G711.h
查看文件 @
625d7e30
...
@@ -19,76 +19,28 @@ namespace mediakit{
...
@@ -19,76 +19,28 @@ namespace mediakit{
/**
/**
* G711帧
* G711帧
*/
*/
class
G711Frame
:
public
Frame
{
class
G711Frame
:
public
Frame
Imp
{
public
:
public
:
typedef
std
::
shared_ptr
<
G711Frame
>
Ptr
;
G711Frame
(){
_codecid
=
CodecG711A
;
char
*
data
()
const
override
{
return
(
char
*
)
buffer
.
data
();
}
uint32_t
size
()
const
override
{
return
buffer
.
size
();
}
uint32_t
dts
()
const
override
{
return
timeStamp
;
}
uint32_t
prefixSize
()
const
override
{
return
0
;
}
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;
}
CodecId
getCodecId
()
const
override
{
return
_codecId
;
}
bool
keyFrame
()
const
override
{
return
false
;
}
bool
configFrame
()
const
override
{
return
false
;
}
}
public
:
};
CodecId
_codecId
=
CodecG711A
;
string
buffer
;
uint32_t
timeStamp
;
}
;
class
G711FrameNoCacheAble
:
public
Frame
NoCacheAble
{
class
G711FrameNoCacheAble
:
public
Frame
FromPtr
{
public
:
public
:
typedef
std
::
shared_ptr
<
G711FrameNoCacheAble
>
Ptr
;
typedef
std
::
shared_ptr
<
G711FrameNoCacheAble
>
Ptr
;
//兼容通用接口
G711FrameNoCacheAble
(
char
*
ptr
,
uint32_t
size
,
uint32_t
dts
,
uint32_t
pts
=
0
,
int
prefix_size
=
0
){
G711FrameNoCacheAble
(
char
*
ptr
,
uint32_t
size
,
uint32_t
dts
,
uint32_t
pts
=
0
,
int
prefixeSize
=
0
){
_ptr
=
ptr
;
_ptr
=
ptr
;
_size
=
size
;
_size
=
size
;
_dts
=
dts
;
_dts
=
dts
;
_prefix
Size
=
prefixeS
ize
;
_prefix
_size
=
prefix_s
ize
;
}
}
//兼容通用接口
void
setCodec
(
CodecId
codecId
){
void
setCodec
(
CodecId
codecId
){
_codecId
=
codecId
;
_codecId
=
codecId
;
}
}
G711FrameNoCacheAble
(
CodecId
codecId
,
char
*
ptr
,
uint32_t
size
,
uint32_t
dts
,
int
prefixeSize
=
0
){
_codecId
=
codecId
;
_ptr
=
ptr
;
_size
=
size
;
_dts
=
dts
;
_prefixSize
=
prefixeSize
;
}
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
_codecId
;
return
_codecId
;
}
}
...
@@ -108,67 +60,18 @@ private:
...
@@ -108,67 +60,18 @@ private:
/**
/**
* G711音频通道
* G711音频通道
*/
*/
class
G711Track
:
public
AudioTrack
{
class
G711Track
:
public
AudioTrack
Imp
{
public
:
public
:
typedef
std
::
shared_ptr
<
G711Track
>
Ptr
;
typedef
std
::
shared_ptr
<
G711Track
>
Ptr
;
G711Track
(
CodecId
codecId
,
int
sample_rate
,
int
channels
,
int
sample_bit
)
:
AudioTrackImp
(
codecId
,
sample_rate
,
channels
,
sample_bit
){}
/**
* G711A G711U
*/
G711Track
(
CodecId
codecId
,
int
sample_rate
,
int
channels
,
int
sample_bit
){
_codecid
=
codecId
;
_sample_rate
=
sample_rate
;
_channels
=
channels
;
_sample_bit
=
sample_bit
;
}
/**
* 返回编码类型
*/
CodecId
getCodecId
()
const
override
{
return
_codecid
;
}
/**
* 是否已经初始化
*/
bool
ready
()
override
{
return
true
;
}
/**
* 返回音频采样率
*/
int
getAudioSampleRate
()
const
override
{
return
_sample_rate
;
}
/**
* 返回音频采样位数,一般为16或8
*/
int
getAudioSampleBit
()
const
override
{
return
_sample_bit
;
}
/**
* 返回音频通道数
*/
int
getAudioChannel
()
const
override
{
return
_channels
;
}
private
:
private
:
//克隆该Track
Track
::
Ptr
clone
()
override
{
Track
::
Ptr
clone
()
override
{
return
std
::
make_shared
<
std
::
remove_reference
<
decltype
(
*
this
)
>::
type
>
(
*
this
);
return
std
::
make_shared
<
std
::
remove_reference
<
decltype
(
*
this
)
>::
type
>
(
*
this
);
}
}
//生成sdp
//生成sdp
Sdp
::
Ptr
getSdp
()
override
;
Sdp
::
Ptr
getSdp
()
override
;
private
:
CodecId
_codecid
;
int
_sample_rate
;
int
_channels
;
int
_sample_bit
;
};
};
/**
/**
...
@@ -190,27 +93,20 @@ public:
...
@@ -190,27 +93,20 @@ public:
int
bitrate
=
128
)
:
Sdp
(
sample_rate
,
playload_type
),
_codecId
(
codecId
){
int
bitrate
=
128
)
:
Sdp
(
sample_rate
,
playload_type
),
_codecId
(
codecId
){
_printer
<<
"m=audio 0 RTP/AVP "
<<
playload_type
<<
"
\r\n
"
;
_printer
<<
"m=audio 0 RTP/AVP "
<<
playload_type
<<
"
\r\n
"
;
_printer
<<
"a=rtpmap:"
<<
playload_type
<<
(
codecId
==
CodecG711A
?
" PCMA/"
:
" PCMU/"
)
<<
sample_rate
<<
"/"
<<
channels
<<
"
\r\n
"
;
_printer
<<
"a=rtpmap:"
<<
playload_type
<<
(
codecId
==
CodecG711A
?
" PCMA/"
:
" PCMU/"
)
<<
sample_rate
<<
"/"
<<
channels
<<
"
\r\n
"
;
_printer
<<
"a=control:trackID="
<<
getTrackType
()
<<
"
\r\n
"
;
_printer
<<
"a=control:trackID="
<<
(
int
)
TrackAudio
<<
"
\r\n
"
;
}
}
string
getSdp
()
const
override
{
string
getSdp
()
const
override
{
return
_printer
;
return
_printer
;
}
}
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
_codecId
;
return
_codecId
;
}
}
private
:
private
:
_StrPrinter
_printer
;
_StrPrinter
_printer
;
CodecId
_codecId
;
CodecId
_codecId
;
};
};
}
//namespace mediakit
}
//namespace mediakit
#endif //ZLMEDIAKIT_G711_H
\ No newline at end of file
#endif //ZLMEDIAKIT_AAC_H
src/Extension/G711Rtmp.cpp
查看文件 @
625d7e30
...
@@ -20,15 +20,15 @@ G711RtmpDecoder::G711RtmpDecoder(CodecId codecId) {
...
@@ -20,15 +20,15 @@ G711RtmpDecoder::G711RtmpDecoder(CodecId codecId) {
G711Frame
::
Ptr
G711RtmpDecoder
::
obtainFrame
()
{
G711Frame
::
Ptr
G711RtmpDecoder
::
obtainFrame
()
{
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
auto
frame
=
ResourcePoolHelper
<
G711Frame
>::
obtainObj
();
auto
frame
=
ResourcePoolHelper
<
G711Frame
>::
obtainObj
();
frame
->
buffer
.
clear
();
frame
->
_
buffer
.
clear
();
frame
->
_codec
I
d
=
_codecId
;
frame
->
_codec
i
d
=
_codecId
;
return
frame
;
return
frame
;
}
}
bool
G711RtmpDecoder
::
inputRtmp
(
const
RtmpPacket
::
Ptr
&
pkt
,
bool
)
{
bool
G711RtmpDecoder
::
inputRtmp
(
const
RtmpPacket
::
Ptr
&
pkt
,
bool
)
{
//拷贝G711负载
//拷贝G711负载
_frame
->
buffer
.
assign
(
pkt
->
strBuf
.
data
()
+
1
,
pkt
->
strBuf
.
size
()
-
1
);
_frame
->
_
buffer
.
assign
(
pkt
->
strBuf
.
data
()
+
1
,
pkt
->
strBuf
.
size
()
-
1
);
_frame
->
timeStamp
=
pkt
->
timeStamp
;
_frame
->
_dts
=
pkt
->
timeStamp
;
//写入环形缓存
//写入环形缓存
RtmpCodec
::
inputFrame
(
_frame
);
RtmpCodec
::
inputFrame
(
_frame
);
_frame
=
obtainFrame
();
_frame
=
obtainFrame
();
...
...
src/Extension/G711Rtmp.h
查看文件 @
625d7e30
...
@@ -33,10 +33,6 @@ public:
...
@@ -33,10 +33,6 @@ public:
*/
*/
bool
inputRtmp
(
const
RtmpPacket
::
Ptr
&
Rtmp
,
bool
key_pos
=
false
)
override
;
bool
inputRtmp
(
const
RtmpPacket
::
Ptr
&
Rtmp
,
bool
key_pos
=
false
)
override
;
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
_codecId
;
return
_codecId
;
}
}
...
...
src/Extension/G711Rtp.cpp
查看文件 @
625d7e30
...
@@ -20,9 +20,9 @@ G711RtpDecoder::G711RtpDecoder(const Track::Ptr &track){
...
@@ -20,9 +20,9 @@ G711RtpDecoder::G711RtpDecoder(const Track::Ptr &track){
G711Frame
::
Ptr
G711RtpDecoder
::
obtainFrame
()
{
G711Frame
::
Ptr
G711RtpDecoder
::
obtainFrame
()
{
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
//从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象
auto
frame
=
ResourcePoolHelper
<
G711Frame
>::
obtainObj
();
auto
frame
=
ResourcePoolHelper
<
G711Frame
>::
obtainObj
();
frame
->
buffer
.
clear
();
frame
->
_
buffer
.
clear
();
frame
->
_codec
I
d
=
_codecid
;
frame
->
_codec
i
d
=
_codecid
;
frame
->
timeStamp
=
0
;
frame
->
_dts
=
0
;
return
frame
;
return
frame
;
}
}
...
@@ -32,17 +32,17 @@ bool G711RtpDecoder::inputRtp(const RtpPacket::Ptr &rtppack, bool) {
...
@@ -32,17 +32,17 @@ bool G711RtpDecoder::inputRtp(const RtpPacket::Ptr &rtppack, bool) {
// 获取rtp数据
// 获取rtp数据
const
char
*
rtp_packet_buf
=
rtppack
->
data
()
+
rtppack
->
offset
;
const
char
*
rtp_packet_buf
=
rtppack
->
data
()
+
rtppack
->
offset
;
if
(
rtppack
->
timeStamp
!=
_frame
->
timeStamp
)
{
if
(
rtppack
->
timeStamp
!=
_frame
->
_dts
)
{
//时间戳变更,清空上一帧
//时间戳变更,清空上一帧
onGetG711
(
_frame
);
onGetG711
(
_frame
);
}
}
//追加数据
//追加数据
_frame
->
buffer
.
append
(
rtp_packet_buf
,
length
);
_frame
->
_
buffer
.
append
(
rtp_packet_buf
,
length
);
//赋值时间戳
//赋值时间戳
_frame
->
timeStamp
=
rtppack
->
timeStamp
;
_frame
->
_dts
=
rtppack
->
timeStamp
;
if
(
rtppack
->
mark
||
_frame
->
buffer
.
size
()
>
10
*
1024
)
{
if
(
rtppack
->
mark
||
_frame
->
_
buffer
.
size
()
>
10
*
1024
)
{
//标记为mark时,或者内存快溢出时,我们认为这是该帧最后一个包
//标记为mark时,或者内存快溢出时,我们认为这是该帧最后一个包
onGetG711
(
_frame
);
onGetG711
(
_frame
);
}
}
...
@@ -50,7 +50,7 @@ bool G711RtpDecoder::inputRtp(const RtpPacket::Ptr &rtppack, bool) {
...
@@ -50,7 +50,7 @@ bool G711RtpDecoder::inputRtp(const RtpPacket::Ptr &rtppack, bool) {
}
}
void
G711RtpDecoder
::
onGetG711
(
const
G711Frame
::
Ptr
&
frame
)
{
void
G711RtpDecoder
::
onGetG711
(
const
G711Frame
::
Ptr
&
frame
)
{
if
(
!
frame
->
buffer
.
empty
()){
if
(
!
frame
->
_
buffer
.
empty
()){
//写入环形缓存
//写入环形缓存
RtpCodec
::
inputFrame
(
frame
);
RtpCodec
::
inputFrame
(
frame
);
_frame
=
obtainFrame
();
_frame
=
obtainFrame
();
...
@@ -96,6 +96,3 @@ void G711RtpEncoder::makeG711Rtp(const void *data, unsigned int len, bool mark,
...
@@ -96,6 +96,3 @@ void G711RtpEncoder::makeG711Rtp(const void *data, unsigned int len, bool mark,
}
}
}
//namespace mediakit
}
//namespace mediakit
src/Extension/G711Rtp.h
查看文件 @
625d7e30
...
@@ -31,10 +31,6 @@ public:
...
@@ -31,10 +31,6 @@ public:
*/
*/
bool
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
=
false
)
override
;
bool
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
=
false
)
override
;
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
_codecid
;
return
_codecid
;
}
}
...
...
src/Extension/H264.h
查看文件 @
625d7e30
...
@@ -25,7 +25,7 @@ void splitH264(const char *ptr, int len, int prefix, const std::function<void(co
...
@@ -25,7 +25,7 @@ void splitH264(const char *ptr, int len, int prefix, const std::function<void(co
/**
/**
* 264帧类
* 264帧类
*/
*/
class
H264Frame
:
public
Frame
{
class
H264Frame
:
public
Frame
Imp
{
public
:
public
:
typedef
std
::
shared_ptr
<
H264Frame
>
Ptr
;
typedef
std
::
shared_ptr
<
H264Frame
>
Ptr
;
...
@@ -36,30 +36,8 @@ public:
...
@@ -36,30 +36,8 @@ public:
NAL_SEI
=
6
,
NAL_SEI
=
6
,
}
NalType
;
}
NalType
;
char
*
data
()
const
override
{
H264Frame
(){
return
(
char
*
)
_buffer
.
data
();
_codecid
=
CodecH264
;
}
uint32_t
size
()
const
override
{
return
_buffer
.
size
();
}
uint32_t
dts
()
const
override
{
return
_dts
;
}
uint32_t
pts
()
const
override
{
return
_pts
?
_pts
:
_dts
;
}
uint32_t
prefixSize
()
const
override
{
return
_prefix_size
;
}
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;
}
CodecId
getCodecId
()
const
override
{
return
CodecH264
;
}
}
bool
keyFrame
()
const
override
{
bool
keyFrame
()
const
override
{
...
@@ -69,39 +47,27 @@ public:
...
@@ -69,39 +47,27 @@ public:
bool
configFrame
()
const
override
{
bool
configFrame
()
const
override
{
switch
(
H264_TYPE
(
_buffer
[
_prefix_size
])
){
switch
(
H264_TYPE
(
_buffer
[
_prefix_size
])
){
case
H264Frame
:
:
NAL_SPS
:
case
H264Frame
:
:
NAL_SPS
:
case
H264Frame
:
:
NAL_PPS
:
case
H264Frame
:
:
NAL_PPS
:
return
true
;
return
true
;
default
:
return
false
;
default
:
return
false
;
}
}
}
}
public
:
uint32_t
_dts
=
0
;
uint32_t
_pts
=
0
;
uint32_t
_prefix_size
=
4
;
string
_buffer
;
};
};
/**
/**
* 防止内存拷贝的H264类
* 防止内存拷贝的H264类
* 用户可以通过该类型快速把一个指针无拷贝的包装成Frame类
* 用户可以通过该类型快速把一个指针无拷贝的包装成Frame类
* 该类型在DevChannel中有使用
* 该类型在DevChannel中有使用
*/
*/
class
H264FrameNoCacheAble
:
public
Frame
NoCacheAble
{
class
H264FrameNoCacheAble
:
public
Frame
FromPtr
{
public
:
public
:
typedef
std
::
shared_ptr
<
H264FrameNoCacheAble
>
Ptr
;
typedef
std
::
shared_ptr
<
H264FrameNoCacheAble
>
Ptr
;
H264FrameNoCacheAble
(
char
*
ptr
,
uint32_t
size
,
uint32_t
dts
,
uint32_t
pts
,
int
prefix
eS
ize
=
4
){
H264FrameNoCacheAble
(
char
*
ptr
,
uint32_t
size
,
uint32_t
dts
,
uint32_t
pts
,
int
prefix
_s
ize
=
4
){
_ptr
=
ptr
;
_ptr
=
ptr
;
_size
=
size
;
_size
=
size
;
_dts
=
dts
;
_dts
=
dts
;
_pts
=
pts
;
_pts
=
pts
;
_prefixSize
=
prefixeSize
;
_prefix_size
=
prefix_size
;
}
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;
}
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
...
@@ -109,41 +75,16 @@ public:
...
@@ -109,41 +75,16 @@ public:
}
}
bool
keyFrame
()
const
override
{
bool
keyFrame
()
const
override
{
return
H264_TYPE
(
_ptr
[
_prefix
S
ize
])
==
H264Frame
::
NAL_IDR
;
return
H264_TYPE
(
_ptr
[
_prefix
_s
ize
])
==
H264Frame
::
NAL_IDR
;
}
}
bool
configFrame
()
const
override
{
bool
configFrame
()
const
override
{
switch
(
H264_TYPE
(
_ptr
[
_prefix
S
ize
])){
switch
(
H264_TYPE
(
_ptr
[
_prefix
_s
ize
])){
case
H264Frame
:
:
NAL_SPS
:
case
H264Frame
:
:
NAL_SPS
:
case
H264Frame
:
:
NAL_PPS
:
case
H264Frame
:
:
NAL_PPS
:
return
true
;
return
true
;
default
:
return
false
;
default
:
return
false
;
}
}
};
/**
* 一个H264Frame类中可以有多个帧,他们通过 0x 00 00 01 分隔
* ZLMediaKit会先把这种复合帧split成单个帧然后再处理
* 一个复合帧可以通过无内存拷贝的方式切割成多个H264FrameSubFrame
* 提供该类的目的是切换复合帧时防止内存拷贝,提高性能
*/
template
<
typename
Parent
>
class
FrameInternal
:
public
Parent
{
public
:
typedef
std
::
shared_ptr
<
FrameInternal
>
Ptr
;
FrameInternal
(
const
Frame
::
Ptr
&
parent_frame
,
char
*
ptr
,
uint32_t
size
,
int
prefixeSize
)
:
Parent
(
ptr
,
size
,
parent_frame
->
dts
(),
parent_frame
->
pts
(),
prefixeSize
){
_parent_frame
=
parent_frame
;
}
}
bool
cacheAble
()
const
override
{
return
_parent_frame
->
cacheAble
();
}
}
private
:
Frame
::
Ptr
_parent_frame
;
};
};
typedef
FrameInternal
<
H264FrameNoCacheAble
>
H264FrameInternal
;
typedef
FrameInternal
<
H264FrameNoCacheAble
>
H264FrameInternal
;
...
@@ -334,13 +275,11 @@ private:
...
@@ -334,13 +275,11 @@ private:
bool
_last_frame_is_idr
=
false
;
bool
_last_frame_is_idr
=
false
;
};
};
/**
/**
* h264类型sdp
* h264类型sdp
*/
*/
class
H264Sdp
:
public
Sdp
{
class
H264Sdp
:
public
Sdp
{
public
:
public
:
/**
/**
*
*
* @param sps 264 sps,不带0x00000001头
* @param sps 264 sps,不带0x00000001头
...
@@ -375,17 +314,13 @@ public:
...
@@ -375,17 +314,13 @@ public:
memset
(
strTemp
,
0
,
100
);
memset
(
strTemp
,
0
,
100
);
av_base64_encode
(
strTemp
,
100
,
(
uint8_t
*
)
strPPS
.
data
(),
strPPS
.
size
());
av_base64_encode
(
strTemp
,
100
,
(
uint8_t
*
)
strPPS
.
data
(),
strPPS
.
size
());
_printer
<<
strTemp
<<
"
\r\n
"
;
_printer
<<
strTemp
<<
"
\r\n
"
;
_printer
<<
"a=control:trackID="
<<
getTrackType
()
<<
"
\r\n
"
;
_printer
<<
"a=control:trackID="
<<
(
int
)
TrackVideo
<<
"
\r\n
"
;
}
}
string
getSdp
()
const
override
{
string
getSdp
()
const
override
{
return
_printer
;
return
_printer
;
}
}
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecH264
;
return
CodecH264
;
}
}
...
@@ -393,8 +328,5 @@ private:
...
@@ -393,8 +328,5 @@ private:
_StrPrinter
_printer
;
_StrPrinter
_printer
;
};
};
}
//namespace mediakit
}
//namespace mediakit
#endif //ZLMEDIAKIT_H264_H
#endif //ZLMEDIAKIT_H264_H
\ No newline at end of file
src/Extension/H264Rtmp.h
查看文件 @
625d7e30
...
@@ -36,10 +36,6 @@ public:
...
@@ -36,10 +36,6 @@ public:
*/
*/
bool
inputRtmp
(
const
RtmpPacket
::
Ptr
&
rtmp
,
bool
key_pos
=
true
)
override
;
bool
inputRtmp
(
const
RtmpPacket
::
Ptr
&
rtmp
,
bool
key_pos
=
true
)
override
;
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecH264
;
return
CodecH264
;
}
}
...
...
src/Extension/H264Rtp.h
查看文件 @
625d7e30
...
@@ -38,10 +38,6 @@ public:
...
@@ -38,10 +38,6 @@ public:
*/
*/
bool
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
=
true
)
override
;
bool
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
=
true
)
override
;
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecH264
;
return
CodecH264
;
}
}
...
...
src/Extension/H265.h
查看文件 @
625d7e30
...
@@ -23,9 +23,9 @@ namespace mediakit {
...
@@ -23,9 +23,9 @@ namespace mediakit {
bool
getHEVCInfo
(
const
string
&
strVps
,
const
string
&
strSps
,
int
&
iVideoWidth
,
int
&
iVideoHeight
,
float
&
iVideoFps
);
bool
getHEVCInfo
(
const
string
&
strVps
,
const
string
&
strSps
,
int
&
iVideoWidth
,
int
&
iVideoHeight
,
float
&
iVideoFps
);
/**
/**
* 265帧类
* 265帧类
*/
*/
class
H265Frame
:
public
Frame
{
class
H265Frame
:
public
Frame
Imp
{
public
:
public
:
typedef
std
::
shared_ptr
<
H265Frame
>
Ptr
;
typedef
std
::
shared_ptr
<
H265Frame
>
Ptr
;
...
@@ -60,32 +60,8 @@ public:
...
@@ -60,32 +60,8 @@ public:
NAL_SEI_SUFFIX
=
40
,
NAL_SEI_SUFFIX
=
40
,
}
NaleType
;
}
NaleType
;
char
*
data
()
const
override
{
H265Frame
(){
return
(
char
*
)
_buffer
.
data
();
_codecid
=
CodecH265
;
}
uint32_t
size
()
const
override
{
return
_buffer
.
size
();
}
uint32_t
dts
()
const
override
{
return
_dts
;
}
uint32_t
pts
()
const
override
{
return
_pts
?
_pts
:
_dts
;
}
uint32_t
prefixSize
()
const
override
{
return
_prefix_size
;
}
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;
}
CodecId
getCodecId
()
const
override
{
return
CodecH265
;
}
}
bool
keyFrame
()
const
override
{
bool
keyFrame
()
const
override
{
...
@@ -96,39 +72,26 @@ public:
...
@@ -96,39 +72,26 @@ public:
switch
(
H265_TYPE
(
_buffer
[
_prefix_size
])){
switch
(
H265_TYPE
(
_buffer
[
_prefix_size
])){
case
H265Frame
:
:
NAL_VPS
:
case
H265Frame
:
:
NAL_VPS
:
case
H265Frame
:
:
NAL_SPS
:
case
H265Frame
:
:
NAL_SPS
:
case
H265Frame
:
:
NAL_PPS
:
case
H265Frame
:
:
NAL_PPS
:
return
true
;
return
true
;
default
:
return
false
;
default
:
return
false
;
}
}
}
}
static
bool
isKeyFrame
(
int
type
)
{
static
bool
isKeyFrame
(
int
type
)
{
return
type
>=
NAL_BLA_W_LP
&&
type
<=
NAL_RSV_IRAP_VCL23
;
return
type
>=
NAL_BLA_W_LP
&&
type
<=
NAL_RSV_IRAP_VCL23
;
}
}
public
:
uint32_t
_dts
=
0
;
uint32_t
_pts
=
0
;
uint32_t
_prefix_size
=
4
;
string
_buffer
;
};
};
class
H265FrameNoCacheAble
:
public
FrameFromPtr
{
class
H265FrameNoCacheAble
:
public
FrameNoCacheAble
{
public
:
public
:
typedef
std
::
shared_ptr
<
H265FrameNoCacheAble
>
Ptr
;
typedef
std
::
shared_ptr
<
H265FrameNoCacheAble
>
Ptr
;
H265FrameNoCacheAble
(
char
*
ptr
,
uint32_t
size
,
uint32_t
dts
,
uint32_t
pts
,
int
prefix
eS
ize
=
4
)
{
H265FrameNoCacheAble
(
char
*
ptr
,
uint32_t
size
,
uint32_t
dts
,
uint32_t
pts
,
int
prefix
_s
ize
=
4
)
{
_ptr
=
ptr
;
_ptr
=
ptr
;
_size
=
size
;
_size
=
size
;
_dts
=
dts
;
_dts
=
dts
;
_pts
=
pts
;
_pts
=
pts
;
_prefixSize
=
prefixeSize
;
_prefix_size
=
prefix_size
;
}
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;
}
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
...
@@ -136,17 +99,15 @@ public:
...
@@ -136,17 +99,15 @@ public:
}
}
bool
keyFrame
()
const
override
{
bool
keyFrame
()
const
override
{
return
H265Frame
::
isKeyFrame
(
H265_TYPE
(((
uint8_t
*
)
_ptr
)[
_prefix
S
ize
]));
return
H265Frame
::
isKeyFrame
(
H265_TYPE
(((
uint8_t
*
)
_ptr
)[
_prefix
_s
ize
]));
}
}
bool
configFrame
()
const
override
{
bool
configFrame
()
const
override
{
switch
(
H265_TYPE
(((
uint8_t
*
)
_ptr
)[
_prefix
S
ize
])){
switch
(
H265_TYPE
(((
uint8_t
*
)
_ptr
)[
_prefix
_s
ize
])){
case
H265Frame
:
:
NAL_VPS
:
case
H265Frame
:
:
NAL_VPS
:
case
H265Frame
:
:
NAL_SPS
:
case
H265Frame
:
:
NAL_SPS
:
case
H265Frame
:
:
NAL_PPS
:
case
H265Frame
:
:
NAL_PPS
:
return
true
;
return
true
;
default
:
return
false
;
default
:
return
false
;
}
}
}
}
};
};
...
@@ -184,7 +145,6 @@ public:
...
@@ -184,7 +145,6 @@ public:
/**
/**
* 返回不带0x00 00 00 01头的vps
* 返回不带0x00 00 00 01头的vps
* @return
*/
*/
const
string
&
getVps
()
const
{
const
string
&
getVps
()
const
{
return
_vps
;
return
_vps
;
...
@@ -192,7 +152,6 @@ public:
...
@@ -192,7 +152,6 @@ public:
/**
/**
* 返回不带0x00 00 00 01头的sps
* 返回不带0x00 00 00 01头的sps
* @return
*/
*/
const
string
&
getSps
()
const
{
const
string
&
getSps
()
const
{
return
_sps
;
return
_sps
;
...
@@ -200,7 +159,6 @@ public:
...
@@ -200,7 +159,6 @@ public:
/**
/**
* 返回不带0x00 00 00 01头的pps
* 返回不带0x00 00 00 01头的pps
* @return
*/
*/
const
string
&
getPps
()
const
{
const
string
&
getPps
()
const
{
return
_pps
;
return
_pps
;
...
@@ -212,7 +170,6 @@ public:
...
@@ -212,7 +170,6 @@ public:
/**
/**
* 返回视频高度
* 返回视频高度
* @return
*/
*/
int
getVideoHeight
()
const
override
{
int
getVideoHeight
()
const
override
{
return
_height
;
return
_height
;
...
@@ -220,7 +177,6 @@ public:
...
@@ -220,7 +177,6 @@ public:
/**
/**
* 返回视频宽度
* 返回视频宽度
* @return
*/
*/
int
getVideoWidth
()
const
override
{
int
getVideoWidth
()
const
override
{
return
_width
;
return
_width
;
...
@@ -228,7 +184,6 @@ public:
...
@@ -228,7 +184,6 @@ public:
/**
/**
* 返回视频fps
* 返回视频fps
* @return
*/
*/
float
getVideoFps
()
const
override
{
float
getVideoFps
()
const
override
{
return
_fps
;
return
_fps
;
...
@@ -238,7 +193,6 @@ public:
...
@@ -238,7 +193,6 @@ public:
return
!
_vps
.
empty
()
&&
!
_sps
.
empty
()
&&
!
_pps
.
empty
();
return
!
_vps
.
empty
()
&&
!
_sps
.
empty
()
&&
!
_pps
.
empty
();
}
}
/**
/**
* 输入数据帧,并获取sps pps
* 输入数据帧,并获取sps pps
* @param frame 数据帧
* @param frame 数据帧
...
@@ -352,15 +306,13 @@ private:
...
@@ -352,15 +306,13 @@ private:
bool
_last_frame_is_idr
=
false
;
bool
_last_frame_is_idr
=
false
;
};
};
/**
/**
* h265类型sdp
* h265类型sdp
*/
*/
class
H265Sdp
:
public
Sdp
{
class
H265Sdp
:
public
Sdp
{
public
:
public
:
/**
/**
*
*
构造函数
* @param sps 265 sps,不带0x00000001头
* @param sps 265 sps,不带0x00000001头
* @param pps 265 pps,不带0x00000001头
* @param pps 265 pps,不带0x00000001头
* @param playload_type rtp playload type 默认96
* @param playload_type rtp playload type 默认96
...
@@ -382,17 +334,13 @@ public:
...
@@ -382,17 +334,13 @@ public:
_printer
<<
encodeBase64
(
strSPS
)
<<
"; "
;
_printer
<<
encodeBase64
(
strSPS
)
<<
"; "
;
_printer
<<
"sprop-pps="
;
_printer
<<
"sprop-pps="
;
_printer
<<
encodeBase64
(
strPPS
)
<<
"
\r\n
"
;
_printer
<<
encodeBase64
(
strPPS
)
<<
"
\r\n
"
;
_printer
<<
"a=control:trackID="
<<
getTrackType
()
<<
"
\r\n
"
;
_printer
<<
"a=control:trackID="
<<
(
int
)
TrackVideo
<<
"
\r\n
"
;
}
}
string
getSdp
()
const
override
{
string
getSdp
()
const
override
{
return
_printer
;
return
_printer
;
}
}
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecH265
;
return
CodecH265
;
}
}
...
@@ -400,9 +348,5 @@ private:
...
@@ -400,9 +348,5 @@ private:
_StrPrinter
_printer
;
_StrPrinter
_printer
;
};
};
}
//namespace mediakit
}
//namespace mediakit
#endif //ZLMEDIAKIT_H265_H
#endif //ZLMEDIAKIT_H265_H
\ No newline at end of file
src/Extension/H265Rtmp.h
查看文件 @
625d7e30
...
@@ -36,10 +36,6 @@ public:
...
@@ -36,10 +36,6 @@ public:
*/
*/
bool
inputRtmp
(
const
RtmpPacket
::
Ptr
&
rtmp
,
bool
key_pos
=
true
)
override
;
bool
inputRtmp
(
const
RtmpPacket
::
Ptr
&
rtmp
,
bool
key_pos
=
true
)
override
;
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecH265
;
return
CodecH265
;
}
}
...
...
src/Extension/H265Rtp.h
查看文件 @
625d7e30
...
@@ -39,10 +39,6 @@ public:
...
@@ -39,10 +39,6 @@ public:
*/
*/
bool
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
=
true
)
override
;
bool
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
,
bool
key_pos
=
true
)
override
;
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;
}
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecH265
;
return
CodecH265
;
}
}
...
...
src/Extension/Track.h
查看文件 @
625d7e30
...
@@ -65,8 +65,6 @@ class VideoTrack : public Track {
...
@@ -65,8 +65,6 @@ class VideoTrack : public Track {
public
:
public
:
typedef
std
::
shared_ptr
<
VideoTrack
>
Ptr
;
typedef
std
::
shared_ptr
<
VideoTrack
>
Ptr
;
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;};
/**
/**
* 返回视频高度
* 返回视频高度
* @return
* @return
...
@@ -93,8 +91,6 @@ class AudioTrack : public Track {
...
@@ -93,8 +91,6 @@ class AudioTrack : public Track {
public
:
public
:
typedef
std
::
shared_ptr
<
AudioTrack
>
Ptr
;
typedef
std
::
shared_ptr
<
AudioTrack
>
Ptr
;
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;};
/**
/**
* 返回音频采样率
* 返回音频采样率
* @return
* @return
...
@@ -114,6 +110,64 @@ public:
...
@@ -114,6 +110,64 @@ public:
virtual
int
getAudioChannel
()
const
{
return
0
;};
virtual
int
getAudioChannel
()
const
{
return
0
;};
};
};
class
AudioTrackImp
:
public
AudioTrack
{
public
:
typedef
std
::
shared_ptr
<
AudioTrackImp
>
Ptr
;
/**
* 构造函数
* @param codecId 编码类型
* @param sample_rate 采样率(HZ)
* @param channels 通道数
* @param sample_bit 采样位数,一般为16
*/
AudioTrackImp
(
CodecId
codecId
,
int
sample_rate
,
int
channels
,
int
sample_bit
){
_codecid
=
codecId
;
_sample_rate
=
sample_rate
;
_channels
=
channels
;
_sample_bit
=
sample_bit
;
}
/**
* 返回编码类型
*/
CodecId
getCodecId
()
const
override
{
return
_codecid
;
}
/**
* 是否已经初始化
*/
bool
ready
()
override
{
return
true
;
}
/**
* 返回音频采样率
*/
int
getAudioSampleRate
()
const
override
{
return
_sample_rate
;
}
/**
* 返回音频采样位数,一般为16或8
*/
int
getAudioSampleBit
()
const
override
{
return
_sample_bit
;
}
/**
* 返回音频通道数
*/
int
getAudioChannel
()
const
override
{
return
_channels
;
}
private
:
CodecId
_codecid
;
int
_sample_rate
;
int
_channels
;
int
_sample_bit
;
};
class
TrackSource
{
class
TrackSource
{
public
:
public
:
...
@@ -123,7 +177,6 @@ public:
...
@@ -123,7 +177,6 @@ public:
/**
/**
* 获取全部的Track
* 获取全部的Track
* @param trackReady 是否获取全部已经准备好的Track
* @param trackReady 是否获取全部已经准备好的Track
* @return
*/
*/
virtual
vector
<
Track
::
Ptr
>
getTracks
(
bool
trackReady
=
true
)
const
=
0
;
virtual
vector
<
Track
::
Ptr
>
getTracks
(
bool
trackReady
=
true
)
const
=
0
;
...
@@ -131,7 +184,6 @@ public:
...
@@ -131,7 +184,6 @@ public:
* 获取特定Track
* 获取特定Track
* @param type track类型
* @param type track类型
* @param trackReady 是否获取全部已经准备好的Track
* @param trackReady 是否获取全部已经准备好的Track
* @return
*/
*/
Track
::
Ptr
getTrack
(
TrackType
type
,
bool
trackReady
=
true
)
const
{
Track
::
Ptr
getTrack
(
TrackType
type
,
bool
trackReady
=
true
)
const
{
auto
tracks
=
getTracks
(
trackReady
);
auto
tracks
=
getTracks
(
trackReady
);
...
@@ -145,5 +197,4 @@ public:
...
@@ -145,5 +197,4 @@ public:
};
};
}
//namespace mediakit
}
//namespace mediakit
#endif //ZLMEDIAKIT_TRACK_H
#endif //ZLMEDIAKIT_TRACK_H
\ No newline at end of file
src/Rtmp/Rtmp.h
查看文件 @
625d7e30
...
@@ -242,18 +242,6 @@ public:
...
@@ -242,18 +242,6 @@ public:
}
}
}
}
/**
* 返回音频或视频类型
* @return
*/
TrackType
getTrackType
()
const
override
{
return
TrackTitle
;
}
/**
* 返回编码器id
* @return
*/
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecInvalid
;
return
CodecInvalid
;
}
}
...
@@ -266,18 +254,6 @@ public:
...
@@ -266,18 +254,6 @@ public:
VideoMeta
(
const
VideoTrack
::
Ptr
&
video
,
int
datarate
=
5000
);
VideoMeta
(
const
VideoTrack
::
Ptr
&
video
,
int
datarate
=
5000
);
virtual
~
VideoMeta
(){}
virtual
~
VideoMeta
(){}
/**
* 返回音频或视频类型
* @return
*/
TrackType
getTrackType
()
const
override
{
return
TrackVideo
;
}
/**
* 返回编码器id
* @return
*/
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
_codecId
;
return
_codecId
;
}
}
...
@@ -294,18 +270,6 @@ public:
...
@@ -294,18 +270,6 @@ public:
virtual
~
AudioMeta
(){}
virtual
~
AudioMeta
(){}
/**
* 返回音频或视频类型
* @return
*/
TrackType
getTrackType
()
const
override
{
return
TrackAudio
;
}
/**
* 返回编码器id
* @return
*/
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
_codecId
;
return
_codecId
;
}
}
...
@@ -317,7 +281,4 @@ private:
...
@@ -317,7 +281,4 @@ private:
uint8_t
getAudioRtmpFlags
(
const
Track
::
Ptr
&
track
);
uint8_t
getAudioRtmpFlags
(
const
Track
::
Ptr
&
track
);
}
//namespace mediakit
}
//namespace mediakit
#endif//__rtmp_h
#endif
src/Rtp/RtpProcess.cpp
查看文件 @
625d7e30
...
@@ -20,8 +20,8 @@
...
@@ -20,8 +20,8 @@
namespace
mediakit
{
namespace
mediakit
{
/**
/**
* 合并一些时间戳相同的frame
* 合并一些时间戳相同的frame
*/
*/
class
FrameMerger
{
class
FrameMerger
{
public
:
public
:
FrameMerger
()
=
default
;
FrameMerger
()
=
default
;
...
@@ -319,7 +319,9 @@ void RtpProcess::onDecode(int stream,int codecid,int flags,int64_t pts,int64_t d
...
@@ -319,7 +319,9 @@ void RtpProcess::onDecode(int stream,int codecid,int flags,int64_t pts,int64_t d
WarnP
(
this
)
<<
"audio track change to G711 from codecid:"
<<
getCodecName
(
_codecid_audio
);
WarnP
(
this
)
<<
"audio track change to G711 from codecid:"
<<
getCodecName
(
_codecid_audio
);
return
;
return
;
}
}
_muxer
->
inputFrame
(
std
::
make_shared
<
G711FrameNoCacheAble
>
(
codec
,
(
char
*
)
data
,
bytes
,
dts
));
auto
frame
=
std
::
make_shared
<
G711FrameNoCacheAble
>
((
char
*
)
data
,
bytes
,
dts
);
frame
->
setCodec
(
codec
);
_muxer
->
inputFrame
(
frame
);
break
;
break
;
}
}
default
:
default
:
...
...
src/Rtsp/Rtsp.h
查看文件 @
625d7e30
...
@@ -263,18 +263,7 @@ public:
...
@@ -263,18 +263,7 @@ public:
string
getSdp
()
const
override
{
string
getSdp
()
const
override
{
return
_printer
;
return
_printer
;
}
}
/**
* 返回音频或视频类型
* @return
*/
TrackType
getTrackType
()
const
override
{
return
TrackTitle
;
}
/**
* 返回编码器id
* @return
*/
CodecId
getCodecId
()
const
override
{
CodecId
getCodecId
()
const
override
{
return
CodecInvalid
;
return
CodecInvalid
;
}
}
...
@@ -283,5 +272,4 @@ private:
...
@@ -283,5 +272,4 @@ private:
};
};
}
//namespace mediakit
}
//namespace mediakit
#endif //RTSP_RTSP_H_
#endif //RTSP_RTSP_H_
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论