避免 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) {
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);

View File

@ -116,12 +116,14 @@ private:
std::string _play_url;
std::vector<SdpTrack::Ptr> _sdp_track;
std::function<void(const Parser&)> _on_response;
//RTP端口,trackid idx 为数组下标
toolkit::Socket::Ptr _rtp_sock[2];
//RTCP端口,trackid idx 为数组下标
toolkit::Socket::Ptr _rtcp_sock[2];
using OnResponseFunc = std::function<void(const Parser&)>;
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<RtcpContext::Ptr> _rtcp_context;
std::map<uint32_t, OnResponseFunc> _cseq_func_map;
};
} /* namespace mediakit */