Commit 0779a4be by xiongziliang

完善rtsp 信令心跳包相关逻辑

parent 0e9d8df2
...@@ -107,8 +107,7 @@ void RtspPlayer::onConnect(const SockException &err){ ...@@ -107,8 +107,7 @@ void RtspPlayer::onConnect(const SockException &err){
onPlayResult_l(err,false); onPlayResult_l(err,false);
return; return;
} }
sendOptions();
sendDescribe();
} }
void RtspPlayer::onRecv(const Buffer::Ptr& pBuf) { void RtspPlayer::onRecv(const Buffer::Ptr& pBuf) {
...@@ -162,7 +161,7 @@ void RtspPlayer::handleResDESCRIBE(const Parser& parser) { ...@@ -162,7 +161,7 @@ void RtspPlayer::handleResDESCRIBE(const Parser& parser) {
string authInfo = parser["WWW-Authenticate"]; string authInfo = parser["WWW-Authenticate"];
//发送DESCRIBE命令后的回复 //发送DESCRIBE命令后的回复
if ((parser.Url() == "401") && handleAuthenticationFailure(authInfo)) { if ((parser.Url() == "401") && handleAuthenticationFailure(authInfo)) {
sendDescribe(); sendOptions();
return; return;
} }
if(parser.Url() == "302" || parser.Url() == "301"){ if(parser.Url() == "302" || parser.Url() == "301"){
...@@ -358,9 +357,33 @@ void RtspPlayer::sendDescribe() { ...@@ -358,9 +357,33 @@ void RtspPlayer::sendDescribe() {
sendRtspRequest("DESCRIBE",_strUrl,{"Accept","application/sdp"}); sendRtspRequest("DESCRIBE",_strUrl,{"Accept","application/sdp"});
} }
void RtspPlayer::sendGetParameter(){ void RtspPlayer::sendOptions(){
_onHandshake = [this](const Parser& parser){
if (parser.Url() != "200") {
throw std::runtime_error(StrPrinter << "OPTIONS:" << parser.Url() << " " << parser.Tail() << endl);
}
//获取服务器支持的命令
_supported_cmd.clear();
auto public_val = split(parser["Public"],",");
for(auto &cmd : public_val){
trim(cmd);
_supported_cmd.emplace(cmd);
}
//发送Describe请求,获取sdp
sendDescribe();
};
sendRtspRequest("OPTIONS",_strUrl);
}
void RtspPlayer::sendKeepAlive(){
_onHandshake = [this](const Parser& parser){}; _onHandshake = [this](const Parser& parser){};
sendRtspRequest("GET_PARAMETER",_strUrl); if(_supported_cmd.find("GET_PARAMETER") != _supported_cmd.end()){
//支持GET_PARAMETER,用此命令保活
sendRtspRequest("GET_PARAMETER",_strUrl);
}else{
//不支持GET_PARAMETER,用OPTIONS命令保活
sendRtspRequest("OPTIONS",_strUrl);
}
} }
void RtspPlayer::sendPause(int type , uint32_t seekMS){ void RtspPlayer::sendPause(int type , uint32_t seekMS){
...@@ -695,10 +718,10 @@ void RtspPlayer::sendRtspRequest(const string &cmd, const string &url,const StrC ...@@ -695,10 +718,10 @@ void RtspPlayer::sendRtspRequest(const string &cmd, const string &url,const StrC
void RtspPlayer::onRecvRTP_l(const RtpPacket::Ptr &pkt, const SdpTrack::Ptr &track) { void RtspPlayer::onRecvRTP_l(const RtpPacket::Ptr &pkt, const SdpTrack::Ptr &track) {
_rtpTicker.resetTime(); _rtpTicker.resetTime();
onRecvRTP(pkt,track); onRecvRTP(pkt, track);
int iTrackIndex = getTrackIndexByInterleaved(pkt->interleaved); int iTrackIndex = getTrackIndexByInterleaved(pkt->interleaved);
if(iTrackIndex == -1){ if (iTrackIndex == -1) {
return; return;
} }
RtcpCounter &counter = _aRtcpCnt[iTrackIndex]; RtcpCounter &counter = _aRtcpCnt[iTrackIndex];
...@@ -708,14 +731,17 @@ void RtspPlayer::onRecvRTP_l(const RtpPacket::Ptr &pkt, const SdpTrack::Ptr &tra ...@@ -708,14 +731,17 @@ void RtspPlayer::onRecvRTP_l(const RtpPacket::Ptr &pkt, const SdpTrack::Ptr &tra
//send rtcp every 5 second //send rtcp every 5 second
counter.lastTimeStamp = counter.timeStamp; counter.lastTimeStamp = counter.timeStamp;
//直接保存网络字节序 //直接保存网络字节序
memcpy(&counter.timeStamp, pkt->data() + 8 , 4); memcpy(&counter.timeStamp, pkt->data() + 8, 4);
if(counter.lastTimeStamp != 0){ if (counter.lastTimeStamp != 0) {
sendReceiverReport(_eType == Rtsp::RTP_TCP,iTrackIndex); sendReceiverReport(_eType == Rtsp::RTP_TCP, iTrackIndex);
ticker.resetTime(); ticker.resetTime();
} }
//有些rtsp服务器需要rtcp保活,有些需要发送信令保活 //有些rtsp服务器需要rtcp保活,有些需要发送信令保活
sendGetParameter(); if (iTrackIndex == 0) {
//只需要发送一次心跳信令包
sendKeepAlive();
}
} }
} }
......
...@@ -95,11 +95,11 @@ private: ...@@ -95,11 +95,11 @@ private:
bool handleAuthenticationFailure(const string &wwwAuthenticateParamsStr); bool handleAuthenticationFailure(const string &wwwAuthenticateParamsStr);
void handleResPAUSE(const Parser &parser, int type); void handleResPAUSE(const Parser &parser, int type);
//发送SETUP命令 void sendOptions();
void sendSetup(unsigned int uiTrackIndex); void sendSetup(unsigned int uiTrackIndex);
void sendPause(int type , uint32_t ms); void sendPause(int type , uint32_t ms);
void sendDescribe(); void sendDescribe();
void sendGetParameter(); void sendKeepAlive();
void sendRtspRequest(const string &cmd, const string &url ,const StrCaseMap &header = StrCaseMap()); void sendRtspRequest(const string &cmd, const string &url ,const StrCaseMap &header = StrCaseMap());
void sendRtspRequest(const string &cmd, const string &url ,const std::initializer_list<string> &header); void sendRtspRequest(const string &cmd, const string &url ,const std::initializer_list<string> &header);
void sendReceiverReport(bool overTcp,int iTrackIndex); void sendReceiverReport(bool overTcp,int iTrackIndex);
...@@ -141,6 +141,9 @@ private: ...@@ -141,6 +141,9 @@ private:
bool _is_play_back; bool _is_play_back;
//是否为性能测试模式 //是否为性能测试模式
bool _benchmark_mode = false; bool _benchmark_mode = false;
//服务器支持的命令
set<string> _supported_cmd;
}; };
} /* namespace mediakit */ } /* namespace mediakit */
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论