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
6fe90fe4
Commit
6fe90fe4
authored
Oct 26, 2018
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
替换sdp解析逻辑
parent
a69d7d0f
隐藏空白字符变更
内嵌
并排
正在显示
12 个修改的文件
包含
146 行增加
和
178 行删除
+146
-178
src/Common/Factory.cpp
+7
-7
src/Common/Factory.h
+1
-1
src/Rtsp/Rtsp.cpp
+18
-55
src/Rtsp/Rtsp.h
+16
-20
src/Rtsp/RtspMediaSource.h
+1
-1
src/Rtsp/RtspPlayer.cpp
+35
-43
src/Rtsp/RtspPlayer.h
+6
-5
src/Rtsp/RtspPlayerImp.h
+2
-2
src/Rtsp/RtspSession.cpp
+21
-18
src/Rtsp/RtspSession.h
+6
-3
src/RtspMuxer/RtspDemuxer.cpp
+29
-21
src/RtspMuxer/RtspDemuxer.h
+4
-2
没有找到文件。
src/Common/Factory.cpp
查看文件 @
6fe90fe4
...
...
@@ -66,11 +66,11 @@ Sdp::Ptr Factory::getSdpByTrack(const Track::Ptr &track) {
}
Track
::
Ptr
Factory
::
getTrackBySdp
(
const
string
&
sdp
)
{
if
(
strcasestr
(
sdp
.
data
(),
"mpeg4-generic"
)
!=
nullptr
)
{
string
aac_cfg_str
=
FindField
(
sd
p
.
c_str
(),
"config="
,
"
\r\n
"
);
Track
::
Ptr
Factory
::
getTrackBySdp
(
const
SdpTrack
::
Ptr
&
track
)
{
if
(
strcasestr
(
track
->
_codec
.
data
(),
"mpeg4-generic"
)
!=
nullptr
)
{
string
aac_cfg_str
=
FindField
(
track
->
_fmt
p
.
c_str
(),
"config="
,
"
\r\n
"
);
if
(
aac_cfg_str
.
size
()
!=
4
)
{
aac_cfg_str
=
FindField
(
sd
p
.
c_str
(),
"config="
,
";"
);
aac_cfg_str
=
FindField
(
track
->
_fmt
p
.
c_str
(),
"config="
,
";"
);
}
if
(
aac_cfg_str
.
size
()
!=
4
)
{
//延后获取adts头
...
...
@@ -91,8 +91,8 @@ Track::Ptr Factory::getTrackBySdp(const string &sdp) {
return
std
::
make_shared
<
AACTrack
>
(
aac_cfg
);
}
if
(
strcasestr
(
sdp
.
data
(),
"h264"
)
!=
nullptr
)
{
string
sps_pps
=
FindField
(
sd
p
.
c_str
(),
"sprop-parameter-sets="
,
"
\r\n
"
);
if
(
strcasestr
(
track
->
_codec
.
data
(),
"h264"
)
!=
nullptr
)
{
string
sps_pps
=
FindField
(
track
->
_fmt
p
.
c_str
(),
"sprop-parameter-sets="
,
"
\r\n
"
);
if
(
sps_pps
.
empty
()){
return
std
::
make_shared
<
H264Track
>
();
}
...
...
@@ -107,7 +107,7 @@ Track::Ptr Factory::getTrackBySdp(const string &sdp) {
return
std
::
make_shared
<
H264Track
>
(
sps
,
pps
,
0
,
0
);
}
WarnL
<<
"暂不支持该sdp:"
<<
sd
p
;
WarnL
<<
"暂不支持该sdp:"
<<
track
->
_codec
<<
" "
<<
track
->
_fmt
p
;
return
nullptr
;
}
...
...
src/Common/Factory.h
查看文件 @
6fe90fe4
...
...
@@ -53,7 +53,7 @@ public:
/**
* 根据sdp生成Track对象
*/
static
Track
::
Ptr
getTrackBySdp
(
const
string
&
sdp
);
static
Track
::
Ptr
getTrackBySdp
(
const
SdpTrack
::
Ptr
&
track
);
/**
* 根据Track生成SDP对象
...
...
src/Rtsp/Rtsp.cpp
查看文件 @
6fe90fe4
...
...
@@ -110,13 +110,13 @@ void SdpAttr::load(const string &sdp) {
for
(
auto
&
pr
:
_track_map
)
{
auto
&
track
=
*
pr
.
second
;
if
(
pr
.
first
==
""
)
{
track
.
_
type
=
TrackTitle
;
track
.
type
=
TrackTitle
;
}
else
if
(
pr
.
first
==
"video"
)
{
track
.
_
type
=
TrackVideo
;
track
.
type
=
TrackVideo
;
}
else
if
(
pr
.
first
==
"audio"
)
{
track
.
_
type
=
TrackAudio
;
track
.
type
=
TrackAudio
;
}
else
{
track
.
_
type
=
TrackInvalid
;
track
.
type
=
TrackInvalid
;
}
auto
it
=
track
.
_attr
.
find
(
"range"
);
...
...
@@ -153,6 +153,8 @@ void SdpAttr::load(const string &sdp) {
it
=
track
.
_attr
.
find
(
"control"
);
if
(
it
!=
track
.
_attr
.
end
())
{
track
.
_control
=
it
->
second
;
auto
surffix
=
string
(
"/"
)
+
track
.
_control
;
track
.
_control_surffix
=
surffix
.
substr
(
1
+
surffix
.
rfind
(
'/'
));
}
}
}
...
...
@@ -163,64 +165,25 @@ bool SdpAttr::available() const {
SdpTrack
::
Ptr
SdpAttr
::
getTrack
(
TrackType
type
)
const
{
for
(
auto
&
pr
:
_track_map
){
if
(
pr
.
second
->
_
type
==
type
){
if
(
pr
.
second
->
type
==
type
){
return
pr
.
second
;
}
}
return
nullptr
;
}
int
parserSDP
(
const
string
&
sdp
,
RtspTrack
Track
[
2
])
{
int
track_cnt
=
0
;
string
::
size_type
pos_head
=
0
;
while
((
pos_head
=
sdp
.
find
(
"m="
,
pos_head
))
!=
string
::
npos
)
{
auto
pos_end
=
sdp
.
find
(
"m="
,
pos_head
+
2
);
if
(
pos_end
==
string
::
npos
)
{
pos_end
=
sdp
.
size
();
}
auto
sdp_mid
=
sdp
.
substr
(
pos_head
,
pos_end
-
pos_head
);
pos_head
=
pos_end
;
Track
[
track_cnt
].
trackSdp
=
sdp_mid
;
Track
[
track_cnt
].
inited
=
false
;
Track
[
track_cnt
].
PT
=
atoi
(
FindField
(
sdp_mid
.
c_str
(),
"a=rtpmap:"
,
" "
).
c_str
());
auto
control
=
string
(
"/"
)
+
trim
(
FindField
(
sdp_mid
.
c_str
(),
"a=control:"
,
"
\n
"
));
Track
[
track_cnt
].
controlSuffix
=
control
.
substr
(
1
+
control
.
rfind
(
'/'
));
if
(
sdp_mid
.
find
(
"m=video"
)
!=
string
::
npos
)
{
//视频通道
Track
[
track_cnt
].
type
=
TrackVideo
;
}
else
if
(
sdp_mid
.
find
(
"m=audio"
)
!=
string
::
npos
)
{
//音频通道
Track
[
track_cnt
].
type
=
TrackAudio
;
}
else
{
//不识别的track
continue
;
}
track_cnt
++
;
vector
<
SdpTrack
::
Ptr
>
SdpAttr
::
getAvailableTrack
()
const
{
vector
<
SdpTrack
::
Ptr
>
ret
;
auto
video
=
getTrack
(
TrackVideo
);
if
(
video
){
ret
.
emplace_back
(
video
);
}
return
track_cnt
;
auto
audio
=
getTrack
(
TrackAudio
);
if
(
audio
){
ret
.
emplace_back
(
audio
);
}
return
ret
;
}
static
onceToken
s_token
([](){
string
str
=
"v=0
\n
"
"o=- 1001 1 IN IP4 192.168.0.22
\n
"
"s=VCP IPC Realtime stream
\n
"
"a=range:npt=0-
\n
"
"m=video 0 RTP/AVP 105
\n
"
"c=IN IP4 192.168.0.22
\n
"
"a=control:rtsp://192.168.0.22/media/video1/video
\n
"
"a=rtpmap:105 H264/90000
\n
"
"a=fmtp:105 profile-level-id=64001f; packetization-mode=1; sprop-parameter-sets=Z2QAH6wrUCgC3QgAAB9AAAYahCAA,aO4xsg==
\n
"
"a=recvonly
\n
"
"m=application 0 RTP/AVP 107
\n
"
"c=IN IP4 192.168.0.22
\n
"
"a=control:rtsp://192.168.0.22/media/video1/metadata
\n
"
"a=rtpmap:107 vnd.onvif.metadata/90000
\n
"
"a=fmtp:107 DecoderTag=h3c-v3 RTCP=0
\n
"
"a=recvonly"
;
RtspTrack
track
[
2
];
parserSDP
(
str
,
track
);
SdpAttr
attr
(
str
);
track
[
0
].
inited
=
true
;
});
src/Rtsp/Rtsp.h
查看文件 @
6fe90fe4
...
...
@@ -62,34 +62,31 @@ public:
int
_samplerate
;
string
_fmtp
;
string
_control
;
TrackType
_type
;
string
_control_surffix
;
TrackType
type
;
public
:
uint8_t
interleaved
=
0
;
bool
inited
=
false
;
uint32_t
ssrc
=
0
;
uint16_t
seq
=
0
;
uint32_t
timeStamp
=
0
;
};
class
SdpAttr
{
public
:
typedef
std
::
shared_ptr
<
SdpAttr
>
Ptr
;
SdpAttr
(
const
string
&
sdp
){
load
(
sdp
);};
SdpAttr
(){}
SdpAttr
(
const
string
&
sdp
){
load
(
sdp
);}
~
SdpAttr
(){}
void
load
(
const
string
&
sdp
);
SdpTrack
::
Ptr
getTrack
(
TrackType
type
)
const
;
bool
available
()
const
;
void
load
(
const
string
&
sdp
);
bool
available
()
const
;
SdpTrack
::
Ptr
getTrack
(
TrackType
type
)
const
;
vector
<
SdpTrack
::
Ptr
>
getAvailableTrack
()
const
;
private
:
map
<
string
,
SdpTrack
::
Ptr
>
_track_map
;
map
<
string
,
SdpTrack
::
Ptr
>
_track_map
;
};
class
RtspTrack
{
public
:
uint8_t
PT
;
uint8_t
interleaved
;
TrackType
type
=
TrackInvalid
;
string
trackSdp
;
string
controlSuffix
;
bool
inited
;
uint32_t
ssrc
=
0
;
uint16_t
seq
;
uint32_t
timeStamp
;
uint32_t
sampleRate
;
};
class
RtcpCounter
{
public
:
...
...
@@ -99,7 +96,6 @@ public:
};
string
FindField
(
const
char
*
buf
,
const
char
*
start
,
const
char
*
end
,
int
bufSize
=
0
);
int
parserSDP
(
const
string
&
sdp
,
RtspTrack
Track
[
2
]);
struct
StrCaseCompare
{
...
...
src/Rtsp/RtspMediaSource.h
查看文件 @
6fe90fe4
...
...
@@ -95,7 +95,7 @@ public:
_pRing
->
write
(
rtppt
,
keyPos
);
}
protected
:
unordered_map
<
int
,
Rts
pTrack
>
_mapTracks
;
unordered_map
<
int
,
Sd
pTrack
>
_mapTracks
;
string
_strSdp
;
//媒体描述信息
RingType
::
Ptr
_pRing
;
//rtp环形缓冲
};
...
...
src/Rtsp/RtspPlayer.cpp
查看文件 @
6fe90fe4
...
...
@@ -70,7 +70,7 @@ void RtspPlayer::teardown(){
erase
(
kRtspMd5Nonce
);
erase
(
kRtspRealm
);
_uiTrackCnt
=
0
;
_aTrackInfo
.
clear
()
;
_onHandshake
=
nullptr
;
_uiRtpBufLen
=
0
;
_strSession
.
clear
();
...
...
@@ -276,17 +276,21 @@ void RtspPlayer::handleResDESCRIBE(const Parser& parser) {
}
//解析sdp
_uiTrackCnt
=
parserSDP
(
strSdp
,
_aTrackInfo
);
for
(
unsigned
int
i
=
0
;
i
<
_uiTrackCnt
;
i
++
)
{
_aTrackInfo
[
i
].
ssrc
=
0
;
_aui32SsrcErrorCnt
[
i
]
=
0
;
}
if
(
!
_uiTrackCnt
)
{
_sdpAttr
.
load
(
strSdp
);
_aTrackInfo
=
_sdpAttr
.
getAvailableTrack
();
if
(
_aTrackInfo
.
empty
())
{
throw
std
::
runtime_error
(
"解析SDP失败"
);
}
if
(
!
onCheckSDP
(
strSdp
,
_
aTrackInfo
,
_uiTrackCnt
))
{
if
(
!
onCheckSDP
(
strSdp
,
_
sdpAttr
))
{
throw
std
::
runtime_error
(
"onCheckSDP faied"
);
}
CLEAR_ARR
(
_aui32SsrcErrorCnt
)
for
(
auto
&
track
:
_aTrackInfo
)
{
track
->
ssrc
=
0
;
}
sendSetup
(
0
);
}
//发送SETUP命令
...
...
@@ -294,11 +298,11 @@ bool RtspPlayer::sendSetup(unsigned int trackIndex) {
_onHandshake
=
std
::
bind
(
&
RtspPlayer
::
handleResSETUP
,
this
,
placeholders
::
_1
,
trackIndex
);
auto
&
track
=
_aTrackInfo
[
trackIndex
];
auto
baseUrl
=
_strContentBase
+
"/"
+
track
.
controlSu
ffix
;
auto
baseUrl
=
_strContentBase
+
"/"
+
track
->
_control_sur
ffix
;
switch
(
_eType
)
{
case
RTP_TCP
:
{
StrCaseMap
header
;
header
[
"Transport"
]
=
StrPrinter
<<
"RTP/AVP/TCP;unicast;interleaved="
<<
track
.
type
*
2
<<
"-"
<<
track
.
type
*
2
+
1
;
header
[
"Transport"
]
=
StrPrinter
<<
"RTP/AVP/TCP;unicast;interleaved="
<<
track
->
type
*
2
<<
"-"
<<
track
->
type
*
2
+
1
;
return
sendRtspRequest
(
"SETUP"
,
baseUrl
,
header
);
}
break
;
...
...
@@ -348,7 +352,7 @@ void RtspPlayer::handleResSETUP(const Parser &parser, unsigned int uiTrackIndex)
if
(
_eType
==
RTP_TCP
)
{
string
interleaved
=
FindField
(
FindField
((
strTransport
+
";"
).
c_str
(),
"interleaved="
,
";"
).
c_str
(),
NULL
,
"-"
);
_aTrackInfo
[
uiTrackIndex
]
.
interleaved
=
atoi
(
interleaved
.
c_str
());
_aTrackInfo
[
uiTrackIndex
]
->
interleaved
=
atoi
(
interleaved
.
c_str
());
}
else
{
const
char
*
strPos
=
(
_eType
==
RTP_MULTICAST
?
"port="
:
"server_port="
)
;
auto
port_str
=
FindField
((
strTransport
+
";"
).
c_str
(),
strPos
,
";"
);
...
...
@@ -377,13 +381,13 @@ void RtspPlayer::handleResSETUP(const Parser &parser, unsigned int uiTrackIndex)
}
}
if
(
uiTrackIndex
<
_
uiTrackCnt
-
1
)
{
if
(
uiTrackIndex
<
_
aTrackInfo
.
size
()
-
1
)
{
//需要继续发送SETUP命令
sendSetup
(
uiTrackIndex
+
1
);
return
;
}
for
(
unsigned
int
i
=
0
;
i
<
_
uiTrackCnt
&&
_eType
!=
RTP_TCP
;
i
++
)
{
for
(
unsigned
int
i
=
0
;
i
<
_
aTrackInfo
.
size
()
&&
_eType
!=
RTP_TCP
;
i
++
)
{
auto
&
pUdpSockRef
=
_apUdpSock
[
i
];
if
(
!
pUdpSockRef
){
continue
;
...
...
@@ -436,13 +440,8 @@ bool RtspPlayer::sendPause(bool bPause,float fTime){
_aNowStampTicker
[
0
].
resetTime
();
_aNowStampTicker
[
1
].
resetTime
();
float
iTimeInc
=
fTime
-
getProgressTime
();
for
(
unsigned
int
i
=
0
;
i
<
_uiTrackCnt
;
i
++
){
if
(
_aTrackInfo
[
i
].
type
==
TrackVideo
)
{
_adFistStamp
[
i
]
=
_adNowStamp
[
i
]
+
iTimeInc
*
90000.0
;
}
else
if
(
_aTrackInfo
[
i
].
type
==
TrackAudio
){
//todo(xzl) 修复此处
// _adFistStamp[i] = _adNowStamp[i] + iTimeInc * getAudioSampleRate();
}
for
(
unsigned
int
i
=
0
;
i
<
_aTrackInfo
.
size
()
;
i
++
){
_adFistStamp
[
i
]
=
_adNowStamp
[
i
]
+
iTimeInc
*
_aTrackInfo
[
i
]
->
_samplerate
;
_adNowStamp
[
i
]
=
_adFistStamp
[
i
];
}
_fSeekTo
=
fTime
;
...
...
@@ -590,7 +589,7 @@ bool RtspPlayer::handleOneRtp(int iTrackidx, unsigned char *pucData, unsigned in
auto
&
track
=
_aTrackInfo
[
iTrackidx
];
auto
pt_ptr
=
_pktPool
.
obtain
();
auto
&
rtppt
=*
pt_ptr
;
rtppt
.
interleaved
=
track
.
interleaved
;
rtppt
.
interleaved
=
track
->
interleaved
;
rtppt
.
length
=
uiLen
+
4
;
rtppt
.
mark
=
pucData
[
1
]
>>
7
;
...
...
@@ -604,15 +603,15 @@ bool RtspPlayer::handleOneRtp(int iTrackidx, unsigned char *pucData, unsigned in
//ssrc
memcpy
(
&
rtppt
.
ssrc
,
pucData
+
8
,
4
);
//内存对齐
rtppt
.
ssrc
=
ntohl
(
rtppt
.
ssrc
);
rtppt
.
type
=
track
.
type
;
if
(
track
.
ssrc
==
0
)
{
track
.
ssrc
=
rtppt
.
ssrc
;
rtppt
.
type
=
track
->
type
;
if
(
track
->
ssrc
==
0
)
{
track
->
ssrc
=
rtppt
.
ssrc
;
//保存SSRC
}
else
if
(
track
.
ssrc
!=
rtppt
.
ssrc
)
{
}
else
if
(
track
->
ssrc
!=
rtppt
.
ssrc
)
{
//ssrc错误
WarnL
<<
"ssrc错误"
;
if
(
_aui32SsrcErrorCnt
[
iTrackidx
]
++
>
10
)
{
track
.
ssrc
=
rtppt
.
ssrc
;
track
->
ssrc
=
rtppt
.
ssrc
;
WarnL
<<
"ssrc更换!"
;
}
return
false
;
...
...
@@ -694,7 +693,7 @@ float RtspPlayer::getRtpLossRate(int iTrackType) const{
if
(
iTrackIdx
==
-
1
){
uint64_t
totalRecv
=
0
;
uint64_t
totalSend
=
0
;
for
(
unsigned
int
i
=
0
;
i
<
_
uiTrackCnt
;
i
++
)
{
for
(
unsigned
int
i
=
0
;
i
<
_
aTrackInfo
.
size
()
;
i
++
)
{
totalRecv
+=
_aui64RtpRecv
[
i
];
totalSend
+=
(
_aui16NowSeq
[
i
]
-
_aui16FirstSeq
[
i
]
+
1
);
}
...
...
@@ -713,15 +712,8 @@ float RtspPlayer::getRtpLossRate(int iTrackType) const{
float
RtspPlayer
::
getProgressTime
()
const
{
double
iTime
[
2
]
=
{
0
,
0
};
for
(
unsigned
int
i
=
0
;
i
<
_uiTrackCnt
;
i
++
){
if
(
_aTrackInfo
[
i
].
type
==
TrackVideo
)
{
iTime
[
i
]
=
(
_adNowStamp
[
i
]
-
_adFistStamp
[
i
])
/
90000.0
;
}
else
if
(
_aTrackInfo
[
i
].
type
==
TrackAudio
){
//todo(xzl) 修复此处
#if 0
iTime[i] = (_adNowStamp[i] - _adFistStamp[i]) / getAudioSampleRate();
#endif
}
for
(
unsigned
int
i
=
0
;
i
<
_aTrackInfo
.
size
()
;
i
++
){
iTime
[
i
]
=
(
_adNowStamp
[
i
]
-
_adFistStamp
[
i
])
/
_aTrackInfo
[
i
]
->
_samplerate
;
}
return
_fSeekTo
+
MAX
(
iTime
[
0
],
iTime
[
1
]);
}
...
...
@@ -785,7 +777,7 @@ void RtspPlayer::onShutdown_l(const SockException &ex) {
_pBeatTimer
.
reset
();
onShutdown
(
ex
);
}
void
RtspPlayer
::
onRecvRTP_l
(
const
RtpPacket
::
Ptr
&
pRtppt
,
const
RtspTrack
&
track
)
{
void
RtspPlayer
::
onRecvRTP_l
(
const
RtpPacket
::
Ptr
&
pRtppt
,
const
SdpTrack
::
Ptr
&
track
)
{
_rtpTicker
.
resetTime
();
onRecvRTP
(
pRtppt
,
track
);
}
...
...
@@ -814,16 +806,16 @@ void RtspPlayer::onPlayResult_l(const SockException &ex) {
}
int
RtspPlayer
::
getTrackIndexByControlSuffix
(
const
string
&
controlSuffix
)
const
{
for
(
unsigned
int
i
=
0
;
i
<
_
uiTrackCnt
;
i
++
)
{
if
(
_aTrackInfo
[
i
]
.
controlSu
ffix
==
controlSuffix
)
{
for
(
unsigned
int
i
=
0
;
i
<
_
aTrackInfo
.
size
()
;
i
++
)
{
if
(
_aTrackInfo
[
i
]
->
_control_sur
ffix
==
controlSuffix
)
{
return
i
;
}
}
return
-
1
;
}
int
RtspPlayer
::
getTrackIndexByInterleaved
(
int
interleaved
)
const
{
for
(
unsigned
int
i
=
0
;
i
<
_
uiTrackCnt
;
i
++
)
{
if
(
_aTrackInfo
[
i
]
.
interleaved
==
interleaved
)
{
for
(
unsigned
int
i
=
0
;
i
<
_
aTrackInfo
.
size
()
;
i
++
)
{
if
(
_aTrackInfo
[
i
]
->
interleaved
==
interleaved
)
{
return
i
;
}
}
...
...
@@ -831,8 +823,8 @@ int RtspPlayer::getTrackIndexByInterleaved(int interleaved) const{
}
int
RtspPlayer
::
getTrackIndexByTrackType
(
TrackType
trackType
)
const
{
for
(
unsigned
int
i
=
0
;
i
<
_
uiTrackCnt
;
i
++
)
{
if
(
_aTrackInfo
[
i
]
.
type
==
trackType
)
{
for
(
unsigned
int
i
=
0
;
i
<
_
aTrackInfo
.
size
()
;
i
++
)
{
if
(
_aTrackInfo
[
i
]
->
type
==
trackType
)
{
return
i
;
}
}
...
...
src/Rtsp/RtspPlayer.h
查看文件 @
6fe90fe4
...
...
@@ -58,14 +58,14 @@ public:
float
getRtpLossRate
(
int
iTrackType
)
const
override
;
protected
:
//派生类回调函数
virtual
bool
onCheckSDP
(
const
string
&
strSdp
,
const
RtspTrack
*
pTrack
,
int
iTrackCnt
)
=
0
;
virtual
void
onRecvRTP
(
const
RtpPacket
::
Ptr
&
pRtppt
,
const
RtspTrack
&
track
)
=
0
;
virtual
bool
onCheckSDP
(
const
string
&
strSdp
,
const
SdpAttr
&
sdpAttr
)
=
0
;
virtual
void
onRecvRTP
(
const
RtpPacket
::
Ptr
&
pRtppt
,
const
SdpTrack
::
Ptr
&
track
)
=
0
;
float
getProgressTime
()
const
;
void
seekToTime
(
float
fTime
);
private
:
void
onShutdown_l
(
const
SockException
&
ex
);
void
onRecvRTP_l
(
const
RtpPacket
::
Ptr
&
pRtppt
,
int
iTrackidx
);
void
onRecvRTP_l
(
const
RtpPacket
::
Ptr
&
pRtppt
,
const
RtspTrack
&
track
);
void
onRecvRTP_l
(
const
RtpPacket
::
Ptr
&
pRtppt
,
const
SdpTrack
::
Ptr
&
track
);
void
onPlayResult_l
(
const
SockException
&
ex
);
int
getTrackIndexByControlSuffix
(
const
string
&
controlSuffix
)
const
;
...
...
@@ -97,8 +97,9 @@ private:
bool
sendRtspRequest
(
const
string
&
cmd
,
const
string
&
url
,
const
StrCaseMap
&
header
=
StrCaseMap
());
private
:
string
_strUrl
;
unsigned
int
_uiTrackCnt
=
0
;
RtspTrack
_aTrackInfo
[
2
];
SdpAttr
_sdpAttr
;
vector
<
SdpTrack
::
Ptr
>
_aTrackInfo
;
function
<
void
(
const
Parser
&
)
>
_onHandshake
;
RtspMediaSource
::
PoolType
_pktPool
;
...
...
src/Rtsp/RtspPlayerImp.h
查看文件 @
6fe90fe4
...
...
@@ -62,7 +62,7 @@ public:
};
private
:
//派生类回调函数
bool
onCheckSDP
(
const
string
&
sdp
,
const
RtspTrack
*
track
,
int
trackCnt
)
override
{
bool
onCheckSDP
(
const
string
&
sdp
,
const
SdpAttr
&
sdpAttr
)
override
{
_pRtspMediaSrc
=
dynamic_pointer_cast
<
RtspMediaSource
>
(
_pMediaSrc
);
if
(
_pRtspMediaSrc
){
_pRtspMediaSrc
->
onGetSDP
(
sdp
);
...
...
@@ -70,7 +70,7 @@ private:
_parser
.
reset
(
new
RtspDemuxer
(
sdp
));
return
true
;
}
void
onRecvRTP
(
const
RtpPacket
::
Ptr
&
rtppt
,
const
RtspTrack
&
track
)
override
{
void
onRecvRTP
(
const
RtpPacket
::
Ptr
&
rtppt
,
const
SdpTrack
::
Ptr
&
track
)
override
{
if
(
_pRtspMediaSrc
){
_pRtspMediaSrc
->
onWrite
(
rtppt
,
true
);
}
...
...
src/Rtsp/RtspSession.cpp
查看文件 @
6fe90fe4
...
...
@@ -511,12 +511,12 @@ bool RtspSession::handleReq_Setup() {
//未找到相应track
return
false
;
}
RtspTrack
&
trackRef
=
_aTrackInfo
[
trackIdx
];
if
(
trackRef
.
inited
)
{
SdpTrack
::
Ptr
&
trackRef
=
_aTrackInfo
[
trackIdx
];
if
(
trackRef
->
inited
)
{
//已经初始化过该Track
return
false
;
}
trackRef
.
inited
=
true
;
//现在初始化
trackRef
->
inited
=
true
;
//现在初始化
auto
strongRing
=
_pWeakRing
.
lock
();
if
(
!
strongRing
)
{
...
...
@@ -562,9 +562,9 @@ bool RtspSession::handleReq_Setup() {
"x-Dynamic-Rate: 1
\r\n\r\n
"
,
_iCseq
,
SERVER_NAME
,
RTSP_VERSION
,
RTSP_BUILDTIME
,
dateHeader
().
data
(),
trackRef
.
type
*
2
,
trackRef
.
type
*
2
+
1
,
printSSRC
(
trackRef
.
ssrc
).
data
(),
dateHeader
().
data
(),
trackRef
->
type
*
2
,
trackRef
->
type
*
2
+
1
,
printSSRC
(
trackRef
->
ssrc
).
data
(),
_strSession
.
data
());
SocketHelper
::
send
(
_pcBuf
,
iLen
);
}
...
...
@@ -609,7 +609,7 @@ bool RtspSession::handleReq_Setup() {
RTSP_VERSION
,
RTSP_BUILDTIME
,
dateHeader
().
data
(),
strClientPort
.
data
(),
pSockRtp
->
get_local_port
(),
pSockRtcp
->
get_local_port
(),
printSSRC
(
trackRef
.
ssrc
).
data
(),
printSSRC
(
trackRef
->
ssrc
).
data
(),
_strSession
.
data
());
SocketHelper
::
send
(
_pcBuf
,
n
);
}
...
...
@@ -630,7 +630,7 @@ bool RtspSession::handleReq_Setup() {
strongSelf
->
safeShutdown
();
});
}
int
iSrvPort
=
_pBrdcaster
->
getPort
(
trackRef
.
type
);
int
iSrvPort
=
_pBrdcaster
->
getPort
(
trackRef
->
type
);
//我们用trackIdx区分rtp和rtcp包
auto
pSockRtcp
=
UDPServer
::
Instance
().
getSock
(
get_local_ip
().
data
(),
2
*
trackIdx
+
1
,
iSrvPort
+
1
);
if
(
!
pSockRtcp
)
{
...
...
@@ -652,7 +652,7 @@ bool RtspSession::handleReq_Setup() {
RTSP_VERSION
,
RTSP_BUILDTIME
,
dateHeader
().
data
(),
_pBrdcaster
->
getIP
().
data
(),
get_local_ip
().
data
(),
iSrvPort
,
pSockRtcp
->
get_local_port
(),
udpTTL
,
printSSRC
(
trackRef
.
ssrc
).
data
(),
udpTTL
,
printSSRC
(
trackRef
->
ssrc
).
data
(),
_strSession
.
data
());
SocketHelper
::
send
(
_pcBuf
,
n
);
}
...
...
@@ -733,9 +733,9 @@ bool RtspSession::handleReq_Play() {
}
for
(
unsigned
int
i
=
0
;
i
<
_uiTrackCnt
;
i
++
)
{
auto
&
track
=
_aTrackInfo
[
i
];
track
.
ssrc
=
pMediaSrc
->
getSsrc
(
track
.
type
);
track
.
seq
=
pMediaSrc
->
getSeqence
(
track
.
type
);
track
.
timeStamp
=
pMediaSrc
->
getTimestamp
(
track
.
type
);
track
->
ssrc
=
pMediaSrc
->
getSsrc
(
track
->
type
);
track
->
seq
=
pMediaSrc
->
getSeqence
(
track
->
type
);
track
->
timeStamp
=
pMediaSrc
->
getTimestamp
(
track
->
type
);
}
}
_bFirstPlay
=
false
;
...
...
@@ -750,13 +750,13 @@ bool RtspSession::handleReq_Play() {
for
(
unsigned
int
i
=
0
;
i
<
_uiTrackCnt
;
i
++
)
{
auto
&
track
=
_aTrackInfo
[
i
];
if
(
track
.
inited
==
false
)
{
if
(
track
->
inited
==
false
)
{
//还有track没有setup
shutdown
();
return
;
}
iLen
+=
sprintf
(
_pcBuf
+
iLen
,
"url=%s/%s;seq=%d;rtptime=%u,"
,
_strUrl
.
data
(),
track
.
controlSuffix
.
data
(),
track
.
seq
,
track
.
timeStamp
);
_strUrl
.
data
(),
track
->
_control_surffix
.
data
(),
track
->
seq
,
track
->
timeStamp
);
}
iLen
-=
1
;
(
_pcBuf
)[
iLen
]
=
'\0'
;
...
...
@@ -895,7 +895,10 @@ inline bool RtspSession::findStream() {
_strSdp
=
pMediaSrc
->
getSdp
();
_pWeakRing
=
pMediaSrc
->
getRing
();
_uiTrackCnt
=
parserSDP
(
_strSdp
,
_aTrackInfo
);
_sdpAttr
.
load
(
_strSdp
);
_aTrackInfo
=
_sdpAttr
.
getAvailableTrack
();
_uiTrackCnt
=
_aTrackInfo
.
size
();
if
(
_uiTrackCnt
==
0
||
_uiTrackCnt
>
2
)
{
return
false
;
}
...
...
@@ -904,9 +907,9 @@ inline bool RtspSession::findStream() {
for
(
unsigned
int
i
=
0
;
i
<
_uiTrackCnt
;
i
++
)
{
auto
&
track
=
_aTrackInfo
[
i
];
track
.
ssrc
=
pMediaSrc
->
getSsrc
(
track
.
type
);
track
.
seq
=
pMediaSrc
->
getSeqence
(
track
.
type
);
track
.
timeStamp
=
pMediaSrc
->
getTimestamp
(
track
.
type
);
track
->
ssrc
=
pMediaSrc
->
getSsrc
(
track
->
type
);
track
->
seq
=
pMediaSrc
->
getSeqence
(
track
->
type
);
track
->
timeStamp
=
pMediaSrc
->
getTimestamp
(
track
->
type
);
}
return
true
;
...
...
src/Rtsp/RtspSession.h
查看文件 @
6fe90fe4
...
...
@@ -118,7 +118,7 @@ private:
}
inline
int
getTrackIndexByTrackType
(
TrackType
type
)
{
for
(
unsigned
int
i
=
0
;
i
<
_uiTrackCnt
;
i
++
)
{
if
(
type
==
_aTrackInfo
[
i
]
.
type
)
{
if
(
type
==
_aTrackInfo
[
i
]
->
type
)
{
return
i
;
}
}
...
...
@@ -126,7 +126,7 @@ private:
}
inline
int
getTrackIndexByControlSuffix
(
const
string
&
controlSuffix
)
{
for
(
unsigned
int
i
=
0
;
i
<
_uiTrackCnt
;
i
++
)
{
if
(
controlSuffix
==
_aTrackInfo
[
i
]
.
controlSu
ffix
)
{
if
(
controlSuffix
==
_aTrackInfo
[
i
]
->
_control_sur
ffix
)
{
return
i
;
}
}
...
...
@@ -161,8 +161,11 @@ private:
PlayerBase
::
eRtpType
_rtpType
=
PlayerBase
::
RTP_UDP
;
bool
_bSetUped
=
false
;
int
_iCseq
=
0
;
SdpAttr
_sdpAttr
;
unsigned
int
_uiTrackCnt
=
0
;
//媒体track个数
RtspTrack
_aTrackInfo
[
2
];
//媒体track信息,trackid idx 为数组下标
vector
<
SdpTrack
::
Ptr
>
_aTrackInfo
;
bool
_bGotAllPeerUdp
=
false
;
#ifdef RTSP_SEND_RTCP
...
...
src/RtspMuxer/RtspDemuxer.cpp
查看文件 @
6fe90fe4
...
...
@@ -51,25 +51,34 @@ static int getTimeInSDP(const string &sdp) {
return
atof
(
strEnd
.
data
())
-
atof
(
strStart
.
data
());
}
RtspDemuxer
::
RtspDemuxer
(
const
string
&
sdp
)
{
RtspTrack
tmp
[
2
];
int
cnt
=
parserSDP
(
sdp
,
tmp
);
for
(
int
i
=
0
;
i
<
cnt
;
i
++
)
{
switch
(
tmp
[
i
].
type
)
{
case
TrackVideo
:
{
makeVideoTrack
(
tmp
[
i
]);
}
break
;
case
TrackAudio
:
{
makeAudioTrack
(
tmp
[
i
]);
}
break
;
default
:
break
;
loadSdp
(
SdpAttr
(
sdp
));
}
RtspDemuxer
::
RtspDemuxer
(
const
SdpAttr
&
attr
)
{
loadSdp
(
attr
);
}
void
RtspDemuxer
::
loadSdp
(
const
SdpAttr
&
attr
)
{
auto
tracks
=
attr
.
getAvailableTrack
();
for
(
auto
&
track
:
tracks
){
switch
(
track
->
type
)
{
case
TrackVideo
:
{
makeVideoTrack
(
track
);
}
break
;
case
TrackAudio
:
{
makeAudioTrack
(
track
);
}
break
;
default
:
break
;
}
}
_fDuration
=
getTimeInSDP
(
sdp
);
auto
titleTrack
=
attr
.
getTrack
(
TrackTitle
);
if
(
titleTrack
){
_fDuration
=
titleTrack
->
_duration
;
}
}
bool
RtspDemuxer
::
inputRtp
(
const
RtpPacket
::
Ptr
&
rtp
)
{
switch
(
rtp
->
type
)
{
case
TrackVideo
:{
...
...
@@ -91,9 +100,9 @@ bool RtspDemuxer::inputRtp(const RtpPacket::Ptr & rtp) {
}
void
RtspDemuxer
::
makeAudioTrack
(
const
RtspTrack
&
audio
)
{
void
RtspDemuxer
::
makeAudioTrack
(
const
SdpTrack
::
Ptr
&
audio
)
{
//生成Track对象
_audioTrack
=
dynamic_pointer_cast
<
AudioTrack
>
(
Factory
::
getTrackBySdp
(
audio
.
trackSdp
));
_audioTrack
=
dynamic_pointer_cast
<
AudioTrack
>
(
Factory
::
getTrackBySdp
(
audio
));
if
(
_audioTrack
){
//生成RtpCodec对象以便解码rtp
_audioRtpDecoder
=
Factory
::
getRtpDecoderById
(
_audioTrack
->
getCodecId
(),
_audioTrack
->
getAudioSampleRate
());
...
...
@@ -107,9 +116,9 @@ void RtspDemuxer::makeAudioTrack(const RtspTrack &audio) {
}
}
void
RtspDemuxer
::
makeVideoTrack
(
const
RtspTrack
&
video
)
{
void
RtspDemuxer
::
makeVideoTrack
(
const
SdpTrack
::
Ptr
&
video
)
{
//生成Track对象
_videoTrack
=
dynamic_pointer_cast
<
VideoTrack
>
(
Factory
::
getTrackBySdp
(
video
.
trackSdp
));
_videoTrack
=
dynamic_pointer_cast
<
VideoTrack
>
(
Factory
::
getTrackBySdp
(
video
));
if
(
_videoTrack
){
//生成RtpCodec对象以便解码rtp
_videoRtpDecoder
=
Factory
::
getRtpDecoderById
(
_videoTrack
->
getCodecId
(),
90000
);
...
...
@@ -152,5 +161,4 @@ float RtspDemuxer::getDuration() const {
return
_fDuration
;
}
}
/* namespace mediakit */
src/RtspMuxer/RtspDemuxer.h
查看文件 @
6fe90fe4
...
...
@@ -43,6 +43,7 @@ class RtspDemuxer : public PlayerBase{
public
:
typedef
std
::
shared_ptr
<
RtspDemuxer
>
Ptr
;
RtspDemuxer
(
const
string
&
sdp
);
RtspDemuxer
(
const
SdpAttr
&
attr
);
virtual
~
RtspDemuxer
(){};
/**
...
...
@@ -72,8 +73,9 @@ public:
*/
vector
<
Track
::
Ptr
>
getTracks
()
const
override
;
private
:
void
makeAudioTrack
(
const
RtspTrack
&
audio
);
void
makeVideoTrack
(
const
RtspTrack
&
video
);
void
makeAudioTrack
(
const
SdpTrack
::
Ptr
&
audio
);
void
makeVideoTrack
(
const
SdpTrack
::
Ptr
&
video
);
void
loadSdp
(
const
SdpAttr
&
attr
);
private
:
float
_fDuration
=
0
;
AudioTrack
::
Ptr
_audioTrack
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论