Commit 1167211d by xiongziliang

完善rtsp服务器

parent 09c1ae87
...@@ -671,11 +671,7 @@ bool RtspSession::handleReq_Setup() { ...@@ -671,11 +671,7 @@ bool RtspSession::handleReq_Setup() {
} }
bool RtspSession::handleReq_Play() { bool RtspSession::handleReq_Play() {
if (_aTrackInfo.size() == 0) { if (_aTrackInfo.empty() || _parser["Session"] != _strSession) {
//还没有Describe
return false;
}
if (_parser["Session"] != _strSession) {
send_SessionNotFound(); send_SessionNotFound();
return false; return false;
} }
...@@ -684,7 +680,7 @@ bool RtspSession::handleReq_Play() { ...@@ -684,7 +680,7 @@ bool RtspSession::handleReq_Play() {
bool authSuccess = err.empty(); bool authSuccess = err.empty();
char response[2 * 1024]; char response[2 * 1024];
_pcBuf = response; _pcBuf = response;
if(!authSuccess && _bFirstPlay){ if(!authSuccess){
//第一次play是播放,否则是恢复播放。只对播放鉴权 //第一次play是播放,否则是恢复播放。只对播放鉴权
int n = sprintf(_pcBuf, int n = sprintf(_pcBuf,
"RTSP/1.0 401 Unauthorized\r\n" "RTSP/1.0 401 Unauthorized\r\n"
...@@ -700,24 +696,6 @@ bool RtspSession::handleReq_Play() { ...@@ -700,24 +696,6 @@ bool RtspSession::handleReq_Play() {
shutdown(); shutdown();
return; return;
} }
if(_pRtpReader){
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
SockUtil::setNoDelay(_pSender->rawFD(), false);
_pRtpReader->setReadCB([weakSelf](const RtpPacket::Ptr &pack) {
auto strongSelf = weakSelf.lock();
if(!strongSelf) {
return;
}
strongSelf->async([weakSelf,pack](){
auto strongSelf = weakSelf.lock();
if(!strongSelf) {
return;
}
strongSelf->sendRtpPacket(pack);
});
});
}
auto pMediaSrc = _pMediaSrc.lock(); auto pMediaSrc = _pMediaSrc.lock();
if(!pMediaSrc){ if(!pMediaSrc){
...@@ -727,6 +705,7 @@ bool RtspSession::handleReq_Play() { ...@@ -727,6 +705,7 @@ bool RtspSession::handleReq_Play() {
} }
if (strRange.size() && !_bFirstPlay) { if (strRange.size() && !_bFirstPlay) {
//这个是seek操作
auto strStart = FindField(strRange.data(), "npt=", "-"); auto strStart = FindField(strRange.data(), "npt=", "-");
if (strStart == "now") { if (strStart == "now") {
strStart = "0"; strStart = "0";
...@@ -774,6 +753,25 @@ bool RtspSession::handleReq_Play() { ...@@ -774,6 +753,25 @@ bool RtspSession::handleReq_Play() {
//提高发送性能 //提高发送性能
(*this) << SocketFlags(kSockFlags); (*this) << SocketFlags(kSockFlags);
SockUtil::setNoDelay(_pSender->rawFD(),false); SockUtil::setNoDelay(_pSender->rawFD(),false);
if(_pRtpReader){
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
SockUtil::setNoDelay(_pSender->rawFD(), false);
_pRtpReader->setReadCB([weakSelf](const RtpPacket::Ptr &pack) {
auto strongSelf = weakSelf.lock();
if(!strongSelf) {
return;
}
strongSelf->async([weakSelf,pack](){
auto strongSelf = weakSelf.lock();
if(!strongSelf) {
return;
}
strongSelf->sendRtpPacket(pack);
});
});
}
}; };
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this()); weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
...@@ -790,9 +788,16 @@ bool RtspSession::handleReq_Play() { ...@@ -790,9 +788,16 @@ bool RtspSession::handleReq_Play() {
onRes(err); onRes(err);
}); });
}; };
auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed,_mediaInfo,invoker,*this); if(_bFirstPlay){
if(!flag){ _bFirstPlay = false;
//该事件无人监听,默认不鉴权 //第一次收到play命令,需要鉴权
auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed,_mediaInfo,invoker,*this);
if(!flag){
//该事件无人监听,默认不鉴权
onRes("");
}
}else{
//后面是seek或恢复命令,不需要鉴权
onRes(""); onRes("");
} }
return true; return true;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论