HoloLens2 基于Web RTC的远程开发(7)

建立WebRTC连接

现在已经有了信令解决方案,最后一步是建立对等连接。

继续编辑Program.cs文件并添加以下内容:

为了调试目的,并了解连接的状态,请将ConnectedIceStateChanged事件连接到将消息打印到控制台的处理程序。

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对等连接。

HoloLens2 基于Web RTC的远程开发(7)

如果启动时带有音频或视频捕获标志,则捕获器实例会记录这些媒体,并通过网络将它们发送到另一个实例,后者会调用远程帧回调并每60帧打印一条消息。之后,您可以按任意键停止每个实例。信号器和对等连接将关闭,程序将终止。

HoloLens2 基于Web RTC的远程开发(7)

原创文章,作者:游戏开发极客,如若转载,请注明出处:https://hololens2.cn/2020/09/23/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
    holochang 2020年9月26日 下午3:32

    你好,请问这个在局域网内测试通过,但是把服务器放公网,然后两个眼镜分别处于不同的网络下,通讯失败这个情况有遇到过吗?

    • 游戏开发极客
      游戏开发极客 2020年9月27日 下午9:54

      @holochang在公网设置服务器的话需要独立的域名来配置,可以参考下其他webrtc的文章,我在hololens1带的时候做过一个版本,按照另外的教程来做的。