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;