Commit 09c1ae87 by xiongziliang

修复rtsp时间戳相关bug

parent 1629d1f6
...@@ -205,15 +205,16 @@ void RtspSession::inputRtspOrRtcp(const char *data,uint64_t len) { ...@@ -205,15 +205,16 @@ void RtspSession::inputRtspOrRtcp(const char *data,uint64_t len) {
bool RtspSession::handleReq_Options() { bool RtspSession::handleReq_Options() {
//支持这些命令 //支持这些命令
int n = sprintf(_pcBuf, "RTSP/1.0 200 OK\r\n" int n = sprintf(_pcBuf,
"CSeq: %d\r\n" "RTSP/1.0 200 OK\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "CSeq: %d\r\n"
"%s" "Server: %s-%0.2f(build in %s)\r\n"
"Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY," "%s"
" PAUSE, SET_PARAMETER, GET_PARAMETER\r\n\r\n", "Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY,"
_iCseq, SERVER_NAME, " PAUSE, SET_PARAMETER, GET_PARAMETER\r\n\r\n",
RTSP_VERSION, RTSP_BUILDTIME, _iCseq, SERVER_NAME,
dateHeader().data()); RTSP_VERSION, RTSP_BUILDTIME,
dateHeader().data());
SocketHelper::send(_pcBuf, n); SocketHelper::send(_pcBuf, n);
return true; return true;
} }
...@@ -467,37 +468,40 @@ void RtspSession::onAuthUser(const weak_ptr<RtspSession> &weakSelf,const string ...@@ -467,37 +468,40 @@ void RtspSession::onAuthUser(const weak_ptr<RtspSession> &weakSelf,const string
} }
} }
inline void RtspSession::send_StreamNotFound() { inline void RtspSession::send_StreamNotFound() {
int n = sprintf(_pcBuf, "RTSP/1.0 404 Stream Not Found\r\n" int n = sprintf(_pcBuf,
"CSeq: %d\r\n" "RTSP/1.0 404 Stream Not Found\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "CSeq: %d\r\n"
"%s" "Server: %s-%0.2f(build in %s)\r\n"
"Connection: Close\r\n\r\n", "%s"
_iCseq, SERVER_NAME, "Connection: Close\r\n\r\n",
RTSP_VERSION, RTSP_BUILDTIME, _iCseq, SERVER_NAME,
dateHeader().data()); RTSP_VERSION, RTSP_BUILDTIME,
dateHeader().data());
SocketHelper::send(_pcBuf, n); SocketHelper::send(_pcBuf, n);
} }
inline void RtspSession::send_UnsupportedTransport() { inline void RtspSession::send_UnsupportedTransport() {
int n = sprintf(_pcBuf, "RTSP/1.0 461 Unsupported Transport\r\n" int n = sprintf(_pcBuf,
"CSeq: %d\r\n" "RTSP/1.0 461 Unsupported Transport\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "CSeq: %d\r\n"
"%s" "Server: %s-%0.2f(build in %s)\r\n"
"Connection: Close\r\n\r\n", "%s"
_iCseq, SERVER_NAME, "Connection: Close\r\n\r\n",
RTSP_VERSION, RTSP_BUILDTIME, _iCseq, SERVER_NAME,
dateHeader().data()); RTSP_VERSION, RTSP_BUILDTIME,
dateHeader().data());
SocketHelper::send(_pcBuf, n); SocketHelper::send(_pcBuf, n);
} }
inline void RtspSession::send_SessionNotFound() { inline void RtspSession::send_SessionNotFound() {
int n = sprintf(_pcBuf, "RTSP/1.0 454 Session Not Found\r\n" int n = sprintf(_pcBuf,
"CSeq: %d\r\n" "RTSP/1.0 454 Session Not Found\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "CSeq: %d\r\n"
"%s" "Server: %s-%0.2f(build in %s)\r\n"
"Connection: Close\r\n\r\n", "%s"
_iCseq, SERVER_NAME, "Connection: Close\r\n\r\n",
RTSP_VERSION, RTSP_BUILDTIME, _iCseq, SERVER_NAME,
dateHeader().data()); RTSP_VERSION, RTSP_BUILDTIME,
dateHeader().data());
SocketHelper::send(_pcBuf, n); SocketHelper::send(_pcBuf, n);
/*40 Method Not Allowed*/ /*40 Method Not Allowed*/
...@@ -551,21 +555,22 @@ bool RtspSession::handleReq_Setup() { ...@@ -551,21 +555,22 @@ bool RtspSession::handleReq_Setup() {
switch (_rtpType) { switch (_rtpType) {
case PlayerBase::RTP_TCP: { case PlayerBase::RTP_TCP: {
int iLen = sprintf(_pcBuf, "RTSP/1.0 200 OK\r\n" int iLen = sprintf(_pcBuf,
"CSeq: %d\r\n" "RTSP/1.0 200 OK\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "CSeq: %d\r\n"
"%s" "Server: %s-%0.2f(build in %s)\r\n"
"Transport: RTP/AVP/TCP;unicast;" "%s"
"interleaved=%d-%d;ssrc=%s;mode=play\r\n" "Transport: RTP/AVP/TCP;unicast;"
"Session: %s\r\n" "interleaved=%d-%d;ssrc=%s;mode=play\r\n"
"x-Transport-Options: late-tolerance=1.400000\r\n" "Session: %s\r\n"
"x-Dynamic-Rate: 1\r\n\r\n", "x-Transport-Options: late-tolerance=1.400000\r\n"
_iCseq, SERVER_NAME, "x-Dynamic-Rate: 1\r\n\r\n",
RTSP_VERSION, RTSP_BUILDTIME, _iCseq, SERVER_NAME,
dateHeader().data(), trackRef->_type * 2, RTSP_VERSION, RTSP_BUILDTIME,
trackRef->_type * 2 + 1, dateHeader().data(), trackRef->_type * 2,
printSSRC(trackRef->_ssrc).data(), trackRef->_type * 2 + 1,
_strSession.data()); printSSRC(trackRef->_ssrc).data(),
_strSession.data());
SocketHelper::send(_pcBuf, iLen); SocketHelper::send(_pcBuf, iLen);
} }
break; break;
...@@ -598,19 +603,20 @@ bool RtspSession::handleReq_Setup() { ...@@ -598,19 +603,20 @@ bool RtspSession::handleReq_Setup() {
//尝试获取客户端nat映射地址 //尝试获取客户端nat映射地址
startListenPeerUdpData(); startListenPeerUdpData();
//InfoL << "分配端口:" << srv_port; //InfoL << "分配端口:" << srv_port;
int n = sprintf(_pcBuf, "RTSP/1.0 200 OK\r\n" int n = sprintf(_pcBuf,
"CSeq: %d\r\n" "RTSP/1.0 200 OK\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "CSeq: %d\r\n"
"%s" "Server: %s-%0.2f(build in %s)\r\n"
"Transport: RTP/AVP/UDP;unicast;" "%s"
"client_port=%s;server_port=%d-%d;ssrc=%s;mode=play\r\n" "Transport: RTP/AVP/UDP;unicast;"
"Session: %s\r\n\r\n", "client_port=%s;server_port=%d-%d;ssrc=%s;mode=play\r\n"
_iCseq, SERVER_NAME, "Session: %s\r\n\r\n",
RTSP_VERSION, RTSP_BUILDTIME, _iCseq, SERVER_NAME,
dateHeader().data(), strClientPort.data(), RTSP_VERSION, RTSP_BUILDTIME,
pSockRtp->get_local_port(), pSockRtcp->get_local_port(), dateHeader().data(), strClientPort.data(),
printSSRC(trackRef->_ssrc).data(), pSockRtp->get_local_port(), pSockRtcp->get_local_port(),
_strSession.data()); printSSRC(trackRef->_ssrc).data(),
_strSession.data());
SocketHelper::send(_pcBuf, n); SocketHelper::send(_pcBuf, n);
} }
break; break;
...@@ -641,19 +647,20 @@ bool RtspSession::handleReq_Setup() { ...@@ -641,19 +647,20 @@ bool RtspSession::handleReq_Setup() {
} }
startListenPeerUdpData(); startListenPeerUdpData();
GET_CONFIG_AND_REGISTER(uint32_t,udpTTL,MultiCast::kUdpTTL); GET_CONFIG_AND_REGISTER(uint32_t,udpTTL,MultiCast::kUdpTTL);
int n = sprintf(_pcBuf, "RTSP/1.0 200 OK\r\n" int n = sprintf(_pcBuf,
"CSeq: %d\r\n" "RTSP/1.0 200 OK\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "CSeq: %d\r\n"
"%s" "Server: %s-%0.2f(build in %s)\r\n"
"Transport: RTP/AVP;multicast;destination=%s;" "%s"
"source=%s;port=%d-%d;ttl=%d;ssrc=%s\r\n" "Transport: RTP/AVP;multicast;destination=%s;"
"Session: %s\r\n\r\n", "source=%s;port=%d-%d;ttl=%d;ssrc=%s\r\n"
_iCseq, SERVER_NAME, "Session: %s\r\n\r\n",
RTSP_VERSION, RTSP_BUILDTIME, _iCseq, SERVER_NAME,
dateHeader().data(), _pBrdcaster->getIP().data(), RTSP_VERSION, RTSP_BUILDTIME,
get_local_ip().data(), iSrvPort, pSockRtcp->get_local_port(), dateHeader().data(), _pBrdcaster->getIP().data(),
udpTTL,printSSRC(trackRef->_ssrc).data(), get_local_ip().data(), iSrvPort, pSockRtcp->get_local_port(),
_strSession.data()); udpTTL, printSSRC(trackRef->_ssrc).data(),
_strSession.data());
SocketHelper::send(_pcBuf, n); SocketHelper::send(_pcBuf, n);
} }
break; break;
...@@ -713,40 +720,34 @@ bool RtspSession::handleReq_Play() { ...@@ -713,40 +720,34 @@ bool RtspSession::handleReq_Play() {
} }
auto pMediaSrc = _pMediaSrc.lock(); auto pMediaSrc = _pMediaSrc.lock();
uint32_t iStamp = 0; if(!pMediaSrc){
if(pMediaSrc){ send_StreamNotFound();
if (strRange.size() && !_bFirstPlay) { shutdown();
auto strStart = FindField(strRange.data(), "npt=", "-"); return;
if (strStart == "now") {
strStart = "0";
}
auto iStartTime = 1000 * atof(strStart.data());
InfoL << "rtsp seekTo(ms):" << iStartTime;
pMediaSrc->seekTo(iStartTime);
iStamp = pMediaSrc->getTimeStamp(TrackInvalid);
}else if(pMediaSrc->getRing()->readerCount() == 1){
//第一个消费者
pMediaSrc->seekTo(0);
iStamp = 0;
}else{
iStamp = pMediaSrc->getTimeStamp(TrackInvalid);
}
for(auto &track : _aTrackInfo){
track->_ssrc = pMediaSrc->getSsrc(track->_type);
track->_seq = pMediaSrc->getSeqence(track->_type);
track->_time_stamp = pMediaSrc->getTimeStamp(track->_type);
}
} }
_bFirstPlay = false;
int iLen = sprintf(_pcBuf, "RTSP/1.0 200 OK\r\n" if (strRange.size() && !_bFirstPlay) {
"CSeq: %d\r\n" auto strStart = FindField(strRange.data(), "npt=", "-");
"Server: %s-%0.2f(build in %s)\r\n" if (strStart == "now") {
"%s" strStart = "0";
"Session: %s\r\n" }
"Range: npt=%.2f-\r\n" auto iStartTime = 1000 * atof(strStart.data());
"RTP-Info: ", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME, InfoL << "rtsp seekTo(ms):" << iStartTime;
dateHeader().data(), _strSession.data(),iStamp/1000.0); pMediaSrc->seekTo(iStartTime);
}else if(pMediaSrc->getRing()->readerCount() == 1){
//第一个消费者
pMediaSrc->seekTo(0);
}
_bFirstPlay = false;
int iLen = sprintf(_pcBuf,
"RTSP/1.0 200 OK\r\n"
"CSeq: %d\r\n"
"Server: %s-%0.2f(build in %s)\r\n"
"%s"
"Session: %s\r\n"
"Range: npt=%.2f-\r\n"
"RTP-Info: ", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME,
dateHeader().data(), _strSession.data(), pMediaSrc->getTimeStamp(TrackInvalid) / 1000.0);
for(auto &track : _aTrackInfo){ for(auto &track : _aTrackInfo){
if (track->_inited == false) { if (track->_inited == false) {
...@@ -754,11 +755,15 @@ bool RtspSession::handleReq_Play() { ...@@ -754,11 +755,15 @@ bool RtspSession::handleReq_Play() {
shutdown(); shutdown();
return; return;
} }
track->_ssrc = pMediaSrc->getSsrc(track->_type);
track->_seq = pMediaSrc->getSeqence(track->_type);
track->_time_stamp = pMediaSrc->getTimeStamp(track->_type);
iLen += sprintf(_pcBuf + iLen, "url=%s/%s;seq=%d;rtptime=%u,", iLen += sprintf(_pcBuf + iLen, "url=%s/%s;seq=%d;rtptime=%u,",
_strUrl.data(), _strUrl.data(),
track->_control_surffix.data(), track->_control_surffix.data(),
track->_seq, track->_seq,
track->_time_stamp * track->_samplerate / 1000); track->_time_stamp * (track->_samplerate / 1000));
} }
iLen -= 1; iLen -= 1;
...@@ -798,14 +803,15 @@ bool RtspSession::handleReq_Pause() { ...@@ -798,14 +803,15 @@ bool RtspSession::handleReq_Pause() {
send_SessionNotFound(); send_SessionNotFound();
return false; return false;
} }
int n = sprintf(_pcBuf, "RTSP/1.0 200 OK\r\n" int n = sprintf(_pcBuf,
"CSeq: %d\r\n" "RTSP/1.0 200 OK\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "CSeq: %d\r\n"
"%s" "Server: %s-%0.2f(build in %s)\r\n"
"Session: %s\r\n\r\n", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME, "%s"
dateHeader().data(), _strSession.data()); "Session: %s\r\n\r\n", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME,
dateHeader().data(), _strSession.data());
SocketHelper::send(_pcBuf, n); SocketHelper::send(_pcBuf, n);
if(_pRtpReader){ if (_pRtpReader) {
_pRtpReader->setReadCB(nullptr); _pRtpReader->setReadCB(nullptr);
} }
return true; return true;
...@@ -813,13 +819,13 @@ bool RtspSession::handleReq_Pause() { ...@@ -813,13 +819,13 @@ bool RtspSession::handleReq_Pause() {
} }
bool RtspSession::handleReq_Teardown() { bool RtspSession::handleReq_Teardown() {
int n = sprintf(_pcBuf, "RTSP/1.0 200 OK\r\n" int n = sprintf(_pcBuf,
"CSeq: %d\r\n" "RTSP/1.0 200 OK\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "CSeq: %d\r\n"
"%s" "Server: %s-%0.2f(build in %s)\r\n"
"Session: %s\r\n\r\n", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME, "%s"
dateHeader().data(), _strSession.data()); "Session: %s\r\n\r\n", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME,
dateHeader().data(), _strSession.data());
SocketHelper::send(_pcBuf, n); SocketHelper::send(_pcBuf, n);
TraceL << "播放器断开连接!"; TraceL << "播放器断开连接!";
return false; return false;
...@@ -827,13 +833,14 @@ bool RtspSession::handleReq_Teardown() { ...@@ -827,13 +833,14 @@ bool RtspSession::handleReq_Teardown() {
bool RtspSession::handleReq_Get() { bool RtspSession::handleReq_Get() {
_strSessionCookie = _parser["x-sessioncookie"]; _strSessionCookie = _parser["x-sessioncookie"];
int n = sprintf(_pcBuf, "HTTP/1.0 200 OK\r\n" int n = sprintf(_pcBuf,
"%s" "HTTP/1.0 200 OK\r\n"
"Connection: close\r\n" "%s"
"Cache-Control: no-store\r\n" "Connection: close\r\n"
"Pragma: no-cache\r\n" "Cache-Control: no-store\r\n"
"Content-Type: application/x-rtsp-tunnelled\r\n\r\n", "Pragma: no-cache\r\n"
dateHeader().data()); "Content-Type: application/x-rtsp-tunnelled\r\n\r\n",
dateHeader().data());
//注册GET //注册GET
lock_guard<recursive_mutex> lock(g_mtxGetter); lock_guard<recursive_mutex> lock(g_mtxGetter);
g_mapGetter[_strSessionCookie] = dynamic_pointer_cast<RtspSession>(shared_from_this()); g_mapGetter[_strSessionCookie] = dynamic_pointer_cast<RtspSession>(shared_from_this());
...@@ -867,23 +874,25 @@ bool RtspSession::handleReq_Post() { ...@@ -867,23 +874,25 @@ bool RtspSession::handleReq_Post() {
bool RtspSession::handleReq_SET_PARAMETER() { bool RtspSession::handleReq_SET_PARAMETER() {
//TraceL<<endl; //TraceL<<endl;
int n = sprintf(_pcBuf, "RTSP/1.0 200 OK\r\n" int n = sprintf(_pcBuf,
"CSeq: %d\r\n" "RTSP/1.0 200 OK\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "CSeq: %d\r\n"
"%s" "Server: %s-%0.2f(build in %s)\r\n"
"Session: %s\r\n\r\n", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME, "%s"
dateHeader().data(), _strSession.data()); "Session: %s\r\n\r\n", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME,
dateHeader().data(), _strSession.data());
SocketHelper::send(_pcBuf, n); SocketHelper::send(_pcBuf, n);
return true; return true;
} }
inline void RtspSession::send_NotAcceptable() { inline void RtspSession::send_NotAcceptable() {
int n = sprintf(_pcBuf, "RTSP/1.0 406 Not Acceptable\r\n" int n = sprintf(_pcBuf,
"CSeq: %d\r\n" "RTSP/1.0 406 Not Acceptable\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "CSeq: %d\r\n"
"%s" "Server: %s-%0.2f(build in %s)\r\n"
"Connection: Close\r\n\r\n", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME, "%s"
dateHeader().data()); "Connection: Close\r\n\r\n", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME,
dateHeader().data());
SocketHelper::send(_pcBuf, n); SocketHelper::send(_pcBuf, n);
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论