diff --git a/src/Common/MultiMediaSourceMuxer.cpp b/src/Common/MultiMediaSourceMuxer.cpp index 03c662b4..4c9ad177 100644 --- a/src/Common/MultiMediaSourceMuxer.cpp +++ b/src/Common/MultiMediaSourceMuxer.cpp @@ -426,7 +426,7 @@ void MultiMediaSourceMuxer::startSendRtp(MediaSource &sender, const MediaSourceE } }); - rtp_sender->startSend(args, [ssrc,ssrc_multi_send, weak_self, rtp_sender, cb, tracks, ring, poller](uint16_t local_port, const SockException &ex) mutable { + rtp_sender->startSend(sender, args, [ssrc,ssrc_multi_send, weak_self, rtp_sender, cb, tracks, ring, poller](uint16_t local_port, const SockException &ex) mutable { cb(local_port, ex); auto strong_self = weak_self.lock(); if (!strong_self || ex) { diff --git a/src/Rtp/RtpSender.cpp b/src/Rtp/RtpSender.cpp index 0cc445e6..be9adbf6 100644 --- a/src/Rtp/RtpSender.cpp +++ b/src/Rtp/RtpSender.cpp @@ -35,7 +35,16 @@ RtpSender::~RtpSender() { } } -void RtpSender::startSend(const MediaSourceEvent::SendRtpArgs &args, const function &cb){ +void RtpSender::startSend(const MediaSource &sender, const MediaSourceEvent::SendRtpArgs &args, const function &cb){ + auto origin_socket = sender.getOriginSock(); + _origin_socket = dynamic_pointer_cast(origin_socket); + if (!_origin_socket) { + auto process = dynamic_pointer_cast(origin_socket); + if (process) { + _origin_socket = process->getSock(); + } + } + _args = args; if (!_interface) { // 重连时不重新创建对象 [AUTO-TRANSLATED:b788cd5d] @@ -313,6 +322,15 @@ void RtpSender::onConnect() { } }); } + + if (_socket_rtp->sockType() == toolkit::SockNum::Sock_TCP && _origin_socket) { + // rtp 端口是TCP端口,转发速度应当控制收流速度 + auto origin_socket = _origin_socket; + _socket_rtp->setOnFlush([origin_socket]() { + origin_socket->enableRecv(true); + return true; + }); + } InfoL << "startSend rtp success: " << _socket_rtp->get_peer_ip() << ":" << _socket_rtp->get_peer_port() << ", data_type: " << _args.data_type << ", con_type: " << _args.con_type; } @@ -433,6 +451,9 @@ void RtpSender::onFlushRtpList(shared_ptr> rtp_list) { } default: CHECK(0); } + if (_socket_rtp->sockType() == toolkit::SockNum::Sock_TCP && _socket_rtp->isSocketBusy() && _origin_socket) { + _origin_socket->enableRecv(false); + } }); }; if (_args.con_type != MediaSourceEvent::SendRtpArgs::kVoiceTalk) { diff --git a/src/Rtp/RtpSender.h b/src/Rtp/RtpSender.h index 77b064e5..5b67c51d 100644 --- a/src/Rtp/RtpSender.h +++ b/src/Rtp/RtpSender.h @@ -40,7 +40,7 @@ public: * [AUTO-TRANSLATED:c31bd9b3] */ - void startSend(const MediaSourceEvent::SendRtpArgs &args, const std::function &cb); + void startSend(const MediaSource &sender, const MediaSourceEvent::SendRtpArgs &args, const std::function &cb); /** * 输入帧数据 @@ -116,6 +116,7 @@ private: private: bool _is_connect = false; + toolkit::Socket::Ptr _origin_socket; MediaSourceEvent::SendRtpArgs _args; toolkit::Socket::Ptr _socket_rtp; toolkit::Socket::Ptr _socket_rtcp;