diff --git a/.gitignore b/.gitignore index 1c66f6b5..853ad8f7 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,5 @@ /cmake-build-debug/ /.idea/ -/c_wrapper/.idea/ \ No newline at end of file +/c_wrapper/.idea/ +/release/mac/Debug/ \ No newline at end of file diff --git a/src/Common/config.cpp b/src/Common/config.cpp index 1b4bf795..63a22495 100644 --- a/src/Common/config.cpp +++ b/src/Common/config.cpp @@ -161,13 +161,16 @@ namespace Rtsp { const string kAuthBasic = RTSP_FIELD"authBasic"; const string kHandshakeSecond = RTSP_FIELD"handshakeSecond"; const string kKeepAliveSecond = RTSP_FIELD"keepAliveSecond"; -const string kDirectProxy = RTSP_FIELD"directProxy";; +const string kDirectProxy = RTSP_FIELD"directProxy"; +const string kModifyStamp = RTSP_FIELD"modifyStamp"; + onceToken token([](){ //默认Md5方式认证 mINI::Instance()[kAuthBasic] = 0; mINI::Instance()[kHandshakeSecond] = 15; mINI::Instance()[kKeepAliveSecond] = 15; mINI::Instance()[kDirectProxy] = 1; + mINI::Instance()[kModifyStamp] = true; },nullptr); } //namespace Rtsp diff --git a/src/Common/config.h b/src/Common/config.h index 6817e02e..47c06bfd 100644 --- a/src/Common/config.h +++ b/src/Common/config.h @@ -209,6 +209,8 @@ extern const string kKeepAliveSecond; //假定您的拉流源地址不是264或265或AAC,那么你可以使用直接代理的方式来支持rtsp代理 //默认开启rtsp直接代理,rtmp由于没有这些问题,是强制开启直接代理的 extern const string kDirectProxy; +//rtsp推流是否修改时间戳 +extern const string kModifyStamp; } //namespace Rtsp ////////////RTMP服务器配置/////////// diff --git a/src/Rtsp/RtspDemuxer.cpp b/src/Rtsp/RtspDemuxer.cpp index faecd3e2..06d75e83 100644 --- a/src/Rtsp/RtspDemuxer.cpp +++ b/src/Rtsp/RtspDemuxer.cpp @@ -38,10 +38,6 @@ RtspDemuxer::RtspDemuxer(const string& sdp) { loadSdp(SdpParser(sdp)); } -RtspDemuxer::RtspDemuxer(const SdpParser &attr) { - loadSdp(attr); -} - void RtspDemuxer::loadSdp(const SdpParser &attr) { auto tracks = attr.getAvailableTrack(); for (auto &track : tracks){ diff --git a/src/Rtsp/RtspDemuxer.h b/src/Rtsp/RtspDemuxer.h index a6e692bb..8a4d407e 100644 --- a/src/Rtsp/RtspDemuxer.h +++ b/src/Rtsp/RtspDemuxer.h @@ -41,7 +41,6 @@ class RtspDemuxer : public Demuxer{ public: typedef std::shared_ptr Ptr; RtspDemuxer(const string &sdp); - RtspDemuxer(const SdpParser &parser); virtual ~RtspDemuxer(){}; /** diff --git a/src/Rtsp/RtspPlayer.cpp b/src/Rtsp/RtspPlayer.cpp index df20c36b..a16bb61e 100644 --- a/src/Rtsp/RtspPlayer.cpp +++ b/src/Rtsp/RtspPlayer.cpp @@ -219,14 +219,14 @@ void RtspPlayer::handleResDESCRIBE(const Parser& parser) { _strContentBase.pop_back(); } + SdpParser sdpParser(parser.Content()); //解析sdp - _sdpParser.load(parser.Content()); - _aTrackInfo = _sdpParser.getAvailableTrack(); + _aTrackInfo = sdpParser.getAvailableTrack(); if (_aTrackInfo.empty()) { throw std::runtime_error("无有效的Sdp Track"); } - if (!onCheckSDP(parser.Content(), _sdpParser)) { + if (!onCheckSDP(sdpParser.toString())) { throw std::runtime_error("onCheckSDP faied"); } diff --git a/src/Rtsp/RtspPlayer.h b/src/Rtsp/RtspPlayer.h index 4023548b..90a30fa3 100644 --- a/src/Rtsp/RtspPlayer.h +++ b/src/Rtsp/RtspPlayer.h @@ -59,7 +59,7 @@ public: float getPacketLossRate(TrackType type) const override; protected: //派生类回调函数 - virtual bool onCheckSDP(const string &strSdp, const SdpParser &parser) = 0; + virtual bool onCheckSDP(const string &strSdp) = 0; virtual void onRecvRTP(const RtpPacket::Ptr &pRtppt, const SdpTrack::Ptr &track) = 0; uint32_t getProgressMilliSecond() const; void seekToMilliSecond(uint32_t ms); @@ -124,7 +124,6 @@ private: void createUdpSockIfNecessary(int track_idx); private: string _strUrl; - SdpParser _sdpParser; vector _aTrackInfo; function _onHandshake; Socket::Ptr _apRtpSock[2]; //RTP端口,trackid idx 为数组下标 diff --git a/src/Rtsp/RtspPlayerImp.h b/src/Rtsp/RtspPlayerImp.h index 66330866..effa7328 100644 --- a/src/Rtsp/RtspPlayerImp.h +++ b/src/Rtsp/RtspPlayerImp.h @@ -61,12 +61,12 @@ public: }; private: //派生类回调函数 - bool onCheckSDP(const string &sdp, const SdpParser &parser) override { + bool onCheckSDP(const string &sdp) override { _pRtspMediaSrc = dynamic_pointer_cast(_pMediaSrc); if(_pRtspMediaSrc){ - _pRtspMediaSrc->onGetSDP(parser.toString()); + _pRtspMediaSrc->onGetSDP(sdp); } - _parser.reset(new RtspDemuxer(parser)); + _parser.reset(new RtspDemuxer(sdp)); return true; } void onRecvRTP(const RtpPacket::Ptr &rtp, const SdpTrack::Ptr &track) override { diff --git a/src/Rtsp/RtspSession.cpp b/src/Rtsp/RtspSession.cpp index 2cacd699..af01f5a7 100644 --- a/src/Rtsp/RtspSession.cpp +++ b/src/Rtsp/RtspSession.cpp @@ -242,13 +242,13 @@ void RtspSession::handleReq_ANNOUNCE(const Parser &parser) { throw SockException(Err_shutdown,err); } - _strSession = makeRandStr(12); - _strSdp = parser.Content(); - _aTrackInfo = SdpParser(_strSdp).getAvailableTrack(); + SdpParser sdpParser(parser.Content()); + _strSession = makeRandStr(12); + _aTrackInfo = sdpParser.getAvailableTrack(); _pushSrc = std::make_shared(_mediaInfo._vhost,_mediaInfo._app,_mediaInfo._streamid); _pushSrc->setListener(dynamic_pointer_cast(shared_from_this())); - _pushSrc->onGetSDP(_strSdp); + _pushSrc->onGetSDP(sdpParser.toString()); sendRtspResponse("200 OK"); } @@ -362,9 +362,7 @@ void RtspSession::onAuthSuccess() { return; } //找到了响应的rtsp流 - strongSelf->_strSdp = rtsp_src->getSdp(); - SdpParser sdpParser(strongSelf->_strSdp); - strongSelf->_aTrackInfo = sdpParser.getAvailableTrack(); + strongSelf->_aTrackInfo = SdpParser(rtsp_src->getSdp()).getAvailableTrack(); if (strongSelf->_aTrackInfo.empty()) { //该流无效 strongSelf->send_StreamNotFound(); @@ -383,7 +381,7 @@ void RtspSession::onAuthSuccess() { {"Content-Base",strongSelf->_strContentBase + "/", "x-Accept-Retransmit","our-retransmit", "x-Accept-Dynamic-Rate","1" - },strongSelf->_strSdp); + },rtsp_src->getSdp()); }); } void RtspSession::onAuthFailed(const string &realm,const string &why,bool close) { @@ -918,7 +916,12 @@ inline void RtspSession::send_NotAcceptable() { void RtspSession::onRtpSorted(const RtpPacket::Ptr &rtppt, int trackidx) { - + GET_CONFIG(bool,modify_stamp,Rtsp::kModifyStamp); + if(modify_stamp){ + int64_t dts_out; + _stamp[trackidx].revise(0, 0, dts_out, dts_out); + rtppt->timeStamp = dts_out; + } _pushSrc->onWrite(rtppt, false); } inline void RtspSession::onRcvPeerUdpData(int intervaled, const Buffer::Ptr &pBuf, const struct sockaddr& addr) { diff --git a/src/Rtsp/RtspSession.h b/src/Rtsp/RtspSession.h index d768d499..a6ca4b00 100644 --- a/src/Rtsp/RtspSession.h +++ b/src/Rtsp/RtspSession.h @@ -190,8 +190,6 @@ private: int _iCseq = 0; //ContentBase string _strContentBase; - //推流端发送的sdp或播放端请求的sdp - string _strSdp; //Session号 string _strSession; //是否第一次播放,第一次播放需要鉴权,第二次播放属于暂停恢复 @@ -235,6 +233,8 @@ private: RtcpCounter _aRtcpCnt[2]; //rtcp发送时间,trackid idx 为数组下标 Ticker _aRtcpTicker[2]; + //时间戳修整器 + Stamp _stamp[2]; }; /**