我是靠谱客的博主 爱撒娇冬瓜,最近开发中收集的这篇文章主要介绍二、mediasoup之WebRtcTransport创建流程(1),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

        在创建了router(代表一个房间)之后,producer要发送音视频数据之前就要先创建Transport,分为WebRtcTransport 、PlainTransport、PipeTransport三种,我们这里主要讲的是WebRtcTransport 。

参考下官方api的使用:

// 参数详情参与链接
// https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcTransportOptions
const transport = await router.createWebRtcTransport(
  {
    listenIps : [ { ip: "192.168.0.111", announcedIp: "88.12.10.41" } ],
    enableUdp : true,
    enableTcp : true,
    preferUdp : true
  });

        nodejs 主进程的函数createWebRtcTransport中通过发送'router.createWebRtcTransport'指令给c++ 子进程,代码如下:

// this.#internal 为 { routerId },代表属于哪个router
const internal = { ...this.#internal, transportId: uuidv4() };
		const reqData = {
			listenIps,
			port,
			enableUdp,
			enableTcp,
			preferUdp,
			preferTcp,
			initialAvailableOutgoingBitrate,
			enableSctp,
			numSctpStreams,
			maxSctpMessageSize,
			sctpSendBufferSize,
			isDataChannel : true
		};

const data = await this.#channel.request('router.createWebRtcTransport', internal, reqData);

            C++层面“router.createWebRtcTransport”对应用的methodID为ChannelRequest::MethodId::ROUTER_CREATE_WEBRTC_TRANSPORT,对这个methodID的请求处理在void Router::HandleRequest(Channel::ChannelRequest* request)里面,代码如下:

void Router::HandleRequest(Channel::ChannelRequest* request)
	{
		MS_TRACE();

		switch (request->methodId)
		{
            .............
            case Channel::ChannelRequest::MethodId::ROUTER_CREATE_WEBRTC_TRANSPORT:
			{
				std::string transportId;

				// This may throw.
				SetNewTransportIdFromInternal(request->internal, transportId);

				// This may throw.
				auto* webRtcTransport = new RTC::WebRtcTransport(transportId, this, request->data);

				// Insert into the map.
				this->mapTransports[transportId] = webRtcTransport;

				MS_DEBUG_DEV("WebRtcTransport created [transportId:%s]", transportId.c_str());

				json data = json::object();

				webRtcTransport->FillJson(data);

				request->Accept(data);

				break;
			}

            ............
        }
    }

代码中我们看到 

auto* webRtcTransport = new RTC::WebRtcTransport(transportId, this, request->data);

就是创建一个 WebRtcTransport实例。我们看下WebRtcTransport类的定义:

class WebRtcTransport : public RTC::Transport,
	                    public RTC::UdpSocket::Listener,
	                    public RTC::TcpServer::Listener,
	                    public RTC::TcpConnection::Listener,
	                    public RTC::IceServer::Listener,
	                    public RTC::DtlsTransport::Listener

可以看到主要继承于  RTC::Transport, 后面的都是一些监听器Listener,用于响应处理网络io事件和ice,dtls 的相关事件,这些以后再分析。在创建WebRtcTransport后,就调用了代码

json data = json::object();

webRtcTransport->FillJson(data);

request->Accept(data);

填充响应信息,返回给node.js主进程,进一步返回给client端。

        在WebRtcTransport实例创建成功后,接下来就是进行连接了,nodejs主进程发送"transport.connect" 指令到c++子进程,可以看下nodejs 的代码:

/**
	 * Provide the WebRtcTransport remote parameters.
	 *
	 * @override
	 */
	async connect({ dtlsParameters }: { dtlsParameters: DtlsParameters }): Promise<void>
	{
		logger.debug('connect()');

		const reqData = { dtlsParameters };

		const data =
			await this.channel.request('transport.connect', this.internal, reqData);

		// Update data.
		this.#data.dtlsParameters.role = data.dtlsLocalRole;
	}

         对应的c++层面methodID为ChannelRequest::MethodId::TRANSPORT_PRODUCE 

{ "transport.connect",    ChannelRequest::MethodId::TRANSPORT_CONNECT  },

         连接成功后,就是创建producer,这里直接看指令的映射关系

{ "transport.produce",    ChannelRequest::MethodId::TRANSPORT_PRODUCE },

        producer创建成功后,就可以进行音视频数据的传输了。

        此文只是简要说下WebRtcTransport创建流程,具体的connect,produce细节,后续再进一步讲解。

最后

以上就是爱撒娇冬瓜为你收集整理的二、mediasoup之WebRtcTransport创建流程(1)的全部内容,希望文章能够帮你解决二、mediasoup之WebRtcTransport创建流程(1)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部