0.3.9 • Published 2 years ago

usc-rtc-sdk v0.3.9

Weekly downloads
-
License
ISC
Repository
-
Last release
2 years ago

音视频通话 webrtc sdk开发手册

更新日志

version 0.3.9 (2022-07-01)

  • RtcInviteStatus增加创建会话失败的状态码,notAllowedMedia(415),表示当前主动呼叫的媒体流是不合法的,目前版本的webrtc的媒体服务器,要求至少包含一个音频媒体

version 0.3.7 (2022-06-24)

  • 全局导出增加authDevice,此方法为工具类型的方法,用以向用户申请摄像头与麦克风设备的使用权限,也可以通过navigator.mediaDevices.getUserMedia({ audio: true, video: true })来自行向浏览器申请相关权限

version 0.3.5 (2022-06-17)

  • 增加环境噪音控制与回音消除支持
  • RtcSession 与 RtcCalledSession 上增加了videoConstrains与audioConstrants,在获取本地流媒体之前进行设置可以用来约束流媒体,如帧率,视频的宽高等

version 0.3.4 (2022-06-14)

  • RtcCalledSession增加字段callType 标识当前被叫的类型,类型值为RtcCalledType

version 0.3.0 (2022-05-17)

  • 删除RtcClient中createVideoCall与createAudioCall两个方法,使用createSession代替,原先的接口在名称上区分了会话的类型,但是在实际创建会话之后,并不能代表最终会话的实际类型,因为在session的api中是可以选择输入源的类型的,所以对api进行了语义上的重制
  • 删除RtcSession中switchToUserMedia以及switchToDeviceMedia接口
  • RtcSession中增加useAudio,useDeviceVideo,useDeskTopVideo以代替上述删除接口,具体接口描述参照下方接口文档
  • RtcSession中删除了renderLocalStreamToVideoContainer的方法,增加了renderLocalStreamToContainer,不在局限于只能在video中进行播放,audio也加入了支持
  • RtcSession中增加了renderStreamToContainer 和releaseStreamFromContainer的方法,可以便捷的播放媒体流与释放媒体流
  • 全局导出模块中增加renderStreamToContainer(stream,container:HTMLVideoElement|HTMLAudioElement) 和 releaseStreamFromContainer(container:HTMLVideoElement|HTMLAudioElement) ,用以简化操作

1.安装

//使用yarn安装 
yarn add usc-rtc-sdk
//使用npm安装
npm install usc-rtc-sdk

2.简单使用demo

//用户A,演示主叫端的逻辑
import { RtcClient, createRtcClient, RtcSessionEvent, RtcClientEvent } from "usc-rtc-sdk"
const startClientA = async () => {
    //初始化一个webrtc的sdk客户端,这里的本地号码是7001,server对应的是信令服务器地址由线下对接进行提供
    let client  = await createRtcClient({ server: "xxxxxxx", localNumber: "7001" })
    //创建一个针对于7002的视频会话
    let session = client.createSession("7002")
    //这里演示给会话注册一个接受到远端视频流的事件监听
    session.on(RtcSessionEvent.stream, (data) => {
        //data 的stream 属性就是视频流信息,你可以像下面这样把他放到一个视频容器下进行播放
        let playerContainer = document.getElementById("player")
        playerContainer.srcObject = data.stream
        playerContainer.play()
    })
    //给会话注册断开事件,
    session.on(RtcSessionEvent.bye, () => alert("BYE!!!!!!"))
    //给会话选择本端所提供的流,这里使用的是摄像头的流信息
    await session.useDefaultDevice(document.getElementById("localPalyer") as HTMLVideoElement)
    //开始呼叫
    session.start()
}
startClientA()


//====================================
//用户B,演示被叫端的逻辑
const startClientB = async (client: RtcClient) => {
     //初始化一个webrtc的sdk客户端,这里的本地号码是7021,server对应的是信令服务器地址由线下对接进行提供
    let client  = await createRtcClient({ server: "xxxxxxx", localNumber: "7002" })
    //给客户端注册一个接收到视频通话邀请的事件监听
    client.on(RtcClientEvent.invite, async (session) => {
        //注册接受到远端流信息的事件监听
        session.on(RtcSessionEvent.stream, (data: any) => {
            //播放流信息的代码,如上面的主叫端一样
        })
        ////给会话注册断开事件,
        session.on(RtcSessionEvent.bye, () => alert("BYE!!!!!!"))
        //给会话选择本端所提供的流,这里使用的是摄像头的流信息
        await session.useDefaultDevice(document.getElementById("localPalyer") as HTMLVideoElement);
        //接受会话
        await session.acceptCall();
    })
}
startClientB()

