大幅优化RTSP服务器性能

This commit is contained in:
771730766@qq.com 2018-01-30 09:35:54 +08:00
parent 25551ef3e6
commit 28b8e8e09f
5 changed files with 36 additions and 9 deletions

View File

@ -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<void * , onDetach > m_mapDetach_copy;

View File

@ -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);
}
}

View File

@ -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:

View File

@ -49,6 +49,24 @@ namespace ZL {
namespace Rtsp {
class RtspSession;
class BufferRtp : public Socket::Buffer{
public:
typedef std::shared_ptr<BufferRtp> 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<MAX_TCP_SESSION> {
public:
typedef std::shared_ptr<RtspSession> 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<RtspSession> &pSession); //处理rtsp over httpquicktime使用的
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);

View File

@ -162,7 +162,7 @@ int main(int argc,char *argv[]){
//输入用户名和密码登录(user:test,pwd:123456)输入help命令查看帮助
TcpServer<ShellSession>::Ptr shellSrv(new TcpServer<ShellSession>());
ShellSession::addUser("test", "123456");
shellSrv->start(8023);
shellSrv->start(mINI::Instance()[Config::Shell::kPort]);
//开启rtsp/rtmp/http服务器
TcpServer<RtspSession>::Ptr rtspSrv(new TcpServer<RtspSession>());
TcpServer<RtmpSession>::Ptr rtmpSrv(new TcpServer<RtmpSession>());