请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

为什么mediasoup不会向WebRTC发送RTX重传流的SR报文,为什么WebRTC不会向mediasoup发送RTX重传流的RR报文?

附:
图片描述
mediasoup不会向WebRTC发送RTX重传流的SR报文的证据:

void Transport::SendRtcp(uint64_t nowMs)
{
	...

	for (auto& kv : this->mapConsumers)
	{
		auto* consumer = kv.second;

		// 1.GetRtpStreams返回的是媒体流。
		for (auto* rtpStream : consumer->GetRtpStreams())
		{
			packet.reset(new RTC::RTCP::CompoundPacket());

			// 5.生成consumer的SR报文,rtpStream是媒体流。
			consumer->GetRtcp(packet.get(), rtpStream, nowMs);
		}
	}
}

std::vector<RTC::RtpStreamSend*> GetRtpStreams() override
{
	// 2.rtpStreams是媒体流。
	return this->rtpStreams;
}

void SimulcastConsumer::CreateRtpStream()
{
	...
	auto& encoding         = this->rtpParameters.encodings[0];

	RTC::RtpStream::Params params;

	params.ssrc           = encoding.ssrc;

	this->rtpStream = new RTC::RtpStreamSend(this, params, bufferSize);
	// 3.rtpStreams是媒体流。
	this->rtpStreams.push_back(this->rtpStream);

	if (rtxCodec && encoding.hasRtx)
		// 4.RTX重传流在这里。
		this->rtpStream->SetRtx(rtxCodec->payloadType, encoding.rtx.ssrc);
}

void SimulcastConsumer::GetRtcp(RTC::RTCP::CompoundPacket* packet, RTC::RtpStreamSend* rtpStream, uint64_t nowMs)
{
	...
	// 6.生成consumer的SR报文,rtpStream是媒体流。
	auto* report = this->rtpStream->GetRtcpSenderReport(nowMs);
}

RTC::RTCP::SenderReport* RtpStreamSend::GetRtcpSenderReport(uint64_t nowMs)
{
	...
	// GetSsrc()返回的是媒体流SSRC,将媒体流的SSRC设置进SR报文。
	report->SetSsrc(GetSsrc());
}

WebRTC不会向mediasoup发送RTX重传流的RR报文的证据:

void Transport::HandleRtcpPacket(RTC::RTCP::Packet* packet)
{
	...
	switch (packet->GetType())
	{
		case RTC::RTCP::Type::RR:
		{
			auto* consumer = GetConsumerByMediaSsrc(report->GetSsrc());
		}
	}
}

inline RTC::Consumer* Transport::GetConsumerByMediaSsrc(uint32_t ssrc) const
{
	...

	auto mapSsrcConsumerIt = this->mapSsrcConsumer.find(ssrc);

	if (mapSsrcConsumerIt == this->mapSsrcConsumer.end())
		return nullptr;

	auto* consumer = mapSsrcConsumerIt->second;

	return consumer;
}

void Transport::HandleRequest(Channel::Request* request)
{
	...
	case Channel::Request::MethodId::TRANSPORT_CONSUME:
	{
		// 建立ssrc到consumer的映射。
		for (auto ssrc : consumer->GetMediaSsrcs())
		{
			this->mapSsrcConsumer[ssrc] = consumer;
		}

		// 建立rtx ssrc到consumer的映射。
		for (auto ssrc : consumer->GetRtxSsrcs())
		{
			this->mapRtxSsrcConsumer[ssrc] = consumer;
		}
	}
}

正在回答 回答被采纳积分+3

插入代码

1回答

李超 2022-08-29 20:39:51

重传流的SSRC 是在SDP里协商的,SSRC 可以是重传流

0 回复 有任何疑惑可以回复我~
  • 提问者 GavinXu89 #1
    WebRTC会向mediasoup发送RTX重传流的SR报文,但不知为什么,
    mediasoup不会向WebRTC发送RTX重传流的SR报文。
    回复 有任何疑惑可以回复我~ 2022-08-29 21:54:32
  • 李超 #2
    好像mediasoup 没使用RTX
    回复 有任何疑惑可以回复我~ 2022-08-29 23:20:07
  • 提问者 GavinXu89 回复 李超 #3
    肯定实现了,是否使用由transport.produce和transport.consume信令中的data.rtpParameters.encodings.rtx决定。
    回复 有任何疑惑可以回复我~ 2022-08-29 23:33:08
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号