3.sdk说明

此项目为typescript项目,按照npm的约定生成了type描述文件,具体api说明请在type描述文件中进行查看,以下是一些重要的Api说明:

1.createRtcClient

此方法用来创建一个webrtc的终端,内部已经封装了心跳,信令交互,以及视频处理的逻辑,api描述如下:

declare const createRtcClient: (config: {
    server: string; //信令服务器的地址
    localNumber: string; //自己的号码
    heartTime?: number; //向信令服务器的发送心跳的间隔时间,默认是30s
    expireTime?: number; //注册信令的过期时间,默认是60s
}) => Promise<RtcClient>; //注意,这里返回的是Promise的对象,resolve前置是在创建websocket链接之后发送一次心跳信息,等待服务器返回确认信息

使用事例:

import { createRtcClient } from "usc-rtc-sdk"
let client  = await createRtcClient({server:"wss://xxxxxx.com/",localNumber:"7001"})

2.RtcClient

RtcClient是用来实例化webrtc终端的对象,内部主要方法如下

  • createSession(remoteNumber?: string): RtcSession 用来来创建一个会话
  • destory() 销毁客户端,会销毁所有创建的会话以及断开与信令服务器的链接,与信令服务器断开链接之后也会自动触发此方法
  • reConnect() 重新连接信令服务器,如果之前处于连接状态会自动调用destory的方法
  • on(event:RtcClientEvent,cb:Function) 注册相关监听事件

事例代码:

import { createRtcClient,RtcClientEvent,RtcSession,RtcCalledSession } from "usc-rtc-sdk"
let client  = await createRtcClient({server:"wss://xxxxxx.com/",localNumber:"7001"})
let session:RtcSession = client.createSession("7002")
client.on(RtcClientEvent.invite,(calledSession:RtcCalledSession)=>{})

3.RtcClientEvent

RtcClientEvent 表示底层封装向上抛出的一些业务与非业务的生命周期事件,具体如下

  • connected 信令服务器连接成功事件
  • disconnected 信令服务器断开事件,连接失败这里也可以触发
  • invite 收到音视频通话邀请的事件

事例代码

import { createRtcClient , RtcClientEvent,RtcCalledSession } from "usc-rtc-sdk"
let client  = await createRtcClient({server:"wss://xxxxxx.com/",localNumber:"7001"})

client.on(RtcClientEvent.disconnected,()=>{
    console.log("socket is closed")
})

client.on(RtcClientEvent.invite,(session:RtcCalledSession)=>{
    console.log("revice invite,do something plz...")
})

4.RtcSession

RtcSession是用来实例化RtcClient所创建的音视频会话的对象,内部主要方法如下

  • addRemote(remoteNumber: string) 修改需要呼叫的用户
  • rejectCall() 拒绝邀请,使用于创建会话过程中的会议类型变更
  • acceptCall() 接受邀请,使用于创建会话过程中的会议类型变更
  • start() 开始呼叫
  • destory() 销毁会话,如果呼叫已经开始,会先向被叫端发送bye请求
  • getAllInputResource() 获取所有的音视频输入源
  • useDefaultDevice(container: HTMLVideoElement) 使用默认的本地音视频输入设备(麦克风与摄像头),并将本地的流媒体渲染到对应的video上(可以不传),实际上是下面几个方法的组合使用
  • useAudio(deviceId) 使用对应deviceId的麦克风设备作为音频流,如果deviceId为undefined,那么使用默认的设备作为音频源
  • useDeviceVideo(deviceId) 使用对应deviceid摄像头设备的视频流,如果deviceId为undefined,那么使用默认的设备作为视频源
  • useDeskTopVideo() 使用桌面流作为视频流输入
  • disableAudio() 禁用本地流的音频输入,本地音频静音
  • disableVideo() 禁用本地流的视频输入,关闭本地视频画面
  • enableAudio() 启用本地音频输入
  • enableVideo() 启用本地视频输入
  • renderLocalStreamToContainer(container:HTMLVideoElement|HTMLAudioElement) 将本地的流媒体使用对应的video或者audio元素进行播放
  • on(event:RtcSessionEvent,cb:Function) 注册相关监听事件
  • addDeviceChangeListener(listener) 注册物理输入设备变化监听事件,如摄像头拔线之类的操作
  • removeDeviceChangeListener(listener) 删除物理输入设备变化监听事件(组件化的框架如react之类的,在组件销毁的时候使用这个方法进行回收)

