MixedReality-WebRTC 源码分析

作者:追风剑情 发布于:2023-8-4 19:17 分类:Unity3d

PeerConnection.cs

11111.png

这里是对 Microsoft.MixedReality.WebRTC.Unity.PeerConnection 源码进行分析。在 Microsoft.MixedReality.WebRTC.Unity.PeerConnection 中封装了 Microsoft.MixedReality.WebRTC.PeerConnection。挂在GameObject上的是 Microsoft.MixedReality.WebRTC.Unity.PeerConnection。别搞混了。

初始化与反初始化,意为着控制挂了PeerConnection组件的GameObject的显示与隐藏即可控制视频通话的启动与关闭。

IceCandidateReadytoSend事件触发频率比较高,必须将 ICE Candidate 信息的同步加入到队列(__mainThreadWorkQueue)中发送,并在Signaler的Update()方法中修改_mainThreadWorkQueue的调用频率。

//注意这里的Peer引用的是 Microsoft.MixedReality.WebRTC.Unity.PeerConnection
public WebRTC.PeerConnection Peer { get; private set; } = null;

private void OnEnable()
{
	if (AutoLogErrorsToUnityConsole)
	{
		OnError.AddListener(OnError_Listener);
	}
	InitializeAsync();
}

private void OnDisable()
{
	Uninitialize();
	OnError.RemoveListener(OnError_Listener);
}

/// <summary>
/// 调用此方法进行创建和发送Offer
/// 当AutoCreateOfferOnRenegotiationNeeded为false时,需要手动调用此方法来创建并发送Offer
/// 当AutoCreateOfferOnRenegotiationNeeded为true时,将在_nativePeer.RenegotiationNeeded回调事件中自动调用StartConnection()
/// </summary>
public bool StartConnection()
{
	//省略......
	return _nativePeer.CreateOffer();
}  

注意:要确保摄像头视频流可用后再启动WebRTC,否则对方收不到视频画面。可通过监听WebcamSource组件的VideoStreamStarted事件来确定视频流已可使用。

11111.png

Signaler.cs

NodeDssSignaler的基类。

// 此值待WebRTC初始化成功后可用
protected WebRTC.PeerConnection _nativePeer = null;

protected virtual void OnEnable()
{
	//在OnPeerInitialized回调方法中完成媒体协商,
	//如果需要动态更改请求的信令服务器IP,需要在此回调触发前更改。
	PeerConnection.OnInitialized.AddListener(OnPeerInitialized);
	PeerConnection.OnShutdown.AddListener(OnPeerUninitializing);
}  

NodeDssSignaler.cs

与信令服务器的网络通信。实现 Offer/Answer 、ICE Candidate 的交换。

protected override void Update()
{
	//省略......
	//轮询信令服务器
	StartCoroutine(CO_GetAndProcessFromServer());
}

private IEnumerator CO_GetAndProcessFromServer()
{
	//省略......
	//向信令服务器查询offer、answer、ice消息
	var www = UnityWebRequest.Get($"{HttpServerAddress}data/{LocalPeerId}");
	yield return www.SendWebRequest();
	//省略......
}  

如果想处理初始化回调,需要修改源码重写OnEnable()。

// 重写OnEnable()
protected override void OnEnable()
{
	base.OnEnable();
	//添加初始化与反初始化回调方法
	PeerConnection.OnInitialized.AddListener(OnPeerInitialized2);
	PeerConnection.OnShutdown.AddListener(OnPeerUninitializing2);
}

protected override void OnDisable()
{
	base.OnDisable();
	//记得移除回调
	PeerConnection.OnInitialized.RemoveListener(OnPeerInitialized2);
	PeerConnection.OnShutdown.RemoveListener(OnPeerUninitializing2);
}

// PeerConnection初始化成功回调
private void OnPeerInitialized2()
{
	Debug.Log("*** OnPeerInitialized2()");
}

// PeerConnection关闭回调
private void OnPeerUninitializing2()
{
	Debug.Log("*** OnPeerUninitializing2()");
}  

如果需要自定义与信令服务器通信,继承Signaler后,建议重写Signaler的Update()方法。

protected override void Update()
{
	//修改:这里改成每帧执行一个函数
	if (_mainThreadWorkQueue.TryDequeue(out Action action))
	{
		action();
	}
}
 

WebcamSource.cs

此类控制摄像头。

protected async void OnEnable()
{
	//省略......
	try
	{
		var source = await DeviceVideoTrackSource.CreateAsync(deviceConfig);
		//此方法会启动本地摄像头
		AttachSource(source);
	}
	catch (Exception ex)
	{
		Debug.LogError($"Failed to create device track source for {nameof(WebcamSource)} component '{name}'.");
		Debug.LogException(ex, this);
		return;
	}
	//省略......
}

protected void OnDisable()
{
	//关闭摄像头
	DisposeSource();
} 
注意   数据通道(DataChannel)需要在调用CreateOffer()之前创建。通过 Unity Package Manager 导入的 MixedReality-WebRTC 没提供数据通道(DataChannel)。

标签: Unity3d

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号