Compare commits

...

4 Commits

Author SHA1 Message Date
mtdxc
b9d513f9aa 采用定时器发送rr
Some checks are pending
Android / build (push) Waiting to run
CodeQL / Analyze (cpp) (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
Docker / build (push) Waiting to run
Linux / build (push) Waiting to run
macOS / build (push) Waiting to run
Windows / build (push) Waiting to run
2025-09-29 19:06:47 +08:00
mtdxc
21d1ea9676 sr发送限频 2025-09-29 19:06:47 +08:00
mtdxc
13f603328f rtc拉流代理支持显示sockInfo和码率 2025-09-29 19:06:47 +08:00
mtdxc
016f6e0e59 修复拼写错误,并精简WebRtcClient无用代码 2025-09-29 19:06:47 +08:00
9 changed files with 69 additions and 51 deletions

View File

@ -180,8 +180,8 @@ public:
virtual void setOnResume(const std::function<void()> &cb) = 0;
virtual size_t getRecvSpeed() { return 0; }
virtual size_t getRecvTotalBytes() { return 0; }
virtual std::shared_ptr<toolkit::SockInfo> getSockInfo() const { return nullptr; }
protected:
virtual void onResume() = 0;
@ -241,8 +241,11 @@ public:
return _delegate ? _delegate->getTracks(ready) : Parent::getTracks(ready);
}
std::shared_ptr<toolkit::SockInfo> getSockInfo() const {
return std::dynamic_pointer_cast<toolkit::SockInfo>(_delegate);
std::shared_ptr<toolkit::SockInfo> getSockInfo() const override {
auto ret = std::dynamic_pointer_cast<toolkit::SockInfo>(_delegate);
if (!ret)
ret = _delegate ? _delegate->getSockInfo() : Parent::getSockInfo();
return ret;
}
void setMediaSource(const MediaSource::Ptr &src) override {

View File

@ -107,6 +107,11 @@ uint32_t RtcpContextForSend::getRtt(uint32_t ssrc) const {
}
Buffer::Ptr RtcpContextForSend::createRtcpSR(uint32_t rtcp_ssrc) {
uint64_t now = getCurrentMillisecond();
if (now - _last_sr_tsp < 5000) {
return nullptr;
}
_last_sr_tsp = now;
auto rtcp = RtcpSR::create(0);
rtcp->setNtpStamp(_last_ntp_stamp_ms);
rtcp->rtpts = htonl(_last_rtp_stamp);
@ -117,7 +122,7 @@ Buffer::Ptr RtcpContextForSend::createRtcpSR(uint32_t rtcp_ssrc) {
// 记录上次发送的sender report信息用于后续统计rtt [AUTO-TRANSLATED:1d22d2c8]
// Record the last sent sender report information for subsequent RTT statistics
auto last_sr_lsr = ((ntohl(rtcp->ntpmsw) & 0xFFFF) << 16) | ((ntohl(rtcp->ntplsw) >> 16) & 0xFFFF);
_sender_report_ntp[last_sr_lsr] = getCurrentMillisecond();
_sender_report_ntp[last_sr_lsr] = now;
if (_sender_report_ntp.size() >= 5) {
// 删除最早的sr rtcp [AUTO-TRANSLATED:2457e08d]
// Delete the earliest sr rtcp

View File

@ -154,6 +154,7 @@ public:
uint32_t getRtt(uint32_t ssrc) const;
private:
uint64_t _last_sr_tsp = 0;
std::map<uint32_t /*ssrc*/, uint32_t /*rtt*/> _rtt;
std::map<uint32_t /*last_sr_lsr*/, uint64_t /*ntp stamp*/> _sender_report_ntp;

View File

@ -1060,7 +1060,7 @@ IceAgent::IceAgent(Listener* listener, Implementation implementation, Role role,
}, getPoller());
}
void IceAgent::gatheringCandidate(const CandidateTuple::Ptr& candidate_tuple, bool gathering_rflx, bool gathering_realy) {
void IceAgent::gatheringCandidate(const CandidateTuple::Ptr& candidate_tuple, bool gathering_rflx, bool gathering_relay) {
// TraceL;
auto interfaces = SockUtil::getInterfaceList();
@ -1091,11 +1091,11 @@ void IceAgent::gatheringCandidate(const CandidateTuple::Ptr& candidate_tuple, bo
gatheringSrflxCandidate(pair);
}
if (gathering_realy) {
if (gathering_relay) {
//TODO: 代优化relay_socket 复用host socket当前SocketCandidateManager数据结构不支持
auto relay_socket = createSocket(candidate_tuple->_transport, candidate_tuple->_addr._host, candidate_tuple->_addr._port, local_ip);
_socket_candidate_manager.addRelaySocket(relay_socket);
gatheringRealyCandidate(std::make_shared<Pair>(std::move(relay_socket)));
gatheringRelayCandidate(std::make_shared<Pair>(std::move(relay_socket)));
}
} catch (std::exception &ex) {
WarnL << ex.what();
@ -1163,7 +1163,7 @@ void IceAgent::gatheringSrflxCandidate(const Pair::Ptr& pair) {
sendBindRequest(pair, std::move(handle));
}
void IceAgent::gatheringRealyCandidate(const Pair::Ptr &pair) {
void IceAgent::gatheringRelayCandidate(const Pair::Ptr &pair) {
// TraceL;
sendAllocateRequest(pair);
}
@ -1850,12 +1850,12 @@ void IceAgent::sendSocketData(const Buffer::Ptr& buf, const Pair::Ptr& pair, boo
}
if (use_pair->_relayed_addr) {
return sendRealyPacket(buf, use_pair, flush);
return sendRelayPacket(buf, use_pair, flush);
}
return sendSocketData_l(buf, use_pair, flush);
}
void IceAgent::sendRealyPacket(const Buffer::Ptr& buffer, const Pair::Ptr& pair, bool flush) {
void IceAgent::sendRelayPacket(const Buffer::Ptr &buffer, const Pair::Ptr &pair, bool flush) {
// TraceL;
auto forward_pair = std::make_shared<Pair>(*pair);
auto peer_addr = std::move(forward_pair->_relayed_addr);
@ -2023,4 +2023,24 @@ Json::Value IceAgent::getChecklistInfo() const {
return result;
}
size_t IceAgent::getRecvSpeed() {
size_t ret = 0;
for (auto s : _socket_candidate_manager.getAllSockets()) {
if (s && s->getSock()) {
ret += s->getSock()->getRecvSpeed();
}
}
return ret;
}
size_t IceAgent::getRecvTotalBytes() {
size_t ret = 0;
for (auto s : _socket_candidate_manager.getAllSockets()) {
if (s && s->getSock()) {
ret += s->getSock()->getRecvTotalBytes();
}
}
return ret;
}
} // namespace RTC

View File

@ -509,7 +509,7 @@ public:
_ice_server = std::move(ice_server);
}
void gatheringCandidate(const CandidateTuple::Ptr& candidate_tuple, bool gathering_rflx, bool gathering_realy);
void gatheringCandidate(const CandidateTuple::Ptr& candidate_tuple, bool gathering_rflx, bool gathering_relay);
void connectivityCheck(CandidateInfo& candidate);
void nominated(const Pair::Ptr& pair, CandidateTuple& candidate);
@ -553,10 +553,12 @@ public:
// 获取checklist信息用于API查询
Json::Value getChecklistInfo() const;
size_t getRecvSpeed();
size_t getRecvTotalBytes();
protected:
void gatheringSrflxCandidate(const Pair::Ptr& pair);
void gatheringRealyCandidate(const Pair::Ptr& pair);
void gatheringRelayCandidate(const Pair::Ptr& pair);
void localRelayedConnectivityCheck(CandidateInfo& candidate);
void connectivityCheck(const Pair::Ptr& pair, CandidateTuple& candidate);
void tryTriggerredCheck(const Pair::Ptr& pair);
@ -587,7 +589,7 @@ protected:
void refreshChannelBindings();
void sendSendIndication(const sockaddr_storage& peer_addr, const toolkit::Buffer::Ptr& buffer, const Pair::Ptr& pair);
void sendRealyPacket(const toolkit::Buffer::Ptr& buffer, const Pair::Ptr& pair, bool flush);
void sendRelayPacket(const toolkit::Buffer::Ptr& buffer, const Pair::Ptr& pair, bool flush);
private:

View File

@ -11,9 +11,6 @@
#ifndef ZLMEDIAKIT_WEBRTC_CLIENT_H
#define ZLMEDIAKIT_WEBRTC_CLIENT_H
#include "Network/Socket.h"
#include "Poller/Timer.h"
#include "Util/TimeTicker.h"
#include "Http/HttpRequester.h"
#include "Sdp.h"
#include "WebRtcTransport.h"
@ -46,14 +43,6 @@ public:
private:
};
namespace Rtc {
typedef enum {
Signaling_Invalid = -1,
Signaling_WHEP_WHIP = 0,
Signaling_WEBSOCKET = 1,
} eSignalingProtocols;
} // namespace Rtc
// 实现了webrtc代理功能
class WebRtcClient : public std::enable_shared_from_this<WebRtcClient> {
public:
@ -97,8 +86,6 @@ protected:
WebRtcTransport::Ptr _transport = nullptr;
bool _is_negotiate_finished = false;
private:
std::map<std::string /*candidate key*/, toolkit::SocketHelper::Ptr> _socket_map;
};
} /*namespace mediakit */

View File

@ -36,6 +36,16 @@ public:
void pause(bool pause) override;
void speed(float speed) override;
std::shared_ptr<toolkit::SockInfo> getSockInfo() const override {
return getWebRtcTransport() ? getWebRtcTransport()->getSession() : nullptr;
}
size_t getRecvSpeed() override {
return getWebRtcTransport() ? getWebRtcTransport()->getRecvSpeed() : 0;
}
size_t getRecvTotalBytes() override {
return getWebRtcTransport() ? getWebRtcTransport()->getRecvTotalBytes() : 0;
}
protected:
//// WebRtcClient override////

View File

@ -1127,11 +1127,10 @@ public:
}
return rtp;
}
Buffer::Ptr createRtcpRR(RtcpHeader *sr, uint32_t ssrc) {
if (sr) {
_rtcp_context.onRtcp(sr);
}
void onRtcp(RtcpHeader *sr) {
_rtcp_context.onRtcp(sr);
}
Buffer::Ptr createRtcpRR(uint32_t ssrc) {
return _rtcp_context.createRtcpRR(ssrc, getSSRC());
}
@ -1217,9 +1216,7 @@ void WebRtcTransportImp::onRtcp(const char *buf, size_t len) {
// 设置rtp时间戳与ntp时间戳的对应关系 [AUTO-TRANSLATED:e92f4749]
// Set the correspondence between rtp timestamp and ntp timestamp
rtp_chn->setNtpStamp(sr->rtpts, sr->getNtpUnixStampMS());
auto rr = rtp_chn->createRtcpRR(sr, track->answer_ssrc_rtp);
sendRtcpPacket(rr->data(), rr->size(), true);
_rtcp_rr_send_ticker.resetTime();
rtp_chn->onRtcp(sr);
}
} else {
WarnL << "未识别的sr rtcp包:" << rtcp->dumpString();
@ -1236,9 +1233,6 @@ void WebRtcTransportImp::onRtcp(const char *buf, size_t len) {
if (it != _ssrc_to_track.end()) {
auto &track = it->second;
track->rtcp_context_send->onRtcp(rtcp);
auto sr = track->rtcp_context_send->createRtcpSR(track->answer_ssrc_rtp);
sendRtcpPacket(sr->data(), sr->size(), true);
_rtcp_sr_send_ticker.resetTime();
} else {
WarnL << "未识别的rr rtcp包:" << rtcp->dumpString();
}
@ -1351,14 +1345,12 @@ void WebRtcTransportImp::onRtp(const char *buf, size_t len, uint64_t stamp_ms) {
if (_rtcp_rr_send_ticker.elapsedTime() > 5000) {
_rtcp_rr_send_ticker.resetTime();
auto ssrc = ntohl(rtp->ssrc);
auto track_it = _ssrc_to_track.find(ssrc);
if (track_it != _ssrc_to_track.end()) {
auto &track = track_it->second;
for (auto& it : _ssrc_to_track) {
auto ssrc = it.first;
auto &track = it.second;
auto rtp_chn = track->getRtpChannel(ssrc);
if (rtp_chn) {
auto rr = rtp_chn->createRtcpRR(nullptr, track->answer_ssrc_rtp);
auto rr = rtp_chn->createRtcpRR(track->answer_ssrc_rtp);
if (rr && rr->size() > 0) {
sendRtcpPacket(rr->data(), rr->size(), true);
}
@ -1505,13 +1497,10 @@ void WebRtcTransportImp::onSendRtp(const RtpPacket::Ptr &rtp, bool flush, bool r
sendRtpPacket(rtp->data() + RtpPacket::kRtpTcpHeaderSize, rtp->size() - RtpPacket::kRtpTcpHeaderSize, flush, &ctx);
_bytes_usage += rtp->size() - RtpPacket::kRtpTcpHeaderSize;
if (_rtcp_sr_send_ticker.elapsedTime() > 5000) {
_rtcp_sr_send_ticker.resetTime();
if (track->rtcp_context_send) {
auto sr = track->rtcp_context_send->createRtcpSR(track->answer_ssrc_rtp);
if (sr && sr->size() > 0) {
sendRtcpPacket(sr->data(), sr->size(), true);
}
if (track->rtcp_context_send) {
auto sr = track->rtcp_context_send->createRtcpSR(track->answer_ssrc_rtp);
if (sr && sr->size() > 0) {
sendRtcpPacket(sr->data(), sr->size(), true);
}
}
}

View File

@ -163,6 +163,8 @@ public:
float getTimeOutSec();
void getTransportInfo(const std::function<void(Json::Value)> &callback) const;
size_t getRecvSpeed() const { return _ice_agent ? _ice_agent->getRecvSpeed() : 0; }
size_t getRecvTotalBytes() const { return _ice_agent ? _ice_agent->getRecvTotalBytes() : 0; }
void setOnShutdown(std::function<void(const toolkit::SockException &ex)> cb);
@ -378,7 +380,6 @@ private:
// pli rtcp timer
toolkit::Ticker _pli_ticker;
toolkit::Ticker _rtcp_sr_send_ticker;
toolkit::Ticker _rtcp_rr_send_ticker;
// twcc rtcp发送上下文对象 [AUTO-TRANSLATED:aef6476a]