diff --git a/3rdpart/ZLToolKit b/3rdpart/ZLToolKit index eb3e28a6..e0399743 160000 --- a/3rdpart/ZLToolKit +++ b/3rdpart/ZLToolKit @@ -1 +1 @@ -Subproject commit eb3e28a6188fc8a7e5007215cc10a2b8c35c2cdd +Subproject commit e03997435ad388a7c169de7a4b17b76d773ab69b diff --git a/src/Rtmp/RtmpSession.cpp b/src/Rtmp/RtmpSession.cpp index 171daa38..4c1022d6 100644 --- a/src/Rtmp/RtmpSession.cpp +++ b/src/Rtmp/RtmpSession.cpp @@ -46,7 +46,7 @@ RtmpSession::~RtmpSession() { } void RtmpSession::onError(const SockException& err) { - DebugP(this) << err.what(); + WarnP(this) << err.what(); //流量统计事件广播 GET_CONFIG(uint32_t,iFlowThreshold,General::kFlowThreshold); @@ -143,6 +143,7 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) { })); dec.load();/* NULL */ _mediaInfo.parse(_strTcUrl + "/" + dec.load()); + _mediaInfo._schema = RTMP_SCHEMA; auto onRes = [this,pToken](const string &err){ auto src = dynamic_pointer_cast(MediaSource::find(RTMP_SCHEMA, @@ -305,7 +306,6 @@ void RtmpSession::doPlayResponse(const string &err,const std::function weakSelf = dynamic_pointer_cast(shared_from_this()); MediaSource::findAsync(_mediaInfo,weakSelf.lock(), true,[weakSelf,cb](const MediaSource::Ptr &src){ auto rtmp_src = dynamic_pointer_cast(src); @@ -351,6 +351,7 @@ void RtmpSession::onCmd_play2(AMFDecoder &dec) { void RtmpSession::onCmd_play(AMFDecoder &dec) { dec.load();/* NULL */ _mediaInfo.parse(_strTcUrl + "/" + dec.load()); + _mediaInfo._schema = RTMP_SCHEMA; doPlay(dec); } diff --git a/src/Rtsp/RtspMediaSource.h b/src/Rtsp/RtspMediaSource.h index c09712c3..a3377a30 100644 --- a/src/Rtsp/RtspMediaSource.h +++ b/src/Rtsp/RtspMediaSource.h @@ -117,6 +117,9 @@ public: //派生类设置该媒体源媒体描述信息 _strSdp = sdp; _sdpAttr.load(sdp); + if(_pRing){ + regist(); + } } void onWrite(const RtpPacket::Ptr &rtppt, bool keyPos) override { @@ -136,7 +139,9 @@ public: strongSelf->onReaderChanged(size); }); onReaderChanged(0); - regist(); + if(!_strSdp.empty()){ + regist(); + } } _pRing->write(rtppt,keyPos); checkNoneReader(); diff --git a/src/Rtsp/RtspSession.cpp b/src/Rtsp/RtspSession.cpp index 233c54d6..35e4f395 100644 --- a/src/Rtsp/RtspSession.cpp +++ b/src/Rtsp/RtspSession.cpp @@ -147,7 +147,8 @@ void RtspSession::onWholeRtspPacket(Parser &parser) { if(_strContentBase.empty() && strCmd != "GET"){ _strContentBase = parser.Url(); _mediaInfo.parse(parser.FullUrl()); - } + _mediaInfo._schema = RTSP_SCHEMA; + } typedef void (RtspSession::*rtsp_request_handler)(const Parser &parser); static unordered_map s_handler_map; @@ -257,7 +258,6 @@ void RtspSession::handleReq_RECORD(const Parser &parser){ auto onRes = [this](const string &err){ bool authSuccess = err.empty(); if(!authSuccess){ - //第一次play是播放,否则是恢复播放。只对播放鉴权 sendRtspResponse("401 Unauthorized", {"Content-Type", "text/plain"}, err); shutdown(SockException(Err_shutdown,StrPrinter << "401 Unauthorized:" << err)); return; @@ -307,10 +307,46 @@ void RtspSession::handleReq_RECORD(const Parser &parser){ } void RtspSession::handleReq_Describe(const Parser &parser) { - _mediaInfo._schema = RTSP_SCHEMA; - auto authorization = parser["Authorization"]; weak_ptr weakSelf = dynamic_pointer_cast(shared_from_this()); - MediaSource::findAsync(_mediaInfo,weakSelf.lock(), true,[weakSelf,authorization](const MediaSource::Ptr &src){ + //该请求中的认证信息 + auto authorization = parser["Authorization"]; + onGetRealm invoker = [weakSelf,authorization](const string &realm){ + auto strongSelf = weakSelf.lock(); + if(!strongSelf){ + //本对象已经销毁 + return; + } + //切换到自己的线程然后执行 + strongSelf->async([weakSelf,realm,authorization](){ + auto strongSelf = weakSelf.lock(); + if(!strongSelf){ + //本对象已经销毁 + return; + } + if(realm.empty()){ + //无需认证,回复sdp + strongSelf->onAuthSuccess(); + return; + } + //该流需要认证 + strongSelf->onAuthUser(realm,authorization); + }); + + }; + + //广播是否需要认证事件 + if(!NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastOnGetRtspRealm, + _mediaInfo, + invoker, + *this)){ + //无人监听此事件,说明无需认证 + invoker(""); + } +} +void RtspSession::onAuthSuccess() { + TraceP(this); + weak_ptr weakSelf = dynamic_pointer_cast(shared_from_this()); + MediaSource::findAsync(_mediaInfo,weakSelf.lock(), true,[weakSelf](const MediaSource::Ptr &src){ auto strongSelf = weakSelf.lock(); if(!strongSelf){ return; @@ -330,7 +366,7 @@ void RtspSession::handleReq_Describe(const Parser &parser) { if (strongSelf->_aTrackInfo.empty()) { //该流无效 strongSelf->send_StreamNotFound(); - strongSelf->shutdown(SockException(Err_shutdown,"can not find any availabe track in sdp")); + strongSelf->shutdown(SockException(Err_shutdown,"can not find any availabe track in sdp:" << strongSelf->_strSdp)); return; } strongSelf->_strSession = makeRandStr(12); @@ -341,49 +377,13 @@ void RtspSession::handleReq_Describe(const Parser &parser) { track->_time_stamp = rtsp_src->getTimeStamp(track->_type); } - //该请求中的认证信息 - onGetRealm invoker = [weakSelf,authorization](const string &realm){ - auto strongSelf = weakSelf.lock(); - if(!strongSelf){ - //本对象已经销毁 - return; - } - //切换到自己的线程然后执行 - strongSelf->async([weakSelf,realm,authorization](){ - auto strongSelf = weakSelf.lock(); - if(!strongSelf){ - //本对象已经销毁 - return; - } - if(realm.empty()){ - //无需认证,回复sdp - strongSelf->onAuthSuccess(); - return; - } - //该流需要认证 - strongSelf->onAuthUser(realm,authorization); - }); - - }; - - //广播是否需要认证事件 - if(!NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastOnGetRtspRealm, - strongSelf->_mediaInfo, - invoker, - *strongSelf)){ - //无人监听此事件,说明无需认证 - invoker(""); - } + strongSelf->sendRtspResponse("200 OK", + {"Content-Base",strongSelf->_strContentBase + "/", + "x-Accept-Retransmit","our-retransmit", + "x-Accept-Dynamic-Rate","1" + },strongSelf->_strSdp); }); } -void RtspSession::onAuthSuccess() { - TraceP(this); - sendRtspResponse("200 OK", - {"Content-Base",_strContentBase + "/", - "x-Accept-Retransmit","our-retransmit", - "x-Accept-Dynamic-Rate","1" - },_strSdp); -} void RtspSession::onAuthFailed(const string &realm,const string &why,bool close) { GET_CONFIG(bool,authBasic,Rtsp::kAuthBasic); if (!authBasic) {