事例代码

...
session.addRemote("7003")
await session.useDefaultDevice(document.getElementById("localplayer"))
session.start()

5.RtcCalledSession

RtcCalledSession是用来实例化被叫会话的对象,主要方法如下

  • getRemoteNumber() 获取呼叫自己的远端号码
  • rejectCall() 拒绝邀请,使用于创建会话与会话过程中的会议类型变更
  • acceptCall() 接受邀请,使用于创建会话与会话过程中的会议类型变更
  • destory() 销毁会话,如果呼叫已经开始,会先向被叫端发送bye请求
  • getAllInputResource() 获取所有的音视频输入源
  • useDefaultDevice(container: HTMLVideoElement) 使用默认的本地音视频输入设备(麦克风与摄像头),并将本地的流媒体渲染到对应的video上(可以不传),实际上是下面几个方法的组合使用
  • useAudio(deviceId) 使用对应deviceId的麦克风设备作为音频流,如果deviceId为undefined,那么使用默认的设备作为音频源
  • useDeviceVideo(deviceId) 使用对应deviceid摄像头设备的视频流,如果deviceId为undefined,那么使用默认的设备作为视频源
  • useDeskTopVideo() 使用桌面流作为视频流输入
  • disableAudio() 禁用本地流的音频输入,本地音频静音
  • disableVideo() 禁用本地流的视频输入,关闭本地视频画面
  • enableAudio() 启用本地音频输入
  • enableVideo() 启用本地视频输入
  • renderLocalStreamToContainer(container:HTMLVideoElement|HTMLAudioElement) 将本地的流媒体使用对应的video或者audio元素进行播放
  • on(event:RtcSessionEvent,cb:Function) 注册相关监听事件
  • addDeviceChangeListener(listener) 注册物理输入设备变化监听事件,如摄像头拔线之类的操作
  • removeDeviceChangeListener(listener) 删除物理输入设备变化监听事件(组件化的框架如react之类的,在组件销毁的时候使用这个方法进行回收

事例代码

...
client.on(RtcClientEvent.invite,async (session:RtcCalledSession)=>{
    await session.useDefaultDevice(document.getElementById("localplayer"))
    session.acceptCall()
})

6.RtcSessionEvent

会话流程事件

  • bye 会话结束事件
  • stream 会话收到流的事件
  • localAudioChange 本地音频流设备发生了变化
  • localVideoChange 本地视频流设备发生了变化
  • reInvite 会话过程中修改会话类型会重新发invite 比如原先只是语音通话,然后变成视频会话
  • localStreamChange 本地流发生了变化

事例代码

...
session.on(RtcSessionEvent.stream,({audioOnly,stream})=>{
    if(audioOnly){
        //use audio to play
    }else{
        let playerContainer = document.getElementById("player")
        playerContainer.srcObject = data.stream
        playerContainer.remoteVideoContainer.play()
    }
})
...
session.on(RtcSessionEvent.bye,()=>{
    //close something
    alert("bye")
})

4.限制

  • 1.目前仅做了chrome浏览器的兼容支持,要求chrome内核版本在90以上
  • 2.webrtc接口调用的页面需要依赖https环境(本地地址如localhost,127.0.0.1除外),页面运行环境如果无法提供支持,请在chrome的unsafely-treat-insecure中添加白名单来让页面支持webrtc(chrome 浏览器打开chrome://flags/#unsafely-treat-insecure-origin-as-secure,在Insecure origins treated as secure下面的输入框中添加您的网页地址,选择右边的enable,重启浏览器生效)
0.3.9

2 years ago

0.3.6

2 years ago

0.3.5

2 years ago

0.3.8

2 years ago

0.3.7

2 years ago

0.3.2

2 years ago

0.3.1

2 years ago

0.3.4

2 years ago

0.3.3

2 years ago

0.1.10

2 years ago

0.2.1

2 years ago

0.1.8

2 years ago

0.1.9

2 years ago

0.2.3

2 years ago

0.2.2

2 years ago

0.2.4

2 years ago

0.1.2

2 years ago

0.1.1

2 years ago

0.0.9

2 years ago

0.1.7

2 years ago

0.0.8

2 years ago

0.1.4

2 years ago

0.1.6

2 years ago

0.0.7

2 years ago

0.1.5

2 years ago

0.0.6

2 years ago

0.0.5

2 years ago

0.0.4

2 years ago

0.0.3

2 years ago

0.0.2

2 years ago

0.0.1

2 years ago

1.0.0

2 years ago