【流媒体】Media soup源码分析(四)流的转发

本文深入解析Mediasoup源码中流媒体传输的实现细节,从Socket创建到数据包处理,涵盖STUN、DTLS、RTP、RTCP等关键协议的交互流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传输媒体流的通道的建立在Media soup源码分析(三)中已经说明,实际上流的转发是依赖于Socket

创建socket

WebRtcTransport

下述socket的创建函数在C++的WebRtcTransport类的构造函数中

auto* udpSocket = new RTC::UdpSocket(this, listenIp.ip);

这行代码创建了UdpSocket,且有多少个listenIp就创建多少个socket

UdpSocket

进入UdpSocket的构造函数,它调用了父类**::UdpSocket的构造函数,实际上在参数中,还调用了PortManager::BindUdp(ip)**,它通过udp获得了端口,并且生成了一个与libuv绑定的handle

UdpSocket::UdpSocket(Listener* listener, std::string& ip)
	  : // This may throw.
	    ::UdpSocket::UdpSocket(PortManager::BindUdp(ip)), listener(listener)
	{
   
		MS_TRACE();
	}

::UdpSocket

在父类的构造函数中,启动了一个uvHandle,并且申请了onRecv这个API

UdpSocket::UdpSocket(uv_udp_t* uvHandle) : uvHandle(uvHandle)
{
   
	MS_TRACE();

	int err;

	this->uvHandle->data = static_cast<void*>(this);

	err = uv_udp_recv_start(
	  this->uvHandle, static_cast<uv_alloc_cb>(onAlloc), static_cast<uv_udp_recv_cb>(onRecv));

	if (err != 0)
	{
   
		uv_close(reinterpret_cast<uv_handle_t*>(this->uvHandle), static_cast<uv_close_cb>(onClose));

		MS_THROW_ERROR("uv_udp_recv_start() failed: %s", uv_strerror(err));
	}

	// Set local address.
	if (!SetLocalAddress())
	{
   
		uv_close(reinterpret_cast<uv_handle_t*>(this->uvHandle), static_cast<uv_close_cb>(onClose));

		MS_THROW_ERROR("error setting local IP and port");
	}
}

传递数据包

onRecv

onRecv是一个全局静态函数,为了贯彻面向对象的思想,这里继续把参数传给socket->OnUvRecv,

inline static void onRecv(
  uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned int flags)
{
   
	auto* socket = static_cast<UdpSocket*>(handle->data);

	if (socket)
		socket->OnUvRecv(nread, buf, addr, flags);
}

OnUvRecv

在这个函数体内,重要的是下面这行代码

		
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值