仿微信实战项目(三)简单封装 WebRTC

430 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

阅读本文大约需要 6 分钟

前言

本文将从以下几个方面聊下项目中如何使用 WebRTC 的。

  1. 兼容性问题:我的目标是 PC端 和 手机端 均能使用该功能
  2. 易用性:WebRTC API 直接用起来略显繁琐,我会搞一个类似于 建造者模式 的方式,不用深入理解 Peerconnection、Candidate,只需关注实现层面即可

兼容性问题

关于兼容性,官方推荐的 adapter.js 就能满足。 使用起来也很简单,只需要 install 库之后

import adapter from 'webrtc-adapter';

是的,只要 import 进来之后,就什么都不需要做了。可以理解为:它已经重写了你要用到的所有方法,在你调用时自动做了兼容。

易用性

实际应用中,我并不关心 WebRTC API 中的什么 CreateOffer,setDescription 等。

我更希望只需要简单的配置,调用一个 start 就能完成音视频通话。 所以我封装了一个 webrtc.peerconnection.ts,基本的使用方法就是:

  1. new 一个实例
  2. 参数设置(最基本的参数:设置为音频、还是视频)
  3. 调用 create 方法,表示参数设置完毕,可以开始了
  4. 拿到 sdp,发送给对端
  5. 收到 candidate 回调,发送给对方
  6. 杀青
async function startVideo() {
  // 新建一个实例
  const videoPC = new PeerConnectionCreater()
  // 设置音频,还是视频
  videoPC.setTrackOrKind('video')
  // 添加三个回调
  videoPC.onIceCandidate((candidate) => {
    // 拿到本地的接收 candidate,发送给对方
    if (candidate) {
      sendCandidate(candidate)
    }
  })
  videoPC.onTrack((e) => {
    // 接收到对方的流,用来显示对方音、视频
  })
  // 此回调可有可无
  videoPC.onStateChange((iceGatheringState: RTCIceGatheringState) => {
    if (iceGatheringState === 'complete') {
      // 这一趴结束,恭喜杀青
      console.log('create over')
    }
  })
  const sdp = await videoPC.create()
  sendSDP(sdp)
}

至于视频分辨率、码率等参数,都可以在调用 create 方法之前预置好。

其他

项目中,webrtc 相关的操作,目前一共封装了三个文件

文件名功能说明
webrtc.device-control.ts操作外设,如外接的麦克风、摄像头等
webrtc.stream.ts操作流,如获取流,释放流,设置流“静音”
webrtc.peerconnection.ts音视频通话相关

后续会不断完善其功能,并附上详细的使用说明文档

源码地址为 gitee.com/bigflowerfa…