Skip to content

Commit d078446

Browse files
authored
兼容某些不规范的rtsp流 (ZLMediaKit#4188)
1 parent 83afaff commit d078446

File tree

5 files changed

+36
-5
lines changed

5 files changed

+36
-5
lines changed

Diff for: src/Rtsp/RtspPlayer.cpp

+17-2
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ void RtspPlayer::sendSetup(unsigned int track_idx) {
265265
case Rtsp::RTP_TCP: {
266266
sendRtspRequest(
267267
"SETUP", control_url,
268-
{ "Transport", StrPrinter << "RTP/AVP/TCP;unicast;interleaved=" << track->_type * 2 << "-" << track->_type * 2 + 1 << ";mode=play" });
268+
{ "Transport", StrPrinter << "RTP/AVP/TCP;unicast;interleaved=" << track_idx * 2 << "-" << track_idx * 2 + 1 << ";mode=play" });
269269
} break;
270270
case Rtsp::RTP_MULTICAST: {
271271
sendRtspRequest("SETUP", control_url, { "Transport", "RTP/AVP;multicast;mode=play" });
@@ -552,7 +552,9 @@ void RtspPlayer::onRtpPacket(const char *data, size_t len) {
552552
int trackIdx = -1;
553553
uint8_t interleaved = data[1];
554554
if (interleaved % 2 == 0) {
555-
trackIdx = getTrackIndexByInterleaved(interleaved);
555+
CHECK(len > RtpPacket::kRtpHeaderSize + RtpPacket::kRtpTcpHeaderSize);
556+
RtpHeader *header = (RtpHeader *)(data + RtpPacket::kRtpTcpHeaderSize);
557+
trackIdx = getTrackIndexByPT(header->pt);
556558
if (trackIdx == -1) {
557559
return;
558560
}
@@ -804,6 +806,19 @@ void RtspPlayer::onPlayResult_l(const SockException &ex, bool handshake_done) {
804806
}
805807
}
806808

809+
int RtspPlayer::getTrackIndexByPT(int pt) const {
810+
for (size_t i = 0; i < _sdp_track.size(); ++i) {
811+
if (_sdp_track[i]->_pt == pt) {
812+
return i;
813+
}
814+
}
815+
if (_sdp_track.size() == 1) {
816+
return 0;
817+
}
818+
WarnL << "no such track with pt:" << pt;
819+
return -1;
820+
}
821+
807822
int RtspPlayer::getTrackIndexByInterleaved(int interleaved) const {
808823
for (size_t i = 0; i < _sdp_track.size(); ++i) {
809824
if (_sdp_track[i]->_interleaved == interleaved) {

Diff for: src/Rtsp/RtspPlayer.h

+1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ class RtspPlayer : public PlayerBase, public toolkit::TcpClient, public RtspSpli
117117
private:
118118
void onPlayResult_l(const toolkit::SockException &ex , bool handshake_done);
119119

120+
int getTrackIndexByPT(int pt) const;
120121
int getTrackIndexByInterleaved(int interleaved) const;
121122
int getTrackIndexByTrackType(TrackType track_type) const;
122123

Diff for: src/Rtsp/RtspPusher.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -277,8 +277,8 @@ void RtspPusher::sendSetup(unsigned int track_idx) {
277277
switch (_rtp_type) {
278278
case Rtsp::RTP_TCP: {
279279
sendRtspRequest("SETUP", control_url, {"Transport",
280-
StrPrinter << "RTP/AVP/TCP;unicast;interleaved=" << track->_type * 2
281-
<< "-" << track->_type * 2 + 1 << ";mode=record"});
280+
StrPrinter << "RTP/AVP/TCP;unicast;interleaved=" << track_idx * 2
281+
<< "-" << track_idx * 2 + 1 << ";mode=record"});
282282
}
283283
break;
284284
case Rtsp::RTP_UDP: {

Diff for: src/Rtsp/RtspSession.cpp

+15-1
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,9 @@ void RtspSession::onWholeRtspPacket(Parser &parser) {
167167
void RtspSession::onRtpPacket(const char *data, size_t len) {
168168
uint8_t interleaved = data[1];
169169
if (interleaved % 2 == 0) {
170-
auto track_idx = getTrackIndexByInterleaved(interleaved);
170+
CHECK(len > RtpPacket::kRtpHeaderSize + RtpPacket::kRtpTcpHeaderSize);
171+
RtpHeader *header = (RtpHeader *)(data + RtpPacket::kRtpTcpHeaderSize);
172+
auto track_idx = getTrackIndexByPT(header->pt);
171173
handleOneRtp(track_idx, _sdp_track[track_idx]->_type, _sdp_track[track_idx]->_samplerate, (uint8_t *) data + RtpPacket::kRtpTcpHeaderSize, len - RtpPacket::kRtpTcpHeaderSize);
172174
} else {
173175
auto track_idx = getTrackIndexByInterleaved(interleaved - 1);
@@ -1124,6 +1126,18 @@ bool RtspSession::sendRtspResponse(const string &res_code, const std::initialize
11241126
return sendRtspResponse(res_code,header_map,sdp,protocol);
11251127
}
11261128

1129+
int RtspSession::getTrackIndexByPT(int pt) const {
1130+
for (size_t i = 0; i < _sdp_track.size(); ++i) {
1131+
if (pt == _sdp_track[i]->_pt) {
1132+
return i;
1133+
}
1134+
}
1135+
if (_sdp_track.size() == 1) {
1136+
return 0;
1137+
}
1138+
throw SockException(Err_shutdown, StrPrinter << "no such track with pt:" << pt);
1139+
}
1140+
11271141
int RtspSession::getTrackIndexByTrackType(TrackType type) {
11281142
for (size_t i = 0; i < _sdp_track.size(); ++i) {
11291143
if (type == _sdp_track[i]->_type) {

Diff for: src/Rtsp/RtspSession.h

+1
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ class RtspSession : public toolkit::Session, public RtspSplitter, public RtpRece
153153
void send_NotAcceptable();
154154
// 获取track下标 [AUTO-TRANSLATED:36d0b2c2]
155155
// Get the track index
156+
int getTrackIndexByPT(int pt) const;
156157
int getTrackIndexByTrackType(TrackType type);
157158
int getTrackIndexByControlUrl(const std::string &control_url);
158159
int getTrackIndexByInterleaved(int interleaved);

0 commit comments

Comments
 (0)