diff --git a/src/Rtsp/RtspPlayer.cpp b/src/Rtsp/RtspPlayer.cpp index 599677ec..950d7737 100644 --- a/src/Rtsp/RtspPlayer.cpp +++ b/src/Rtsp/RtspPlayer.cpp @@ -484,10 +484,14 @@ void RtspPlayer::handleResPAUSE(const Parser &parser, int type) { void RtspPlayer::onWholeRtspPacket(Parser &parser) { try { - decltype(_on_response) func; - _on_response.swap(func); - if (func) { - func(parser); + auto headerMap = parser.getHeader(); + auto cseqIter = headerMap.find("CSeq"); + if (cseqIter != headerMap.end()) { + 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(); } 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) { + _cseq_func_map.emplace(_cseq_send, _on_response); + auto header = header_const; header.emplace("CSeq", StrPrinter << _cseq_send++); header.emplace("User-Agent", kServerName); diff --git a/src/Rtsp/RtspPlayer.h b/src/Rtsp/RtspPlayer.h index 2b4f34c5..4022c0e6 100644 --- a/src/Rtsp/RtspPlayer.h +++ b/src/Rtsp/RtspPlayer.h @@ -116,12 +116,14 @@ private: std::string _play_url; std::vector _sdp_track; - std::function _on_response; //RTP端口,trackid idx 为数组下标 toolkit::Socket::Ptr _rtp_sock[2]; //RTCP端口,trackid idx 为数组下标 toolkit::Socket::Ptr _rtcp_sock[2]; + using OnResponseFunc = std::function; + OnResponseFunc _on_response; + //rtsp鉴权相关 std::string _md5_nonce; std::string _realm; @@ -146,6 +148,8 @@ private: toolkit::Ticker _rtcp_send_ticker[2]; //统计rtp并发送rtcp std::vector _rtcp_context; + + std::map _cseq_func_map; }; } /* namespace mediakit */