建立WebRTC连接
现在已经有了信令解决方案,最后一步是建立对等连接。
继续编辑Program.cs
文件并添加以下内容:
为了调试目的,并了解连接的状态,请将Connected
和IceStateChanged
事件连接到将消息打印到控制台的处理程序。
pc.Connected += () => { Console.WriteLine("PeerConnection: connected."); };
pc.IceStateChanged += (IceConnectionState newState) => { Console.WriteLine($"ICE state: {newState}"); };
Connected
建立对等连接时将调用该事件。在IceStateChanged
每个ICE状态改变时被调用。请注意,Connected
可以在ICE状态达到其IceConnectionState.Connected
状态之前调用该事件。
为了验证是否收到了远程视频,我们还订阅了该I420AVideoFrameReady
事件。由于此事件被频繁调用,因此我们仅每60帧打印一条消息。
int numFrames = 0;
pc.VideoTrackAdded += (RemoteVideoTrack track) => {
track.I420AVideoFrameReady += (I420AVideoFrame frame) => {
++numFrames; if (numFrames % 60 == 0) { Console.WriteLine($"Received video frames: {numFrames}"); }
}; };
要建立WebRTC连接,一个对等方(呼叫方)必须呼叫CreateOffer()
,但不能同时呼叫两者(被呼叫方只是等待)。由于信号器实现NamedPipeSignaler
已经提供了区分两个对等方的方法,因此我们使用该信息来选择哪个对等方将自动发起呼叫。
if (signaler.IsClient) { Console.WriteLine("Connecting to remote peer..."); pc.CreateOffer(); }
else { Console.WriteLine("Waiting for offer from remote peer..."); }
在这种状态下,应用程序正在运行,但是一旦建立对等连接,应用程序将立即终止。为避免这种情况,只需等到用户按下一个键,然后关闭信号器即可。
Console.WriteLine("Press a key to terminate the application...");
Console.ReadKey(true);
signaler.Stop();
Console.WriteLine("Program termined.");
再次运行该应用程序的两个实例。这次,两个终端都打印大量与SDP和ICE消息交换有关的消息,并最终建立WebRTC对等连接。
如果启动时带有音频或视频捕获标志,则捕获器实例会记录这些媒体,并通过网络将它们发送到另一个实例,后者会调用远程帧回调并每60帧打印一条消息。之后,您可以按任意键停止每个实例。信号器和对等连接将关闭,程序将终止。
原创文章,作者:游戏开发极客,如若转载,请注明出处:https://hololens2.cn/hololens2-%e5%9f%ba%e4%ba%8eweb-rtc%e7%9a%84%e8%bf%9c%e7%a8%8b%e5%bc%80%e5%8f%917/
评论列表(2条)
你好,请问这个在局域网内测试通过,但是把服务器放公网,然后两个眼镜分别处于不同的网络下,通讯失败这个情况有遇到过吗?
@holochang:在公网设置服务器的话需要独立的域名来配置,可以参考下其他webrtc的文章,我在hololens1带的时候做过一个版本,按照另外的教程来做的。