修复rtsp时间戳相关bug
This commit is contained in:
parent
1629d1f63a
commit
09c1ae87f3
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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() {
|
||||||
|
|
||||||
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() {
|
||||||
//尝试获取客户端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() {
|
||||||
}
|
}
|
||||||
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() {
|
||||||
}
|
}
|
||||||
|
|
||||||
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() {
|
||||||
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() {
|
||||||
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() {
|
||||||
}
|
}
|
||||||
|
|
||||||
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() {
|
||||||
|
|
||||||
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() {
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue