From c4f364c4870d6ee5cde3a25bde21113c73f0f297 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Thu, 15 Aug 2019 19:13:31 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E4=BB=A3=E7=90=86=E6=97=B6sd?= =?UTF-8?q?p=E6=B8=85=E6=B4=97=E5=90=8E=E5=86=8D=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtsp/Rtsp.cpp | 78 ++++++++++++++++++++++++++++++++++++++++ src/Rtsp/Rtsp.h | 3 ++ src/Rtsp/RtspPlayerImp.h | 2 +- 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/src/Rtsp/Rtsp.cpp b/src/Rtsp/Rtsp.cpp index e2521796..8cf3dae6 100644 --- a/src/Rtsp/Rtsp.cpp +++ b/src/Rtsp/Rtsp.cpp @@ -30,6 +30,61 @@ namespace mediakit{ +static void getAttrSdp(const map &attr, _StrPrinter &printer){ + const map::value_type *ptr = nullptr; + for(auto &pr : attr){ + if(pr.first == "control"){ + ptr = ≺ + continue; + } + if(pr.second.empty()){ + printer << "a=" << pr.first << "\r\n"; + }else{ + printer << "a=" << pr.first << ":" << pr.second << "\r\n"; + } + } + if(ptr){ + printer << "a=" << ptr->first << ":" << ptr->second << "\r\n"; + } +} +string SdpTrack::toString() const { + _StrPrinter _printer; + switch (_type){ + case TrackTitle:{ + _printer << "v=" << 0 << "\r\n"; + if(!_o.empty()){ + _printer << "o="<< _o << "\r\n"; + } + if(!_c.empty()){ + _printer << "c=" << _c << "\r\n"; + } + if(!_t.empty()){ + _printer << "t=" << _t << "\r\n"; + } + + _printer << "s=RTSP Session, streamed by the ZLMediaKit\r\n"; + _printer << "i=ZLMediaKit Live Stream\r\n"; + getAttrSdp(_attr,_printer); + } + break; + case TrackAudio: + case TrackVideo:{ + if(_type == TrackAudio){ + _printer << "m=audio 0 RTP/AVP " << _pt << "\r\n"; + }else{ + _printer << "m=video 0 RTP/AVP " << _pt << "\r\n"; + } + if(!_b.empty()){ + _printer << "b=" <<_b << "\r\n"; + } + getAttrSdp(_attr,_printer); + } + break; + default: + break; + } + return _printer; +} void SdpParser::load(const string &sdp) { _track_map.clear(); string key; @@ -164,5 +219,28 @@ vector SdpParser::getAvailableTrack() const { return ret; } +string SdpParser::toString() const { + string title,audio,video; + for(auto &pr : _track_map){ + switch (pr.second->_type){ + case TrackTitle:{ + title = pr.second->toString(); + } + break; + case TrackVideo:{ + video = pr.second->toString(); + } + break; + case TrackAudio:{ + audio = pr.second->toString(); + } + break; + default: + break; + } + } + return title + video + audio; +} + }//namespace mediakit diff --git a/src/Rtsp/Rtsp.h b/src/Rtsp/Rtsp.h index fda033b9..883e68ce 100644 --- a/src/Rtsp/Rtsp.h +++ b/src/Rtsp/Rtsp.h @@ -90,6 +90,8 @@ public: map _other; map _attr; + + string toString() const; public: int _pt; string _codec; @@ -118,6 +120,7 @@ public: bool available() const; SdpTrack::Ptr getTrack(TrackType type) const; vector getAvailableTrack() const; + string toString() const ; private: map _track_map; }; diff --git a/src/Rtsp/RtspPlayerImp.h b/src/Rtsp/RtspPlayerImp.h index 68bf53cc..66330866 100644 --- a/src/Rtsp/RtspPlayerImp.h +++ b/src/Rtsp/RtspPlayerImp.h @@ -64,7 +64,7 @@ private: bool onCheckSDP(const string &sdp, const SdpParser &parser) override { _pRtspMediaSrc = dynamic_pointer_cast(_pMediaSrc); if(_pRtspMediaSrc){ - _pRtspMediaSrc->onGetSDP(sdp); + _pRtspMediaSrc->onGetSDP(parser.toString()); } _parser.reset(new RtspDemuxer(parser)); return true;