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

添加本地媒体轨道

现在已初始化p2p连接,根据使用情况,有两种可能的路径:

  • 立即将本地音频和/或视频轨道添加到对等方连接,以便在与远程对等方建立连接时立即可用。
  • 等待建立连接,然后添加本地媒体轨道。

第一种情况是有益的,因为在建立连接的过程中将立即协商媒体轨道,而无需专门针对轨道的额外协商。但是,需要事先知道使用了轨道。相反,后一种情况对应于类似后期加入的场景,在这种情况下,用户或应用程序可以控制何时添加或删除本地轨道,但代价是每次轨道列表更改时都需要进行额外的网络协商。

在本教程中,为简单起见,我们立即添加了本地媒体轨道。

继续编辑Program.cs文件并添加以下内容:在Main方法开始时,在try块之前创建一些我们需要的变量:

AudioTrackSource microphoneSource = null; 
VideoTrackSource webcamSource = null; 
Transceiver audioTransceiver = null; 
Transceiver videoTransceiver = null; 
LocalAudioTrack localAudioTrack = null;
LocalVideoTrack localVideoTrack = null;

使用该DeviceVideoTrackSource.CreateAsync()方法创建新的视频轨道源,以从本地视频捕获设备(网络摄像头)获取其帧。

webcamSource = await DeviceVideoTrackSource.CreateAsync();

此方法可以选择使用一个LocalVideoDeviceInitConfig对象来配置视频捕获。在本教程中,我们将忽略该对象并使用默认设置,这将打开第一个可用的具有默认分辨率和帧速率的网络摄像头。尽管在HoloLens这样的移动设备上,开发人员可能希望限制捕获分辨率和帧速率以减少功耗并节省电池,但这通常是可以接受的。视频轨道源是一个独立的对象,可由多个轨道使用,包括来自不同对等连接的轨道。这允许在多个连接之间共享本地网络摄像头。

从此源创建一个本地视频轨道,该轨道会将这些捕获的帧发送到远程对等方。

var videoTrackConfig = new LocalVideoTrackInitConfig { trackName = "webcam_track" }; 
localVideoTrack = LocalVideoTrack.CreateFromSource(webcamSource, videoTrackConfig); 

请注意,创建的本地视频轨道尚未与对等连接关联。这LocalVideoTrack.CreateFromSource()是一个静态方法,不引用任何对等连接。当添加到视频收发器时,本地视频轨道将在以后绑定到一个特定的对等连接。此后,即使从其收发器分离,它也将隐式绑定到该对等连接,并且不能与其他对等连接重用。

使用该DeviceAudioTrackSource.CreateAsync()方法创建音频轨道源,以从本地音频捕获设备(麦克风)获取其音频帧。

microphoneSource = await DeviceAudioTrackSource.CreateAsync(); 

同样,该方法可以选择带LocalAudioDeviceInitConfig对象来配置音频捕获,但是我们可以忽略它以获取默认设置。

使用该LocalAudioTrack.CreateFromSource()方法创建音频轨道,将这些音频帧发送到远程对等方。

var audioTrackConfig = new LocalAudioTrackInitConfig { trackName = "microphone_track" }; 
localAudioTrack = LocalAudioTrack.CreateFromSource(microphoneSource, audioTrackConfig);

使用该PeerConnection.AddTransceiver()方法将一些音频和视频收发器添加到对等方连接,这些收发器是将音频和视频轨道发送到远程对等方的传输方式。

videoTransceiver = pc.AddTransceiver(MediaKind.Video); 
videoTransceiver.LocalVideoTrack = localVideoTrack; 
videoTransceiver.DesiredDirection = Transceiver.Direction.SendReceive; 
audioTransceiver = pc.AddTransceiver(MediaKind.Audio); 
audioTransceiver.LocalAudioTrack = localAudioTrack; audioTransceiver.DesiredDirection = Transceiver.Direction.SendReceive; 

这将本地媒体轨道永久绑定到对等连接,并指示本机实现在将这些轨道连接到收发器时使用这些轨道。这也要求为每个收发器协商双向传输(发送+接收),以便既发送本地捕获的音频和视频,又接收远程对等端将发送的音频和视频。

在程序的最后,在trycatch 块之外,请确保在关闭对等连接后处置音频和视频轨道以及源。音频和视频轨道及来源归用户所有,必须手动处置。媒体源还必须在使用它们时超出本地轨道,因此请确保最后处置它们。

localAudioTrack?.Dispose(); 
localVideoTrack?.Dispose(); 
microphoneSource?.Dispose(); 
webcamSource?.Dispose();

再次运行该应用程序。这次,终端窗口没有可见的区别,只是打开音频和视频设备有一些额外的延迟。此延迟的变化取决于主机上捕获设备的数量,但通常也在几秒钟之内。此外,如果网络摄像头或麦克风的LED指示正在记录,则应在捕获设备开始记录时将其短暂打开,并在程序到达末尾并且对等连接及其音轨自动关闭时立即停止。

再次运行该应用程序。这次,终端窗口没有可见的区别,只是打开音频和视频设备有一些额外的延迟。此延迟的变化取决于主机上捕获设备的数量,但通常也在几秒钟之内。此外,如果网络摄像头或麦克风的LED指示正在记录,则应在捕获设备开始记录时将其短暂打开,并在程序到达末尾并且对等连接及其音轨自动关闭时立即停止。

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

原创文章,作者:游戏开发极客,如若转载,请注明出处:https://hololens2.cn/2020/09/21/hololens2-%e5%9f%ba%e4%ba%8eweb-rtc%e7%9a%84%e8%bf%9c%e7%a8%8b%e5%bc%80%e5%8f%91%ef%bc%885%ef%bc%89/

发表评论

电子邮件地址不会被公开。 必填项已用*标注