避免 rtsp player 请求与回复无法对应

This commit is contained in:
snysmtx 2023-08-14 15:16:05 +08:00
parent 2378617dd8
commit 56afb0e76d
2 changed files with 15 additions and 5 deletions

View File

@ -484,10 +484,14 @@ void RtspPlayer::handleResPAUSE(const Parser &parser, int type) {
void RtspPlayer::onWholeRtspPacket(Parser &parser) { void RtspPlayer::onWholeRtspPacket(Parser &parser) {
try { try {
decltype(_on_response) func; auto headerMap = parser.getHeader();
_on_response.swap(func); auto cseqIter = headerMap.find("CSeq");
if (func) { if (cseqIter != headerMap.end()) {
func(parser); auto funcIter = _cseq_func_map.find(std::stoi(cseqIter->second));
if (funcIter != _cseq_func_map.end()) {
funcIter->second(parser);
_cseq_func_map.erase(funcIter);
}
} }
parser.clear(); parser.clear();
} catch (std::exception &err) { } catch (std::exception &err) {
@ -578,6 +582,8 @@ void RtspPlayer::sendRtspRequest(const string &cmd, const string &url, const std
} }
void RtspPlayer::sendRtspRequest(const string &cmd, const string &url, const StrCaseMap &header_const) { void RtspPlayer::sendRtspRequest(const string &cmd, const string &url, const StrCaseMap &header_const) {
_cseq_func_map.emplace(_cseq_send, _on_response);
auto header = header_const; auto header = header_const;
header.emplace("CSeq", StrPrinter << _cseq_send++); header.emplace("CSeq", StrPrinter << _cseq_send++);
header.emplace("User-Agent", kServerName); header.emplace("User-Agent", kServerName);

View File

@ -116,12 +116,14 @@ private:
std::string _play_url; std::string _play_url;
std::vector<SdpTrack::Ptr> _sdp_track; std::vector<SdpTrack::Ptr> _sdp_track;
std::function<void(const Parser&)> _on_response;
//RTP端口,trackid idx 为数组下标 //RTP端口,trackid idx 为数组下标
toolkit::Socket::Ptr _rtp_sock[2]; toolkit::Socket::Ptr _rtp_sock[2];
//RTCP端口,trackid idx 为数组下标 //RTCP端口,trackid idx 为数组下标
toolkit::Socket::Ptr _rtcp_sock[2]; toolkit::Socket::Ptr _rtcp_sock[2];
using OnResponseFunc = std::function<void(const Parser&)>;
OnResponseFunc _on_response;
//rtsp鉴权相关 //rtsp鉴权相关
std::string _md5_nonce; std::string _md5_nonce;
std::string _realm; std::string _realm;
@ -146,6 +148,8 @@ private:
toolkit::Ticker _rtcp_send_ticker[2]; toolkit::Ticker _rtcp_send_ticker[2];
//统计rtp并发送rtcp //统计rtp并发送rtcp
std::vector<RtcpContext::Ptr> _rtcp_context; std::vector<RtcpContext::Ptr> _rtcp_context;
std::map<uint32_t, OnResponseFunc> _cseq_func_map;
}; };
} /* namespace mediakit */ } /* namespace mediakit */