概述
在创建了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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复