From 28b8e8e09f62e2bce773b444bc2caa46c5129b73 Mon Sep 17 00:00:00 2001 From: "771730766@qq.com" Date: Tue, 30 Jan 2018 09:35:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E4=BC=98=E5=8C=96RTSP?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtsp/RtpBroadCaster.cpp | 5 ++++- src/Rtsp/RtspPlayer.cpp | 2 +- src/Rtsp/RtspSession.cpp | 13 ++++++++----- src/Rtsp/RtspSession.h | 23 ++++++++++++++++++++++- tests/test_server.cpp | 2 +- 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/Rtsp/RtpBroadCaster.cpp b/src/Rtsp/RtpBroadCaster.cpp index a85fb9b8..5f5d3b74 100644 --- a/src/Rtsp/RtpBroadCaster.cpp +++ b/src/Rtsp/RtpBroadCaster.cpp @@ -29,6 +29,8 @@ #include "RtpBroadCaster.h" #include "Util/util.h" #include "Network/sockutil.h" +#include "RtspSession.h" + using namespace std; namespace ZL { @@ -112,7 +114,8 @@ RtpBroadCaster::RtpBroadCaster(const string &strLocalIp,const string &strApp,con int i = (pkt->interleaved/2)%2; auto &pSock = m_apUdpSock[i]; auto &peerAddr = m_aPeerUdpAddr[i]; - pSock->sendTo((char *) pkt->payload + 4, pkt->length - 4,(struct sockaddr *)(&peerAddr)); + BufferRtp::Ptr buffer(new BufferRtp(pkt,4)); + pSock->send(buffer,SOCKET_DEFAULE_FLAGS,(struct sockaddr *)(&peerAddr)); }); m_pReader->setDetachCB([this](){ unordered_map m_mapDetach_copy; diff --git a/src/Rtsp/RtspPlayer.cpp b/src/Rtsp/RtspPlayer.cpp index 64a8f6c4..7d3e084f 100644 --- a/src/Rtsp/RtspPlayer.cpp +++ b/src/Rtsp/RtspPlayer.cpp @@ -346,7 +346,7 @@ void RtspPlayer::HandleResSETUP(const Parser& parser, unsigned int uiTrackIndex) rtpto.sin_port = ntohs(port); rtpto.sin_family = AF_INET; rtpto.sin_addr.s_addr = inet_addr(get_peer_ip().c_str()); - pUdpSockRef->sendTo("\xce\xfa\xed\xfe", 4, (struct sockaddr *) &rtpto); + pUdpSockRef->send("\xce\xfa\xed\xfe", 4,SOCKET_DEFAULE_FLAGS, (struct sockaddr *) &rtpto); } } diff --git a/src/Rtsp/RtspSession.cpp b/src/Rtsp/RtspSession.cpp index 0da8d5f2..e470eb2d 100644 --- a/src/Rtsp/RtspSession.cpp +++ b/src/Rtsp/RtspSession.cpp @@ -664,7 +664,7 @@ bool RtspSession::handleReq_Play() { if(!strongSelf) { return; } - strongSelf->sendRtpPacket(*pack); + strongSelf->sendRtpPacket(pack); }); }); @@ -848,11 +848,13 @@ inline bool RtspSession::findStream() { return true; } -inline void RtspSession::sendRtpPacket(const RtpPacket& pkt) { + +inline void RtspSession::sendRtpPacket(const RtpPacket::Ptr & pkt) { //InfoL<<(int)pkt.Interleaved; switch (m_rtpType) { case PlayerBase::RTP_TCP: { - send((char *) pkt.payload, pkt.length); + BufferRtp::Ptr buffer(new BufferRtp(pkt)); + send(buffer); #ifdef RTSP_SEND_RTCP int iTrackIndex = getTrackIndexByTrackId(pkt.interleaved / 2); RtcpCounter &counter = m_aRtcpCnt[iTrackIndex]; @@ -869,7 +871,7 @@ inline void RtspSession::sendRtpPacket(const RtpPacket& pkt) { } break; case PlayerBase::RTP_UDP: { - int iTrackIndex = getTrackIndexByTrackId(pkt.interleaved / 2); + int iTrackIndex = getTrackIndexByTrackId(pkt->interleaved / 2); auto pSock = m_apUdpSock[iTrackIndex].lock(); if (!pSock) { shutdown(); @@ -879,7 +881,8 @@ inline void RtspSession::sendRtpPacket(const RtpPacket& pkt) { if (!peerAddr) { return; } - pSock->sendTo((char *) pkt.payload + 4, pkt.length - 4, peerAddr.get()); + BufferRtp::Ptr buffer(new BufferRtp(pkt,4)); + pSock->send(buffer,SOCKET_DEFAULE_FLAGS, peerAddr.get()); } break; default: diff --git a/src/Rtsp/RtspSession.h b/src/Rtsp/RtspSession.h index 5bfd4562..9be33962 100644 --- a/src/Rtsp/RtspSession.h +++ b/src/Rtsp/RtspSession.h @@ -49,6 +49,24 @@ namespace ZL { namespace Rtsp { class RtspSession; + +class BufferRtp : public Socket::Buffer{ +public: + typedef std::shared_ptr Ptr; + BufferRtp(const RtpPacket::Ptr & pkt,uint32_t offset = 0 ):_rtp(pkt),_offset(offset){} + virtual ~BufferRtp(){} + + char *data() override { + return (char *)_rtp->payload + _offset; + } + uint32_t size() const override { + return _rtp->length - _offset; + } +private: + RtpPacket::Ptr _rtp; + uint32_t _offset; +}; + class RtspSession: public TcpLimitedSession { public: typedef std::shared_ptr Ptr; @@ -73,6 +91,9 @@ private: int send(const char *pcBuf, int iSize) override { return m_pSender->send(pcBuf, iSize); } + int send(const Socket::Buffer::Ptr &pkt){ + return m_pSender->send(pkt); + } void shutdown() override; bool handleReq_Options(); //处理options方法 bool handleReq_Describe(); //处理describe方法 @@ -92,7 +113,7 @@ private: inline bool findStream(); //根据rtsp url查找 MediaSource实例 inline void initSender(const std::shared_ptr &pSession); //处理rtsp over http,quicktime使用的 - inline void sendRtpPacket(const RtpPacket &pkt); + inline void sendRtpPacket(const RtpPacket::Ptr &pkt); inline string printSSRC(uint32_t ui32Ssrc) { char tmp[9] = { 0 }; ui32Ssrc = htonl(ui32Ssrc); diff --git a/tests/test_server.cpp b/tests/test_server.cpp index af0b387f..e74e2411 100644 --- a/tests/test_server.cpp +++ b/tests/test_server.cpp @@ -162,7 +162,7 @@ int main(int argc,char *argv[]){ //输入用户名和密码登录(user:test,pwd:123456),输入help命令查看帮助 TcpServer::Ptr shellSrv(new TcpServer()); ShellSession::addUser("test", "123456"); - shellSrv->start(8023); + shellSrv->start(mINI::Instance()[Config::Shell::kPort]); //开启rtsp/rtmp/http服务器 TcpServer::Ptr rtspSrv(new TcpServer()); TcpServer::Ptr rtmpSrv(new TcpServer());