anyRtc 实时视频通话

Demo代码地址贴在最后面

业务背景:

中台管理系统与前台实时视频通话,不同源

业务需求:

  1. 中台向选定用户(前台)发起视频通话
  2. 前台接收视频邀请,选择是否加入视频通话
  3. 只能由中台向前台发送视频通话邀请
  4. 双方都能主动离开房间

实现逻辑

发布频道

加入(join)指定的房间/频道(channel),创建各自的音频视频轨道(videoTrack/videoTrack),并发布(public)到房间中

anyRtc实例化
后台
加入房间
创建后台轨道
发布各自的轨道到房间
用户
创建用户轨道

监听频道的发布

在各自的房间中监听(user-published)对方是否发布音频视频轨道,是的话就播放(play)到指定的元素中

后台发布轨道到房间
监听用户是否发布轨道到房间
播放用户的视频音频流数据到指定元素
用户发布轨道到房间
监听后台是否发布轨道
播放后台的视频音频流数据到指定元素

用户接收视频通用邀请逻辑

用户在加入到房间后,通过监听后台是否发布轨道,来表示后台是否发布了视频邀请

用户
加入房间
监听后台是否发布视频音频轨道
提示后台发起视频通话邀请

离开房间

离开(leave)房间前,先释放视频音频轨道后再离开,否则视频音频轨道会一直开启导致资源浪费

anyRtc简介

anyRTC可实现一对一单聊、多人群聊,同时具备纯语音通话和视频通话功能。也可以实现一对一、多对多的音视频互动直播

  • 视频通话,不分主播和观众,所有用户都可自由发言,默认流畅和低延时优先,画质稍低,典型场景如多人视频会议。
  • 互动直播,用户区分主播和观众,只有主播可以自由发言,默认高画质优先,典型场景如互动课堂。

视频通话 SDK,不区分用户角色,进入同一个频道即可发布自己的音视频流并自动订阅其他用户的音视频流。

安装 SDK

你可以通过如下几种方式获取最新的 SDK:

  • 官网下载中心找到 「RTC SDK 下载」 的 Web 端
  • 前往阿里云 OSSctrl + scommand + s 下载
  • 前往 github cloneDownload ZIP 下载
  • 通过 npm 市场下载

本文使用 npm 引入

npm i ar-rtc-sdk

导入 SDK

导入 SDK 支持以下方式:

  • script 标签引入

    使用 <script> 标签引入的 SDK ,window 对象中会暴露一个 ArRTC 的全局变量。

    <script src="/<YOUR_PATH>/to/ArRTC@latest.js"></script>
    
  • ES6 方式引入

    import ArRTC from '/<YOUR_PATH>/to/ArRTC@latest.js';
    
  • CommonJS 方式引入

    var ArRTC = require('/<YOUR_PATH>/to/ArRTC@latest.js');
    
  • npm 方式引入(本文使用的方式)

    // ES6
    import ArRTC from 'ar-rtc-sdk';
    // 或者是 commonJS
    var ArRTC = require('ar-rtc-sdk');
    

初始化

通过 ArRTC.createClient 创建本地客户端 rtcClient 的实例。

const rtcClient = ArRTC.createClient({ mode: "live", codec: "h264" });

核心api

加入房间

加入一个指定的房间,用户在加入房间后才能发布本地的音频视频轨道

const { appid, channel, token, uid } = params
this.rtcClient.join(appid, channel, token, uid)
.then(_ => {
  console.log('加入房间成功回调')
})
.catch(err => {
  console.error('加入房间失败回调', err)
})

params 参数说明:

  • appid: 在控制台创建项目并获取App ID,使用相同 App ID的应用才能互相通信。获取App ID 官方文档
  • channel:房间/频道名字,可以和用户一起约定,也可以由后端生成统一的房间名。
  • token: 是一种动态密钥,通过 App ID、权限密钥、用户名和 Token 有效时间戳等参数生成,安全性较高。在正式生产环境等对安全要求较高的场景中,我们推荐使用 RTC Token 鉴权获取Token 官方文档
  • uid: 用于确定用户的唯一标识,也是生成用户对应 token 的参数。

创建本地音频视频轨道

创建本地的视频音频流,可以对该流进行播放也可以把该流数据推送到远端(前提:已经加入某一个房间)

视频轨道

/**
 * 通过摄像头采集的视频创建一个视频轨道。
 * @params config 配置指定文件路径、缓存策略和编码配置 详情请见 CameraVideoTrackInitConfig
 * @params videoTrack 本地摄像头视频轨道 详情请见返回值 CameraVideoTrack
 */
ArRTC.createCameraVideoTrack(config).then((videoTrack) => {
  this.videoTrack = videoTrack
});

音频轨道

/**
 * 创建一个自定义的音频轨道
 * @params config 自定义音频的配置 详情请见 CustomAudioTrackInitConfig
 * @params audioTrack 自定义的音频轨道 详情请见返回值 LocalAudioTrack
 */
ArRTC.createCustomAudioTrack(config).then((audioTrack) => {
  this.audioTrack = audioTrack
});

同步创建

/**
 * 同时创建麦克风音频轨道和摄像头视频轨道。
 * @params audioConfig 采集音频的配置,包括采集设备、编码配置等 详情请见 MicrophoneAudioTrackInitConfig
 * @params videoConfig 采集视频的配置,包括采集设备、编码配置等 详情请见 CameraVideoTrackInitConfig
 * @params audioTrack 本地麦克风音频轨道 详情请见返回值 MicrophoneAudioTrack
 * @params videoTrack 本地摄像头视频轨道 详情请见返回值 CameraVideoTrack
 */
ArRTC.createMicrophoneAndCameraTracks(audioConfig, videoConfig).then(([audioTrack, videoTrack]) => {
  this.videoTrack = videoTrack
  this.audioTrack = audioTrack
});

发布本地的音频视频轨道

把已经创建好的音频视频轨道流推送到房间里,等待房间里的其他用户接收

this.rtcClient.publish([this.videoTrack, this.audioTrack])
  .then((uid) => {
    // 发布成功
  })
  .catch(err => {
    // 发布失败
  })

注意: 发布的轨道之前必须加入房间。发布的轨道如果被主动释放(close),需要执行取消发布操作。

监听对方发布的音频视频流轨道数据

this.rtcClient.on('user-published', async(user, mediaType) => {
    console.log('用户发布音频视频流轨道数据')
    // 订阅远端用户的音视频轨道
    await this.rtcClient.subscribe(user, mediaType)
    // 保存对应的视频音频流对象
    if (mediaType === 'video') {
      this.remoteVideoTrack = user.videoTrack
    }
    if (mediaType === 'audio') {
      this.remoteAudioTrack = user.audioTrack
    }
})

播放视频音频源

本地

使用本地创建的音频视频流播放到指定的标签内,视频需要传入标签的id,音频不需要

this.videoTrack.play('elementId')
this.audioTrack.play()

远程

通过监听远程用户是否发布轨道到房间中,拿到的音频视频对象来播放视频音频流到指定的标签内,同理视频需要传入标签的id,音频不需要

this.remoteVideoTrack.play('elementId')
this.remoteAudioTrack.play()

离开房间

离开房间前需要释放自己的视频音频轨道,否则资源不会自己释放

this.audioTrack.close() // 释放音频设备
this.videoTrack.close() // 释放视频设备
this.rtcClient.leave()

其余API

一些不重要的API请看demo代码里的注释或者官方文档

源码

https://github.com/W1ping/anyRtcMixin

官方文档

anyRtc视频通话:https://docs.anyrtc.io/cn/Video/product_video

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值