diff --git a/3rdpart/ZLToolKit b/3rdpart/ZLToolKit index 0eb87b2e..8f25d13f 160000 --- a/3rdpart/ZLToolKit +++ b/3rdpart/ZLToolKit @@ -1 +1 @@ -Subproject commit 0eb87b2eba56e783be702778337e54f74e59789e +Subproject commit 8f25d13f49e016858fae88f1045786ce26611873 diff --git a/server/WebApi.cpp b/server/WebApi.cpp index 2c43704d..291a5d89 100755 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -425,7 +425,10 @@ Value ToJson(const PusherProxy::Ptr& p) { item["url"] = p->getUrl(); item["status"] = p->getStatus(); item["liveSecs"] = p->getLiveSecs(); - item["rePublishCount"] = p->getRePublishCount(); + item["rePublishCount"] = p->getRePublishCount(); + item["bytesSpeed"] = (Json::UInt64) p->getSendSpeed(); + item["totalBytes"] =(Json::UInt64) p->getSendTotalBytes(); + if (auto src = p->getSrc()) { dumpMediaTuple(src->getMediaTuple(), item["src"]); } @@ -439,6 +442,9 @@ Value ToJson(const PlayerProxy::Ptr& p) { item["liveSecs"] = p->getLiveSecs(); item["rePullCount"] = p->getRePullCount(); item["totalReaderCount"] = p->totalReaderCount(); + item["bytesSpeed"] = (Json::UInt64) p->getRecvSpeed(); + item["totalBytes"] = (Json::UInt64) p->getRecvTotalBytes(); + dumpMediaTuple(p->getMediaTuple(), item["src"]); return item; } @@ -449,7 +455,8 @@ Value makeMediaSourceJson(MediaSource &media){ dumpMediaTuple(media.getMediaTuple(), item); item["createStamp"] = (Json::UInt64) media.getCreateStamp(); item["aliveSecond"] = (Json::UInt64) media.getAliveSecond(); - item["bytesSpeed"] = media.getBytesSpeed(); + item["bytesSpeed"] = (Json::UInt64) media.getBytesSpeed(); + item["totalBytes"] = (Json::UInt64) media.getTotalBytes(); item["readerCount"] = media.readerCount(); item["totalReaderCount"] = media.totalReaderCount(); item["originType"] = (int) media.getOriginType(); @@ -1674,8 +1681,10 @@ void installWebApi() { CHECK(muxer, "get muxer from media source failed"); src->getOwnerPoller()->async([=]() mutable { - muxer->forEachRtpSender([&](const std::string &ssrc) mutable { + muxer->forEachRtpSender([&](const std::string &ssrc, const RtpSender &sender) mutable { val["data"].append(ssrc); + val["bytesSpeed"] = (Json::UInt64)sender.getSendSpeed(); + val["totalBytes"] = (Json::UInt64)sender.getSendTotalBytes(); }); invoker(200, headerOut, val.toStyledString()); }); diff --git a/src/Common/MediaSource.cpp b/src/Common/MediaSource.cpp index 14c18d13..39e62e17 100644 --- a/src/Common/MediaSource.cpp +++ b/src/Common/MediaSource.cpp @@ -110,13 +110,20 @@ std::shared_ptr MediaSource::getOwnership() { }); } -int MediaSource::getBytesSpeed(TrackType type){ +size_t MediaSource::getBytesSpeed(TrackType type) { if(type == TrackInvalid || type == TrackMax){ return _speed[TrackVideo].getSpeed() + _speed[TrackAudio].getSpeed(); } return _speed[type].getSpeed(); } +size_t MediaSource::getTotalBytes(TrackType type) { + if (type == TrackInvalid || type == TrackMax) { + return _speed[TrackVideo].getTotalBytes() + _speed[TrackAudio].getTotalBytes(); + } + return _speed[type].getTotalBytes(); +} + uint64_t MediaSource::getAliveSecond() const { // 使用Ticker对象获取存活时间的目的是防止修改系统时间导致回退 [AUTO-TRANSLATED:68474061] // The purpose of using the Ticker object to obtain the survival time is to prevent the modification of the system time from causing a rollback diff --git a/src/Common/MediaSource.h b/src/Common/MediaSource.h index cab80a90..3711d9c2 100644 --- a/src/Common/MediaSource.h +++ b/src/Common/MediaSource.h @@ -442,7 +442,9 @@ public: // 获取数据速率,单位bytes/s [AUTO-TRANSLATED:c70465c1] // Get data rate, unit bytes/s - int getBytesSpeed(TrackType type = TrackInvalid); + size_t getBytesSpeed(TrackType type = TrackInvalid); + size_t getTotalBytes(TrackType type = TrackInvalid); + // 获取流创建GMT unix时间戳,单位秒 [AUTO-TRANSLATED:0bbe145e] // Get the stream creation GMT unix timestamp, unit seconds uint64_t getCreateStamp() const { return _create_stamp; } diff --git a/src/Common/MultiMediaSourceMuxer.cpp b/src/Common/MultiMediaSourceMuxer.cpp index 0dd76519..03c662b4 100644 --- a/src/Common/MultiMediaSourceMuxer.cpp +++ b/src/Common/MultiMediaSourceMuxer.cpp @@ -183,9 +183,12 @@ std::string MultiMediaSourceMuxer::shortUrl() const { return _tuple.shortUrl(); } -void MultiMediaSourceMuxer::forEachRtpSender(const std::function &cb) const { +void MultiMediaSourceMuxer::forEachRtpSender(const std::function &cb) const { for (auto &pr : _rtp_sender) { - cb(pr.first); + auto sender = std::get<1>(pr.second).lock(); + if (sender) { + cb(pr.first, *sender); + } } } @@ -443,10 +446,11 @@ void MultiMediaSourceMuxer::startSendRtp(MediaSource &sender, const MediaSourceE // 可能归属线程发生变更 [AUTO-TRANSLATED:2b379e30] // The owning thread may change strong_self->getOwnerPoller(MediaSource::NullMediaSource())->async([=]() { - if(!ssrc_multi_send) { + if (!ssrc_multi_send) { strong_self->_rtp_sender.erase(ssrc); } - strong_self->_rtp_sender.emplace(ssrc,reader); + std::weak_ptr sender = rtp_sender; + strong_self->_rtp_sender.emplace(ssrc, make_tuple(reader, sender)); }); }); #else diff --git a/src/Common/MultiMediaSourceMuxer.h b/src/Common/MultiMediaSourceMuxer.h index 9e0721af..16aba668 100644 --- a/src/Common/MultiMediaSourceMuxer.h +++ b/src/Common/MultiMediaSourceMuxer.h @@ -194,7 +194,7 @@ public: const MediaTuple &getMediaTuple() const; std::string shortUrl() const; - void forEachRtpSender(const std::function &cb) const; + void forEachRtpSender(const std::function &cb) const; protected: /////////////////////////////////MediaSink override///////////////////////////////// @@ -245,7 +245,7 @@ private: toolkit::Ticker _last_check; std::unordered_map _stamps; std::weak_ptr _track_listener; - std::unordered_multimap _rtp_sender; + std::unordered_multimap>> _rtp_sender; FMP4MediaSourceMuxer::Ptr _fmp4; RtmpMediaSourceMuxer::Ptr _rtmp; RtspMediaSourceMuxer::Ptr _rtsp; diff --git a/src/Http/HlsPlayer.cpp b/src/Http/HlsPlayer.cpp index 3058c09b..57721834 100644 --- a/src/Http/HlsPlayer.cpp +++ b/src/Http/HlsPlayer.cpp @@ -282,6 +282,7 @@ void HlsPlayer::onResponseHeader(const string &status, const HttpClient::HttpHea void HlsPlayer::onResponseBody(const char *buf, size_t size) { _m3u8.append(buf, size); + _recvtotalbytes += getRecvTotalBytes(); } void HlsPlayer::onResponseCompleted(const SockException &ex) { @@ -357,6 +358,13 @@ void HlsPlayer::playDelay(float delay_sec) { }, getPoller())); } +size_t HlsPlayer::getRecvSpeed() { + return TcpClient::getRecvSpeed() + (_http_ts_player ? _http_ts_player->getRecvSpeed() : 0); +} + +size_t HlsPlayer::getRecvTotalBytes() { + return TcpClient::getRecvTotalBytes() + (_http_ts_player ? _http_ts_player->getRecvTotalBytes() : 0); +} ////////////////////////////////////////////////////////////////////////// void HlsDemuxer::start(const EventPoller::Ptr &poller, TrackListener *listener) { @@ -480,6 +488,7 @@ void HlsPlayerImp::onPacket(const char *data, size_t len) { if (_decoder && _demuxer) { _decoder->input((uint8_t *) data, len); } + _recvtotalbytes += HlsPlayer::getRecvTotalBytes(); } void HlsPlayerImp::addTrackCompleted() { @@ -531,4 +540,11 @@ vector HlsPlayerImp::getTracks(bool ready) const { return static_pointer_cast(_demuxer)->getTracks(ready); } +size_t HlsPlayerImp::getRecvSpeed() { + return PlayerImp::getRecvSpeed(); +} + +size_t HlsPlayerImp::getRecvTotalBytes() { + return _recvtotalbytes; +} }//namespace mediakit diff --git a/src/Http/HlsPlayer.h b/src/Http/HlsPlayer.h index 10373894..ff797354 100644 --- a/src/Http/HlsPlayer.h +++ b/src/Http/HlsPlayer.h @@ -49,7 +49,7 @@ private: std::deque > > _frame_cache; }; -class HlsPlayer : public HttpClientImp , public PlayerBase , public HlsParser{ +class HlsPlayer: public HttpClientImp, public PlayerBase, public HlsParser { public: HlsPlayer(const toolkit::EventPoller::Ptr &poller); @@ -73,6 +73,9 @@ public: */ void teardown() override; + size_t getRecvSpeed() override; + size_t getRecvTotalBytes() override; + protected: /** * 收到ts包 @@ -127,12 +130,17 @@ private: int _timeout_multiple = MIN_TIMEOUT_MULTIPLE; int _try_fetch_index_times = 0; int _ts_download_failed_count = 0; + +protected: + size_t _recvtotalbytes = 0; }; -class HlsPlayerImp : public PlayerImp, private TrackListener { +class HlsPlayerImp final: public PlayerImp, private TrackListener { public: using Ptr = std::shared_ptr; HlsPlayerImp(const toolkit::EventPoller::Ptr &poller = nullptr); + size_t getRecvSpeed() override; + size_t getRecvTotalBytes() override; private: //// HlsPlayer override//// diff --git a/src/Http/TsPlayer.cpp b/src/Http/TsPlayer.cpp index 339064ec..7774b6fb 100644 --- a/src/Http/TsPlayer.cpp +++ b/src/Http/TsPlayer.cpp @@ -57,4 +57,11 @@ void TsPlayer::onResponseBody(const char *buf, size_t size) { } } +size_t TsPlayer::getRecvSpeed() { + return TcpClient::getRecvSpeed(); +} + +size_t TsPlayer::getRecvTotalBytes() { + return TcpClient::getRecvTotalBytes(); +} } // namespace mediakit \ No newline at end of file diff --git a/src/Http/TsPlayer.h b/src/Http/TsPlayer.h index 4674f688..270cc22d 100644 --- a/src/Http/TsPlayer.h +++ b/src/Http/TsPlayer.h @@ -28,6 +28,9 @@ public: */ void play(const std::string &url) override; + size_t getRecvSpeed() override; + size_t getRecvTotalBytes() override; + /** * 停止播放 * Stop playing diff --git a/src/Http/TsPlayerImp.h b/src/Http/TsPlayerImp.h index 821fffb3..ff02ccbb 100644 --- a/src/Http/TsPlayerImp.h +++ b/src/Http/TsPlayerImp.h @@ -21,6 +21,8 @@ public: using Ptr = std::shared_ptr; TsPlayerImp(const toolkit::EventPoller::Ptr &poller = nullptr); + size_t getRecvSpeed() override; + size_t getRecvTotalBytes() override; private: //// TsPlayer override//// diff --git a/src/Http/TsplayerImp.cpp b/src/Http/TsplayerImp.cpp index 42df6a5a..ec607edb 100644 --- a/src/Http/TsplayerImp.cpp +++ b/src/Http/TsplayerImp.cpp @@ -77,4 +77,11 @@ vector TsPlayerImp::getTracks(bool ready) const { return static_pointer_cast(_demuxer)->getTracks(ready); } +size_t TsPlayerImp::getRecvSpeed() { + return TcpClient::getRecvSpeed(); +} + +size_t TsPlayerImp::getRecvTotalBytes() { + return TcpClient::getRecvTotalBytes(); +} }//namespace mediakit \ No newline at end of file diff --git a/src/Player/PlayerBase.h b/src/Player/PlayerBase.h index dc033948..1f1dc504 100644 --- a/src/Player/PlayerBase.h +++ b/src/Player/PlayerBase.h @@ -165,6 +165,10 @@ public: * [AUTO-TRANSLATED:8fb31d43] */ virtual void setOnResume(const std::function &cb) = 0; + + virtual size_t getRecvSpeed() { return 0; } + + virtual size_t getRecvTotalBytes() { return 0; } protected: virtual void onResume() = 0; @@ -256,6 +260,14 @@ public: _on_resume = cb; } + size_t getRecvSpeed() override { + return _delegate ? _delegate->getRecvSpeed() : Parent::getRecvSpeed(); + } + + size_t getRecvTotalBytes() override { + return _delegate ? _delegate->getRecvTotalBytes() : Parent::getRecvTotalBytes(); + } + protected: void onShutdown(const toolkit::SockException &ex) override { if (_on_shutdown) { diff --git a/src/Pusher/MediaPusher.h b/src/Pusher/MediaPusher.h index cd9c2c9f..2b53e1d7 100644 --- a/src/Pusher/MediaPusher.h +++ b/src/Pusher/MediaPusher.h @@ -35,6 +35,7 @@ public: void setOnCreateSocket(toolkit::Socket::onCreateSocket cb); std::shared_ptr getSrc() { return _src.lock(); } const std::string& getUrl() const { return _url; } + private: std::weak_ptr _src; toolkit::EventPoller::Ptr _poller; diff --git a/src/Pusher/PusherBase.h b/src/Pusher/PusherBase.h index 859722ed..b6d5b1f1 100644 --- a/src/Pusher/PusherBase.h +++ b/src/Pusher/PusherBase.h @@ -67,6 +67,9 @@ public: */ virtual void setOnShutdown(const Event &cb) = 0; + virtual size_t getSendSpeed() { return 0; } + virtual size_t getSendTotalBytes() { return 0; } + protected: virtual void onShutdown(const toolkit::SockException &ex) = 0; virtual void onPublishResult(const toolkit::SockException &ex) = 0; @@ -133,6 +136,14 @@ public: _on_shutdown = cb; } + size_t getSendSpeed() override { + return _delegate ? _delegate->getSendSpeed() : Parent::getSendSpeed(); + } + + size_t getSendTotalBytes() override { + return _delegate ? _delegate->getSendTotalBytes() : Parent::getSendTotalBytes(); + } + protected: void onShutdown(const toolkit::SockException &ex) override { if (_on_shutdown) { diff --git a/src/Rtmp/FlvPlayer.cpp b/src/Rtmp/FlvPlayer.cpp index 8349ab8f..c5e968f6 100644 --- a/src/Rtmp/FlvPlayer.cpp +++ b/src/Rtmp/FlvPlayer.cpp @@ -76,4 +76,12 @@ void FlvPlayer::onRecvRtmpPacket(RtmpPacket::Ptr packet) { onRtmpPacket(std::move(packet)); } +size_t FlvPlayer::getRecvSpeed() { + return TcpClient::getRecvSpeed(); +} + +size_t FlvPlayer::getRecvTotalBytes() { + return TcpClient::getRecvTotalBytes(); +} + }//mediakit \ No newline at end of file diff --git a/src/Rtmp/FlvPlayer.h b/src/Rtmp/FlvPlayer.h index 12ba54e3..9328acd9 100644 --- a/src/Rtmp/FlvPlayer.h +++ b/src/Rtmp/FlvPlayer.h @@ -23,6 +23,8 @@ public: void play(const std::string &url) override; void teardown() override; + size_t getRecvSpeed() override; + size_t getRecvTotalBytes() override; protected: void onResponseHeader(const std::string &status, const HttpHeader &header) override; diff --git a/src/Rtmp/RtmpPlayer.cpp b/src/Rtmp/RtmpPlayer.cpp index c758d98d..359030da 100644 --- a/src/Rtmp/RtmpPlayer.cpp +++ b/src/Rtmp/RtmpPlayer.cpp @@ -452,4 +452,12 @@ void RtmpPlayer::seekToMilliSecond(uint32_t seekMS){ }); } +size_t RtmpPlayer::getRecvSpeed() { + return TcpClient::getRecvSpeed(); +} + +size_t RtmpPlayer::getRecvTotalBytes() { + return TcpClient::getRecvTotalBytes(); +} + } /* namespace mediakit */ diff --git a/src/Rtmp/RtmpPlayer.h b/src/Rtmp/RtmpPlayer.h index d11cda2a..423b637b 100644 --- a/src/Rtmp/RtmpPlayer.h +++ b/src/Rtmp/RtmpPlayer.h @@ -37,6 +37,9 @@ public: void speed(float speed) override; void teardown() override; + size_t getRecvSpeed() override; + size_t getRecvTotalBytes() override; + protected: virtual bool onMetadata(const AMFValue &val) = 0; virtual void onRtmpPacket(RtmpPacket::Ptr chunk_data) = 0; diff --git a/src/Rtmp/RtmpPusher.cpp b/src/Rtmp/RtmpPusher.cpp index badcd01c..2032b3ec 100644 --- a/src/Rtmp/RtmpPusher.cpp +++ b/src/Rtmp/RtmpPusher.cpp @@ -332,6 +332,12 @@ void RtmpPusher::onRtmpChunk(RtmpPacket::Ptr packet) { } } +size_t RtmpPusher::getSendSpeed() { + return TcpClient::getSendSpeed(); +} +size_t RtmpPusher::getSendTotalBytes() { + return TcpClient::getSendTotalBytes(); +} } /* namespace mediakit */ diff --git a/src/Rtmp/RtmpPusher.h b/src/Rtmp/RtmpPusher.h index 41caac49..d634bcd8 100644 --- a/src/Rtmp/RtmpPusher.h +++ b/src/Rtmp/RtmpPusher.h @@ -27,6 +27,9 @@ public: void publish(const std::string &url) override ; void teardown() override; + size_t getSendSpeed() override; + size_t getSendTotalBytes() override; + protected: //for Tcpclient override void onRecv(const toolkit::Buffer::Ptr &buf) override; diff --git a/src/Rtp/RawEncoder.cpp b/src/Rtp/RawEncoder.cpp index c14254bd..8c58935d 100644 --- a/src/Rtp/RawEncoder.cpp +++ b/src/Rtp/RawEncoder.cpp @@ -13,7 +13,7 @@ #include "RawEncoder.h" #include "Extension/Factory.h" #include "Rtsp/RtspMuxer.h" -#include "Common//config.h" +#include "Common/config.h" using namespace toolkit; diff --git a/src/Rtp/RtpSender.cpp b/src/Rtp/RtpSender.cpp index 88f06961..0cc445e6 100644 --- a/src/Rtp/RtpSender.cpp +++ b/src/Rtp/RtpSender.cpp @@ -457,5 +457,49 @@ void RtpSender::setOnClose(std::function _on_close = std::move(on_close); } +size_t RtpSender::getSendSpeed() const { + size_t ret = 0; + if (_socket_rtp) { + ret += _socket_rtp->getSendSpeed(); + } + if (_socket_rtcp) { + ret += _socket_rtcp->getSendSpeed(); + } + return ret; +} + +size_t RtpSender::getRecvSpeed() const { + size_t ret = 0; + if (_socket_rtp) { + ret += _socket_rtp->getRecvSpeed(); + } + if (_socket_rtcp) { + ret += _socket_rtcp->getRecvSpeed(); + } + return ret; +} + +size_t RtpSender::getRecvTotalBytes() const { + size_t ret = 0; + if (_socket_rtp) { + ret += _socket_rtp->getRecvTotalBytes(); + } + if (_socket_rtcp) { + ret += _socket_rtcp->getRecvTotalBytes(); + } + return ret; +} + +size_t RtpSender::getSendTotalBytes() const { + size_t ret = 0; + if (_socket_rtp) { + ret += _socket_rtp->getSendTotalBytes(); + } + if (_socket_rtcp) { + ret += _socket_rtcp->getSendTotalBytes(); + } + return ret; +} + } // namespace mediakit #endif // defined(ENABLE_RTPPROXY) diff --git a/src/Rtp/RtpSender.h b/src/Rtp/RtpSender.h index dbdf4a1c..77b064e5 100644 --- a/src/Rtp/RtpSender.h +++ b/src/Rtp/RtpSender.h @@ -94,6 +94,11 @@ public: */ void setOnClose(std::function on_close); + size_t getSendSpeed() const; + size_t getRecvSpeed() const; + size_t getRecvTotalBytes() const; + size_t getSendTotalBytes() const; + private: // 合并写输出 [AUTO-TRANSLATED:23544836] // Merge write output diff --git a/src/Rtsp/RtspPlayer.cpp b/src/Rtsp/RtspPlayer.cpp index 1da29a0a..fba173ea 100644 --- a/src/Rtsp/RtspPlayer.cpp +++ b/src/Rtsp/RtspPlayer.cpp @@ -800,7 +800,7 @@ void RtspPlayer::onPlayResult_l(const SockException &ex, bool handshake_done) { }; // 创建rtp数据接收超时检测定时器 [AUTO-TRANSLATED:edbffc19] // Create RTP data receive timeout detection timer - _rtp_check_timer = std::make_shared(timeoutMS / 2000.0f, lam, getPoller()); + _rtp_check_timer = std::make_shared(timeoutMS / 2000.0f, std::move(lam), getPoller()); } else { sendTeardown(); } @@ -844,6 +844,36 @@ int RtspPlayer::getTrackIndexByTrackType(TrackType track_type) const { throw SockException(Err_other, StrPrinter << "no such track with type:" << getTrackString(track_type)); } +size_t RtspPlayer::getRecvSpeed() { + size_t ret = TcpClient::getRecvSpeed(); + for (auto &rtp : _rtp_sock) { + if (rtp) { + ret += rtp->getRecvSpeed(); + } + } + for (auto &rtcp : _rtcp_sock) { + if (rtcp) { + ret += rtcp->getRecvSpeed(); + } + } + return ret; +} + +size_t RtspPlayer::getRecvTotalBytes() { + size_t ret = TcpClient::getRecvTotalBytes(); + for (auto &rtp : _rtp_sock) { + if (rtp) { + ret += rtp->getRecvTotalBytes(); + } + } + for (auto &rtcp : _rtcp_sock) { + if (rtcp) { + ret += rtcp->getRecvTotalBytes(); + } + } + return ret; +} + /////////////////////////////////////////////////// // RtspPlayerImp float RtspPlayerImp::getDuration() const { diff --git a/src/Rtsp/RtspPlayer.h b/src/Rtsp/RtspPlayer.h index fe1fe9fe..c24d4806 100644 --- a/src/Rtsp/RtspPlayer.h +++ b/src/Rtsp/RtspPlayer.h @@ -39,6 +39,9 @@ public: void teardown() override; float getPacketLossRate(TrackType type) const override; + size_t getRecvSpeed() override; + size_t getRecvTotalBytes() override; + protected: // 派生类回调函数 [AUTO-TRANSLATED:61e20903] // Derived class callback function @@ -156,9 +159,10 @@ private: std::string _play_url; // rtsp开始倍速 [AUTO-TRANSLATED:9ab84508] // Rtsp start speed - float _speed= 0.0f; + float _speed = 0.0f; std::vector _sdp_track; std::function _on_response; + protected: // RTP端口,trackid idx 为数组下标 [AUTO-TRANSLATED:77c186bb] // RTP port, trackid idx is the array subscript toolkit::Socket::Ptr _rtp_sock[2]; @@ -166,6 +170,7 @@ private: // RTCP port, trackid idx is the array subscript toolkit::Socket::Ptr _rtcp_sock[2]; +private: // rtsp鉴权相关 [AUTO-TRANSLATED:947dc6a3] // Rtsp authentication related std::string _md5_nonce; @@ -175,8 +180,10 @@ private: uint32_t _cseq_send = 1; std::string _content_base; std::string _control_url; +protected: Rtsp::eRtpType _rtp_type = Rtsp::RTP_TCP; +private: // 当前rtp时间戳 [AUTO-TRANSLATED:410f2691] // Current rtp timestamp uint32_t _stamp[2] = {0, 0}; diff --git a/src/Rtsp/RtspPlayerImp.h b/src/Rtsp/RtspPlayerImp.h index 0bb7b474..835388eb 100644 --- a/src/Rtsp/RtspPlayerImp.h +++ b/src/Rtsp/RtspPlayerImp.h @@ -59,6 +59,36 @@ public: std::vector getTracks(bool ready = true) const override; + size_t getRecvSpeed() override { + size_t ret = TcpClient::getRecvSpeed(); + for (auto &rtp : _rtp_sock) { + if (rtp) { + ret += rtp->getRecvSpeed(); + } + } + for (auto &rtcp : _rtcp_sock) { + if (rtcp) { + ret += rtcp->getRecvSpeed(); + } + } + return ret; + } + + size_t getRecvTotalBytes() override { + size_t ret = TcpClient::getRecvTotalBytes(); + for (auto &rtp : _rtp_sock) { + if (rtp) { + ret += rtp->getRecvTotalBytes(); + } + } + for (auto &rtcp : _rtcp_sock) { + if (rtcp) { + ret += rtcp->getRecvTotalBytes(); + } + } + return ret; + } + private: // 派生类回调函数 [AUTO-TRANSLATED:61e20903] // Derived class callback function diff --git a/src/Rtsp/RtspPusher.cpp b/src/Rtsp/RtspPusher.cpp index 7aab8d42..ba75fb26 100644 --- a/src/Rtsp/RtspPusher.cpp +++ b/src/Rtsp/RtspPusher.cpp @@ -595,5 +595,34 @@ void RtspPusher::sendRtspRequest(const string &cmd, const string &url,const StrC SockSender::send(std::move(printer)); } +size_t RtspPusher::getSendSpeed() { + size_t ret = TcpClient::getSendSpeed(); + for (auto &rtp : _rtp_sock) { + if (rtp) { + ret += rtp->getSendSpeed(); + } + } + for (auto &rtcp : _rtcp_sock) { + if (rtcp) { + ret += rtcp->getSendSpeed(); + } + } + return ret; +} + +size_t RtspPusher::getSendTotalBytes() { + size_t ret = TcpClient::getSendTotalBytes(); + for (auto &rtp : _rtp_sock) { + if (rtp) { + ret += rtp->getSendTotalBytes(); + } + } + for (auto &rtcp : _rtcp_sock) { + if (rtcp) { + ret += rtcp->getSendTotalBytes(); + } + } + return ret; +} } /* namespace mediakit */ diff --git a/src/Rtsp/RtspPusher.h b/src/Rtsp/RtspPusher.h index eb929f34..ca2c962e 100644 --- a/src/Rtsp/RtspPusher.h +++ b/src/Rtsp/RtspPusher.h @@ -30,6 +30,8 @@ public: ~RtspPusher() override; void publish(const std::string &url) override; void teardown() override; + size_t getSendSpeed() override; + size_t getSendTotalBytes() override; protected: //for Tcpclient override diff --git a/src/Srt/SrtCaller.cpp b/src/Srt/SrtCaller.cpp index 3a1134b6..2d0da89f 100644 --- a/src/Srt/SrtCaller.cpp +++ b/src/Srt/SrtCaller.cpp @@ -82,7 +82,7 @@ void SrtCaller::onConnect() { auto peer_addr = SockUtil::make_sockaddr(_url._host.c_str(), (_url._port)); _socket = Socket::createSocket(_poller, false); - _socket->bindUdpSock(0, SockUtil::is_ipv4(_url._host.data()) ? "0.0.0.0" : "::"); + _socket->bindUdpSock(0, SockUtil::is_ipv4(_url._host.data()) ? "0.0.0.0" : "::"); _socket->bindPeerAddr((struct sockaddr *)&peer_addr, 0, true); weak_ptr weak_self = shared_from_this(); @@ -1018,6 +1018,21 @@ size_t SrtCaller::getPayloadSize() { return ret; } +size_t SrtCaller::getRecvSpeed() const { + return _socket ? _socket->getRecvSpeed() : 0; +} + +size_t SrtCaller::getRecvTotalBytes() const { + return _socket ? _socket->getRecvTotalBytes() : 0; +} + +size_t SrtCaller::getSendSpeed() const { + return _socket ? _socket->getSendSpeed() : 0; +} + +size_t SrtCaller::getSendTotalBytes() const { + return _socket ? _socket->getSendTotalBytes() : 0; +} } /* namespace mediakit */ diff --git a/src/Srt/SrtCaller.h b/src/Srt/SrtCaller.h index 08b20ff7..e8ec679b 100644 --- a/src/Srt/SrtCaller.h +++ b/src/Srt/SrtCaller.h @@ -60,6 +60,11 @@ public: virtual void inputSockData(uint8_t *buf, int len, struct sockaddr *addr); virtual void onSendTSData(const SRT::Buffer::Ptr &buffer, bool flush); + size_t getRecvSpeed() const; + size_t getRecvTotalBytes() const; + size_t getSendSpeed() const; + size_t getSendTotalBytes() const; + protected: virtual void onConnect(); diff --git a/src/Srt/SrtPlayer.cpp b/src/Srt/SrtPlayer.cpp index ebb7676e..e77becc9 100644 --- a/src/Srt/SrtPlayer.cpp +++ b/src/Srt/SrtPlayer.cpp @@ -120,6 +120,14 @@ std::string SrtPlayer::getPassphrase() { return passPhrase; } +size_t SrtPlayer::getRecvSpeed() { + return SrtCaller::getRecvSpeed(); +} + +size_t SrtPlayer::getRecvTotalBytes() { + return SrtCaller::getRecvTotalBytes(); +} + /////////////////////////////////////////////////// // SrtPlayerImp @@ -164,6 +172,5 @@ void SrtPlayerImp::onSRTData(SRT::DataPacket::Ptr pkt) { return; } - } /* namespace mediakit */ diff --git a/src/Srt/SrtPlayer.h b/src/Srt/SrtPlayer.h index 710ad237..72d1083c 100644 --- a/src/Srt/SrtPlayer.h +++ b/src/Srt/SrtPlayer.h @@ -38,6 +38,8 @@ public: void teardown() override; void pause(bool pause) override; void speed(float speed) override; + size_t getRecvSpeed() override; + size_t getRecvTotalBytes() override; protected: diff --git a/src/Srt/SrtPusher.cpp b/src/Srt/SrtPusher.cpp index 9cbffed0..d68af082 100644 --- a/src/Srt/SrtPusher.cpp +++ b/src/Srt/SrtPusher.cpp @@ -112,5 +112,13 @@ void SrtPusher::doPublish() { }); } +size_t SrtPusher::getSendSpeed() { + return SrtCaller::getSendSpeed(); +} + +size_t SrtPusher::getSendTotalBytes() { + return SrtCaller::getSendTotalBytes(); +} + } /* namespace mediakit */ diff --git a/src/Srt/SrtPusher.h b/src/Srt/SrtPusher.h index c7c973cc..66b19c28 100644 --- a/src/Srt/SrtPusher.h +++ b/src/Srt/SrtPusher.h @@ -51,6 +51,9 @@ protected: protected: std::weak_ptr _push_src; TSMediaSource::RingType::RingReader::Ptr _ts_reader; + + size_t getSendSpeed() override; + size_t getSendTotalBytes() override; }; using SrtPusherImp = PusherImp;