diff --git a/src/Rtsp/Rtsp.cpp b/src/Rtsp/Rtsp.cpp index 4804ea9c..428b0373 100644 --- a/src/Rtsp/Rtsp.cpp +++ b/src/Rtsp/Rtsp.cpp @@ -110,13 +110,13 @@ void SdpAttr::load(const string &sdp) { for (auto &pr : _track_map) { auto &track = *pr.second; if (pr.first == "") { - track.type = TrackTitle; + track._type = TrackTitle; } else if (pr.first == "video") { - track.type = TrackVideo; + track._type = TrackVideo; } else if (pr.first == "audio") { - track.type = TrackAudio; + track._type = TrackAudio; } else { - track.type = TrackInvalid; + track._type = TrackInvalid; } auto it = track._attr.find("range"); @@ -165,7 +165,7 @@ bool SdpAttr::available() const { SdpTrack::Ptr SdpAttr::getTrack(TrackType type) const { for (auto &pr : _track_map){ - if(pr.second->type == type){ + if(pr.second->_type == type){ return pr.second; } } diff --git a/src/Rtsp/Rtsp.h b/src/Rtsp/Rtsp.h index bdd466cd..74053d41 100644 --- a/src/Rtsp/Rtsp.h +++ b/src/Rtsp/Rtsp.h @@ -63,13 +63,13 @@ public: string _fmtp; string _control; string _control_surffix; - TrackType type; + TrackType _type; public: - uint8_t interleaved = 0; - bool inited = false; - uint32_t ssrc = 0; - uint16_t seq = 0; - uint32_t timeStamp = 0; + uint8_t _interleaved = 0; + bool _inited = false; + uint32_t _ssrc = 0; + uint16_t _seq = 0; + uint32_t _time_stamp = 0; }; class SdpAttr { public: diff --git a/src/Rtsp/RtspMediaSource.h b/src/Rtsp/RtspMediaSource.h index 136208a4..078efb09 100644 --- a/src/Rtsp/RtspMediaSource.h +++ b/src/Rtsp/RtspMediaSource.h @@ -71,31 +71,45 @@ public: } virtual uint32_t getSsrc(TrackType trackType) { - return _mapTracks[trackType].ssrc; + auto track = _sdpAttr.getTrack(trackType); + if(!track){ + return 0; + } + return track->_ssrc; } virtual uint16_t getSeqence(TrackType trackType) { - return _mapTracks[trackType].seq; + auto track = _sdpAttr.getTrack(trackType); + if(!track){ + return 0; + } + return track->_seq; } virtual uint32_t getTimestamp(TrackType trackType) { - return _mapTracks[trackType].timeStamp; + auto track = _sdpAttr.getTrack(trackType); + if(!track){ + return 0; + } + return track->_time_stamp; } virtual void onGetSDP(const string& sdp) { //派生类设置该媒体源媒体描述信息 _strSdp = sdp; + _sdpAttr.load(sdp); regist(); } void onWrite(const RtpPacket::Ptr &rtppt, bool keyPos) override { - auto &trackRef = _mapTracks[rtppt->type]; - trackRef.seq = rtppt->sequence; - trackRef.timeStamp = rtppt->timeStamp; - trackRef.ssrc = rtppt->ssrc; - trackRef.type = rtppt->type; + auto track = _sdpAttr.getTrack(rtppt->type); + if(track){ + track->_seq = rtppt->sequence; + track->_time_stamp = rtppt->timeStamp; + track->_ssrc = rtppt->ssrc; + } _pRing->write(rtppt,keyPos); } protected: - unordered_map _mapTracks; + SdpAttr _sdpAttr; string _strSdp; //媒体描述信息 RingType::Ptr _pRing; //rtp环形缓冲 }; diff --git a/src/Rtsp/RtspPlayer.cpp b/src/Rtsp/RtspPlayer.cpp index 7886036c..86673030 100644 --- a/src/Rtsp/RtspPlayer.cpp +++ b/src/Rtsp/RtspPlayer.cpp @@ -287,10 +287,6 @@ void RtspPlayer::handleResDESCRIBE(const Parser& parser) { } CLEAR_ARR(_aui32SsrcErrorCnt) - for (auto &track : _aTrackInfo) { - track->ssrc=0; - } - sendSetup(0); } //发送SETUP命令 @@ -302,7 +298,7 @@ bool RtspPlayer::sendSetup(unsigned int trackIndex) { switch (_eType) { case RTP_TCP: { StrCaseMap header; - header["Transport"] = StrPrinter << "RTP/AVP/TCP;unicast;interleaved=" << track->type * 2 << "-" << track->type * 2 + 1; + header["Transport"] = StrPrinter << "RTP/AVP/TCP;unicast;interleaved=" << track->_type * 2 << "-" << track->_type * 2 + 1; return sendRtspRequest("SETUP",baseUrl,header); } break; @@ -352,7 +348,7 @@ void RtspPlayer::handleResSETUP(const Parser &parser, unsigned int uiTrackIndex) if(_eType == RTP_TCP) { string interleaved = FindField( FindField((strTransport + ";").c_str(), "interleaved=", ";").c_str(), NULL, "-"); - _aTrackInfo[uiTrackIndex]->interleaved = atoi(interleaved.c_str()); + _aTrackInfo[uiTrackIndex]->_interleaved = atoi(interleaved.c_str()); }else{ const char *strPos = (_eType == RTP_MULTICAST ? "port=" : "server_port=") ; auto port_str = FindField((strTransport + ";").c_str(), strPos, ";"); @@ -589,7 +585,7 @@ bool RtspPlayer::handleOneRtp(int iTrackidx, unsigned char *pucData, unsigned in auto &track = _aTrackInfo[iTrackidx]; auto pt_ptr=_pktPool.obtain(); auto &rtppt=*pt_ptr; - rtppt.interleaved = track->interleaved; + rtppt.interleaved = track->_interleaved; rtppt.length = uiLen + 4; rtppt.mark = pucData[1] >> 7; @@ -603,15 +599,15 @@ bool RtspPlayer::handleOneRtp(int iTrackidx, unsigned char *pucData, unsigned in //ssrc memcpy(&rtppt.ssrc,pucData+8,4);//内存对齐 rtppt.ssrc = ntohl(rtppt.ssrc); - rtppt.type = track->type; - if (track->ssrc == 0) { - track->ssrc = rtppt.ssrc; + rtppt.type = track->_type; + if (track->_ssrc == 0) { + track->_ssrc = rtppt.ssrc; //保存SSRC - } else if (track->ssrc != rtppt.ssrc) { + } else if (track->_ssrc != rtppt.ssrc) { //ssrc错误 WarnL << "ssrc错误"; if (_aui32SsrcErrorCnt[iTrackidx]++ > 10) { - track->ssrc = rtppt.ssrc; + track->_ssrc = rtppt.ssrc; WarnL << "ssrc更换!"; } return false; @@ -815,7 +811,7 @@ int RtspPlayer::getTrackIndexByControlSuffix(const string &controlSuffix) const{ } int RtspPlayer::getTrackIndexByInterleaved(int interleaved) const{ for (unsigned int i = 0; i < _aTrackInfo.size(); i++) { - if (_aTrackInfo[i]->interleaved == interleaved) { + if (_aTrackInfo[i]->_interleaved == interleaved) { return i; } } @@ -824,7 +820,7 @@ int RtspPlayer::getTrackIndexByInterleaved(int interleaved) const{ int RtspPlayer::getTrackIndexByTrackType(TrackType trackType) const { for (unsigned int i = 0; i < _aTrackInfo.size(); i++) { - if (_aTrackInfo[i]->type == trackType) { + if (_aTrackInfo[i]->_type == trackType) { return i; } } diff --git a/src/Rtsp/RtspPlayerImp.h b/src/Rtsp/RtspPlayerImp.h index 7ea46c17..f9446ae6 100644 --- a/src/Rtsp/RtspPlayerImp.h +++ b/src/Rtsp/RtspPlayerImp.h @@ -67,7 +67,7 @@ private: if(_pRtspMediaSrc){ _pRtspMediaSrc->onGetSDP(sdp); } - _parser.reset(new RtspDemuxer(sdp)); + _parser.reset(new RtspDemuxer(sdpAttr)); return true; } void onRecvRTP(const RtpPacket::Ptr &rtppt, const SdpTrack::Ptr &track) override { diff --git a/src/Rtsp/RtspSession.cpp b/src/Rtsp/RtspSession.cpp index 80139b24..5a826a87 100644 --- a/src/Rtsp/RtspSession.cpp +++ b/src/Rtsp/RtspSession.cpp @@ -512,11 +512,11 @@ bool RtspSession::handleReq_Setup() { return false; } SdpTrack::Ptr &trackRef = _aTrackInfo[trackIdx]; - if (trackRef->inited) { + if (trackRef->_inited) { //已经初始化过该Track return false; } - trackRef->inited = true; //现在初始化 + trackRef->_inited = true; //现在初始化 auto strongRing = _pWeakRing.lock(); if (!strongRing) { @@ -562,9 +562,9 @@ bool RtspSession::handleReq_Setup() { "x-Dynamic-Rate: 1\r\n\r\n", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME, - dateHeader().data(), trackRef->type * 2, - trackRef->type * 2 + 1, - printSSRC(trackRef->ssrc).data(), + dateHeader().data(), trackRef->_type * 2, + trackRef->_type * 2 + 1, + printSSRC(trackRef->_ssrc).data(), _strSession.data()); SocketHelper::send(_pcBuf, iLen); } @@ -609,7 +609,7 @@ bool RtspSession::handleReq_Setup() { RTSP_VERSION, RTSP_BUILDTIME, dateHeader().data(), strClientPort.data(), pSockRtp->get_local_port(), pSockRtcp->get_local_port(), - printSSRC(trackRef->ssrc).data(), + printSSRC(trackRef->_ssrc).data(), _strSession.data()); SocketHelper::send(_pcBuf, n); } @@ -630,7 +630,7 @@ bool RtspSession::handleReq_Setup() { strongSelf->safeShutdown(); }); } - int iSrvPort = _pBrdcaster->getPort(trackRef->type); + int iSrvPort = _pBrdcaster->getPort(trackRef->_type); //我们用trackIdx区分rtp和rtcp包 auto pSockRtcp = UDPServer::Instance().getSock(get_local_ip().data(),2*trackIdx + 1,iSrvPort + 1); if (!pSockRtcp) { @@ -652,7 +652,7 @@ bool RtspSession::handleReq_Setup() { RTSP_VERSION, RTSP_BUILDTIME, dateHeader().data(), _pBrdcaster->getIP().data(), get_local_ip().data(), iSrvPort, pSockRtcp->get_local_port(), - udpTTL,printSSRC(trackRef->ssrc).data(), + udpTTL,printSSRC(trackRef->_ssrc).data(), _strSession.data()); SocketHelper::send(_pcBuf, n); } @@ -733,9 +733,9 @@ bool RtspSession::handleReq_Play() { } for(auto &track : _aTrackInfo){ - track->ssrc = pMediaSrc->getSsrc(track->type); - track->seq = pMediaSrc->getSeqence(track->type); - track->timeStamp = pMediaSrc->getTimestamp(track->type); + track->_ssrc = pMediaSrc->getSsrc(track->_type); + track->_seq = pMediaSrc->getSeqence(track->_type); + track->_time_stamp = pMediaSrc->getTimestamp(track->_type); } } _bFirstPlay = false; @@ -749,12 +749,12 @@ bool RtspSession::handleReq_Play() { dateHeader().data(), _strSession.data(),iStamp/1000.0); for(auto &track : _aTrackInfo){ - if (track->inited == false) { + if (track->_inited == false) { //还有track没有setup shutdown(); return; } - iLen += sprintf(_pcBuf + iLen, "url=%s/%s;seq=%d;rtptime=%u,", _strUrl.data(), track->_control_surffix.data(), track->seq,track->timeStamp); + iLen += sprintf(_pcBuf + iLen, "url=%s/%s;seq=%d;rtptime=%u,", _strUrl.data(), track->_control_surffix.data(), track->_seq,track->_time_stamp); } iLen -= 1; @@ -904,9 +904,9 @@ inline bool RtspSession::findStream() { _pMediaSrc = pMediaSrc; for(auto &track : _aTrackInfo){ - track->ssrc = pMediaSrc->getSsrc(track->type); - track->seq = pMediaSrc->getSeqence(track->type); - track->timeStamp = pMediaSrc->getTimestamp(track->type); + track->_ssrc = pMediaSrc->getSsrc(track->_type); + track->_seq = pMediaSrc->getSeqence(track->_type); + track->_time_stamp = pMediaSrc->getTimestamp(track->_type); } return true; } diff --git a/src/Rtsp/RtspSession.h b/src/Rtsp/RtspSession.h index 8a1fde00..5bf1ff64 100644 --- a/src/Rtsp/RtspSession.h +++ b/src/Rtsp/RtspSession.h @@ -118,7 +118,7 @@ private: } inline int getTrackIndexByTrackType(TrackType type) { for (unsigned int i = 0; i < _aTrackInfo.size(); i++) { - if (type == _aTrackInfo[i]->type) { + if (type == _aTrackInfo[i]->_type) { return i; } } diff --git a/src/Rtsp/RtspToRtmpMediaSource.h b/src/Rtsp/RtspToRtmpMediaSource.h index fac15a87..eea671ee 100644 --- a/src/Rtsp/RtspToRtmpMediaSource.h +++ b/src/Rtsp/RtspToRtmpMediaSource.h @@ -49,8 +49,9 @@ public: virtual ~RtspToRtmpMediaSource(); virtual void onGetSDP(const string& strSdp) override{ + RtspMediaSource::onGetSDP(strSdp); try { - _pParser.reset(new RtspDemuxer(strSdp)); + _pParser.reset(new RtspDemuxer(_sdpAttr)); _pRecorder.reset(new MediaRecorder(getVhost(),getApp(),getId(),_pParser,_bEnableHls,_bEnableMp4)); //todo(xzl) 修复此处 // _pParser->setOnAudioCB( std::bind(&RtspToRtmpMediaSource::onGetAAC, this, placeholders::_1)); @@ -59,7 +60,6 @@ public: } catch (exception &ex) { WarnL << ex.what(); } - RtspMediaSource::onGetSDP(strSdp); } virtual void onWrite(const RtpPacket::Ptr &pRtppkt, bool bKeyPos) override{ if (_pParser) { @@ -73,20 +73,9 @@ public: } void updateTimeStamp(uint32_t uiStamp) { - for (auto &pr : _mapTracks) { - switch (pr.second.type) { - case TrackAudio: { - //todo(xzl) 修复此处 -// pr.second.timeStamp = uiStamp * (_pParser->getAudioSampleRate() / 1000.0); - } - break; - case TrackVideo: { - pr.second.timeStamp = uiStamp * 90; - } - break; - default: - break; - } + auto tracks = _sdpAttr.getAvailableTrack(); + for (auto &track : tracks) { + track->_time_stamp = uiStamp * (track->_samplerate / 1000.0); } } diff --git a/src/RtspMuxer/RtspDemuxer.cpp b/src/RtspMuxer/RtspDemuxer.cpp index 0e842df7..c27286ef 100644 --- a/src/RtspMuxer/RtspDemuxer.cpp +++ b/src/RtspMuxer/RtspDemuxer.cpp @@ -61,7 +61,7 @@ RtspDemuxer::RtspDemuxer(const SdpAttr &attr) { void RtspDemuxer::loadSdp(const SdpAttr &attr) { auto tracks = attr.getAvailableTrack(); for (auto &track : tracks){ - switch (track->type) { + switch (track->_type) { case TrackVideo: { makeVideoTrack(track); }