Page 304 - Web性能权威指南
P. 304

pc.addstream(evt.stream);
                       var local_video = document.getElementById('local_video');
                       local_video.src = window.URL.createObjectURL(evt.stream);

                       pc.createAnswer(function(answer) { ➌
                         pc.setLocalDescription(answer);
                         signalingChannel.send(answer.sdp);
                       });
                     }

                     pc.onicecandidate = function(evt) {
                       if (evt.candidate) {
                         signalingChannel.send(evt.candidate);
                       }
                     }
                     pc.onaddstream = function (evt) {
                       var remote_video = document.getElementById('remote_video');
                       remote_video.src = window.URL.createObjectURL(evt.stream);
                     }
                     function logError() { ... }
                   </script>
               ➊ 监听并处理通过发信通道交付的远程提议
               ➋ 注册远程 ICE 候选项以开始连接检查
               ➌ 生成描述端连接的 SDP 应答并发送到对端

               毫不奇怪,连代码看起来都十分相似。除了基于由共享的发信通道交付的提议消息
               初始化端连接的工作流,唯一的重要区别就在于前面的代码生成的是一个 SDP 应
               答(通过 createAnswer),而非提议对象。除此之外,整个过程是对称的:初始化
               端连接,取得并注册媒体流,发送应答,增量提交 ICE 候选项,最后输出取得的媒
               体流。

               既然是这样,我们只要复制这些代码,再加上发信通道的实现,就有了一个在浏览
               器中实时的、端到端的、支持视频和音频的视频会议应用。想一想,只需 100 行
               JavaScript 代码,不错啦!


                              通过 SimpleWebRTC 初始化 WebRTC 会话

                实践中,前面的代码还可以进一步简化。我们这个例子是以手工方式把所有工作
                串接起来的,但实际上,没有理由不把其中大多数代码封装到一个库里。就举一
                个使用 simpleWebRTC 库的例子吧:






               294   |   第 18 章
   299   300   301   302   303   304   305   306   307   308   309