RtcEngine
Constructor
+ new RtcEngine(appId
: string): RtcEngine
构造函数
Parameters:
▪ appId: string
appId
Returns: RtcEngine
+ new RtcEngine(config
: object): RtcEngine
构造函数
Parameters:
▪ config: {appId: string, rtcServer: string}
Returns: RtcEngine
Methods
getCams
▸ getCams(successCb
: function, failCb
: function): void
获取摄像头设备列表
Parameters:
▪ successCb: function
成功回调,回调入参是获取到的设备列表
▸ (devices
: MediaDeviceInfo[]): any
Parameters:
Name | Type |
---|---|
devices | MediaDeviceInfo[] |
▪ failCb: function
失败回调,回调入参是捕获的异常
▸ (error
: any): any
Parameters:
Name | Type |
---|---|
error | any |
Returns: void
getMics
▸ getMics(successCb
: function, failCb
: function): void
获取 mic 列表
Parameters:
▪ successCb: function
成功回调,回调入参是获取到的设备列表
▸ (devices
: MediaDeviceInfo[]): any
Parameters:
Name | Type |
---|---|
devices | MediaDeviceInfo[] |
▪ failCb: function
失败回调,回调入参是捕获的异常
▸ (error
: any): any
Parameters:
Name | Type |
---|---|
error | any |
Returns: void
getSdkVersion
▸ getSdkVersion(): string
返回 PANO SDK 的版本信息
Returns: string
checkEnvRequirement
▸ checkEnvRequirement(): boolean
检测当前浏览器环境是否支持PANO SDK。我们没有进行浏览器版本的全量测试,
理论上支持Chromium内核的非Chrome浏览器,例如新版Edge浏览器和QQ浏览器等,如果在这些浏览器中检测返回false
,您可以尝试调用PANO SDK。
Returns: boolean
getSpeakers
▸ getSpeakers(successCb
: function, failCb
: function): void
获取 speaker 设备列表
Parameters:
▪ successCb: function
成功回调,回调入参是获取到的设备列表
▸ (devices
: MediaDeviceInfo[]): any
Parameters:
Name | Type |
---|---|
devices | MediaDeviceInfo[] |
▪ failCb: function
失败回调,回调入参是捕获的异常
▸ (error
: any): any
Parameters:
Name | Type |
---|---|
error | any |
Returns: void
getWhiteboard
▸ getWhiteboard(): RtcWhiteboard
获取白板控制接口
Returns: RtcWhiteboard
joinChannel
▸ joinChannel(channelParam
: object, optionalConfig
: object): QResult
加入频道
Parameters:
▪ channelParam: object
join channel 参数
Name | Type | Description |
---|---|---|
channelId | string | 最大长度是128字节,频道ID只能由以下字符构成 "0-9", "a-z", "A-Z", 空格 (不能出现在首部和尾部), "!", "#", "$", "%", "&", "(", ")", "+", ",", "-", ".", ":" ";", "<", "=", ">", "?", "@", "[", "]", "^", "_", "~" |
channelMode | channelMode | 1_on_1 或者 meeting |
token | string | App服务器向PANO获取的token |
userId | string | 应用定义的用户ID,string形式的数字,转换为数字后的范围不超过区间[1, 2^63 - 1] |
attendeeId | string | 与PSTN端绑定时的ID,string形式的数字,转换为数字后的范围不超过区间[1, 2^31 - 1] ,如果不需要绑定PSTN用户则可以不传 |
userName | string | 用户昵称 |
subscribeAudioAll | boolean | 是否自动订阅全部用户的音频。如果为true ,无需调用subscribeAudio 也可以接收所有人的音频,unsubscribeAudio 无法取消订阅音频;否则,由App开发者自行组织调用subscribeAudio 和unsubscribeAudio |
▪ optionalConfig: object
可选参数,用于指定 channel 的一些初始配置
Name | Type | Description |
---|---|---|
joinChannelType | JoinChannelType | joinChannel 时指定将要加入的channel类型,可以只开启音视频 channel,或者只开启白板 channel,或者两个都开启 |
Returns:
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。joinChannel
是异步过程,通过监听joinChannelConfirm获得最终joinChannel
结果。
leaveChannel
▸ leaveChannel(): QResult
离开频道
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
destroy
▸ destroy(): QResult
释放RtcEngine对象的资源
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
muteAudioPlayout
▸ muteAudioPlayout(): QResult
使接收的音频静音,若调用时当前音频播放已经被静音,则不产生影响
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
unmuteAudioPlayout
▸ unmuteAudioPlayout(): QResult
使接收的音频从静音中恢复播放,若调用此方法时音频播放正常,则不产生影响
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
setAudioPlayoutVolume
▸ setAudioPlayoutVolume(volume
: number): QResult
设置音频播放的音量
Parameter:
Name | Type | Description |
---|---|---|
volume | number | 范围是区间[0,1] |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
getAudioPlayoutVolume
▸ getAudioPlayoutVolume(): number
获取音频播放的音量
Returns: number
音量范围是区间[0,1]
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
muteMic
▸ muteMic(): QResult
将自己发布的音频静音。如果当前正在使用PSTN通话,那么PSTN通话也将被静音。
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
muteCam
▸ muteCam(): QResult
暂停视频,摄像头仍然采集,媒体连接仍然保持,发送的视频内容是全黑屏画面,适合临时停用视频的场景
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
muteScreen
▸ muteScreen(): QResult
暂停屏幕共享,可用于开启屏幕共享之后临时停止共享的场景
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
selectCam
▸ selectCam(deviceId
: string): QResult
选择摄像头
Parameters:
Name | Type | Description |
---|---|---|
deviceId | string | cam 设备id |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
selectMic
▸ selectMic(deviceId
: string): QResult
设置 mic
Parameters:
Name | Type | Description |
---|---|---|
deviceId | string | mic 设备id |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
selectSpeaker
▸ selectSpeaker(deviceId
: string): QResult
设置 speaker
Parameters:
Name | Type | Description |
---|---|---|
deviceId | string | speaker 设备id |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
sendFeedback
▸ sendFeedback(option
: object): QResult
发送用户反馈到到 PANO
Parameters:
▪ option: object
feedback 参数
Name | Type | Description |
---|---|---|
contact | string | 联系方式 |
description | string | 描述 |
extraInfo | string | 额外信息(可选) |
product | string | 产品名称 |
type | number | 问题类型,0: 通用;1:语音;2:视频;3:白板;4:屏幕共享 |
uploadLogs | boolean | 是否上传日志 |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
setRtsDelegate
▸ setRtsDelegate(rtsDelegate
: RtsDelegate): QResult
如果项目使用外部的RTS SDK,需要把RtsDelegate对象设置到RtcEngine对象,否则不需要使用该API
注意 如果App额外使用独立的 RTS(
@pano.video/panorts
)SDK joinChannel,RTC(@pano.video/panortc
)的joinChannelType应该选择mediaOnly
,同时使用RTS的RtsDelegate,即import { RtsDelegate } from '@pano.video/panorts';
rtcEngine.setRtsDelegate(new RtsDelegate())
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
callout
▸ callout(phoneNum
: string, isBind
: boolean): QResult
从SDK主动发起号码拨打
Parameters:
▪ phoneNum: string
呼叫的电话号码
isBind: boolean 是否绑定到自己。如果绑定到自己,那么其他用户看到我的audioCallType从VoIP改变为PSTN,如果不绑定到自己,那么其他用户看到新增一个用户,这个用户只有音频。
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
dropCall
▸ callout(phoneNum
: string): QResult
从SDK主动挂断电话
Parameters:
▪ phoneNum: string
将要挂断的电话号码,不限制号码是否绑定到自己或者自己主动拨打接通的情况
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
startAudio
▸ startAudio(): QResult
开启音频
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。startAudio
是异步过程,可以通过监听startAudioTimeout获得最终startAudio
的失败结果。
stopAudio
▸ stopAudio(): QResult
停止音频
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
startScreen
▸ startScreen(constraints
: object): QResult
开启屏幕共享,在加入频道成功后可以调用
Parameters:
▪ constraints: object
开启屏幕共享的参数
Name | Type | Description |
---|---|---|
audio | boolean | 可选,是否共享音频,Chrome version >= 74 时支持,默认值false |
video | object | 可选,共享屏幕视频参数,如下: |
constraints.video
Name | Type | Description |
---|---|---|
frameRate | number | 可选,指定共享屏幕的视频帧率,默认值8 |
height | number | 可选,指定共享屏幕的视频高度(SDK 会自动计算共享屏幕的宽度)。 如果浏览器返回的实际分辨率高度小于等于设置的 height 值,以浏览器返回的为准;否则等比例缩放至设置的 height 值。如果 frameRate > 15 ,height 默认值为 720 ;如果 frameRate <= 15 ,height 默认值为 1080 。 |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
开启屏幕共享时可能会有失败事件需要处理: SDK获取屏幕媒体失败时将发布事件getScreenMediaFailed;媒体链接建立超时将发布事件startScreenTimeout。
如果需要本地显示共享屏幕的效果,可以监听getLocalScreen事件获取screen的video
标签。
注意
- 考虑到客户端的性能,建议
startScreen
高分辨率时配合低帧率参数,如果需要高帧率时降低分辨率。在参数frameRate
大于15时,SDK可能降低采集视频的分辨率,导致达不到参数指定的分辨率。Chrome version >= 74
时支持audio选项。
stopScreen
▸ stopScreen(): QResult
停止屏幕共享
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
startVideo
▸ startVideo(videoProfileType: string, sourceMirror?: boolean): QResult
开启视频
Parameters:
▪ videoProfileType: VideoProfileType
以指定的质量开启视频,可取值为:
VideoProfileType.Lowest, VideoProfileType.Low, VideoProfileType.Standard, VideoProfileType.HD720P, VideoProfileType.HD1080P
▪ sourceMirror:
指示本次发布视频在被订阅时是否以镜像显示,默认为否
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。startVideo
是异步过程,可以通过监听startVideoTimeout获得最终startVideo
的失败结果。
stopVideo
▸ stopVideo(): QResult
关闭视频
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
subscribeAudio
▸ subscribeAudio(userId
: string): QResult
订阅用户音频
Parameters:
▪ userId: string
userId: 将要订阅的用户ID
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
注意 如果
joinChannel
时的参数subscribeAudioAll
为true
,无需调用subscribeAudio
,若调用也不会产生效果
subscribeVideo
▸ subscribeVideo(param
: object): QResult
订阅用户视频
Parameters:
▪ param: object
userId: 将要订阅的用户id
quality: VideoProfileType.Lowest, VideoProfileType.Low, VideoProfileType.Standard, VideoProfileType.HD720P, VideoProfileType.HD1080P
Name | Type |
---|---|
quality | VideoProfileType |
userId | string |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
注意 订阅时如果当前网络状况不佳,接收到的视频分辨率可能低于订阅所请求的分辨率
subscribeScreen
▸ subscribeScreen(param
: object): QResult
订阅用户共享屏幕
Parameters:
▪ param: object
userId: 将要订阅的用户id,
Name | Type |
---|---|
userId | string |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
注意 订阅之前,请确保用户已开启共享屏幕,在其他用户开启屏幕共享后会收到事件userScreenStart,可以在监听到该事件后调用
subscribeScreen
。订阅成功后会收到userScreenReceived事件,订阅失败将收到事件failedToSubscribeScreen
startPreview
▸ startPreview(deviceId
: string, onSuccess
: function, onFail
: function, videoProfile
: VideoProfileName): QResult
开启摄像头预览
Parameters:
▪ deviceId: string
摄像头设备id
▪ onSuccess: function
成功预览回调,回调入参是 videoTag
▸ (videoTag
: HTMLVideoElement): any
Parameters:
Name | Type |
---|---|
videoTag | HTMLVideoElement |
▪ onFail: function
失败回调
▸ (error
: any): any
Parameters:
Name | Type |
---|---|
error | any |
▪ videoProfile: VideoProfileName
视频分辨率规格VideoProfileName
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
startRecordDeviceTest
▸ startRecordDeviceTest(deviceId
: string, onSuccess
: function, onError
: function): QResult
开启检测麦克风音量
Parameters:
▪ deviceId: string
麦克风设备id
▪ onSuccess: function
成功开始检测的回调,回调入参是 {audioLevel: number, micTest: number}
注意 开启成功后,会每 200 毫秒周期性调用
onSuccess
,直到调用stopRecordDeviceTest
停止检测。onSuccess
参数的micTest
属性是麦克风音量检测的索引,每次回调都是相同的值,stopRecordDeviceTest
时需要使用该值。
Parameters:
Name | Type |
---|---|
audioLevel | number, 取值范围 [0, 1] |
micTest | number |
▪ onFail: function
失败回调
▸ (error
: any): any
Parameters:
Name | Type |
---|---|
error | any |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
setMediaProcessor
▸ setMediaProcessor(processorType
: string, mediaProcessor
: function): QResult
设置媒体的处理函数,处理的数据是复制,用户处理完的数据不会替换到SDK中。
Parameters:
▪ processorType: string
目前支持取值:
'AudioCaptureExProcessor'
,表示抓取麦克风音频之后发送之前进行回调。
▪ mediaProcessor: function
媒体处理函数回调参数是
Name | Type |
---|---|
dataView | Int16Array类型,默认是有符号16bit小端格式的PCM采样数据 |
rtcAudioDataFormat | object, 包含属性type (音频格式,目前只有PCM格式,type 为0), sampleRate (采样率), channels (声道数), bytesPerSample (采样位宽) |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
setUserAudioIndication
▸ setUserAudioIndication(indicationHandler
: function, intervalMs
: number): QResult
设置接收的音频音量提示
Parameters:
▪ indicationHandler: function
音量提示的处理函数,回调入参是数组 userAudioLevelArray: Array<{level: number, userId: string, active: boolean}>
。表示本轮检测的所有user的音量,如果用户没有出现在数组中,表示该用户没有音量。
▪ intervalMs: number
音量提示的时间间隔毫秒数,默认200ms
注意 考虑到浏览器性能,建议时间间隔不要太小。
Parameters:
Name | Type |
---|---|
level | number,音频强度,取值范围 [0, 1] |
userId | string |
active | boolean,与native SDK的字段含义不同,此处只是通过比较level是否大于0.01来大致反映音量是否够大 |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
setRecordingAudioIndication
▸ setRecordingAudioIndication(indicationHandler
: function, intervalMs
: number): QResult
设置本地发送的音频音量提示,发布音频之后SDK会按照时间间隔intervalMs
调用indicationHandler
Parameters:
▪ indicationHandler: function
音量提示的处理函数,回调入参是object audioLevel: {level: number, userId: string, active: boolean}
。
▪ intervalMs: number
音量提示的时间间隔毫秒数,默认200ms
注意 考虑到浏览器性能,建议时间间隔不要太小。
Parameters:
Name | Type |
---|---|
level | number,音频强度,取值范围 [0, 1] |
userId | string |
active | boolean,与native SDK的字段含义不同,此处只是通过比较level是否大于0.01来大致反映音量是否够大 |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
stopRecordDeviceTest
▸ stopRecordDeviceTest(micTest
: number): QResult
停止检测麦克风音量
Parameters:
▪ micTest: number
麦克风音量检测的索引
注意 麦克风音量检测开启成功后,会周期调用
onSuccess
,直到应用层调用stopRecordDeviceTest
停止检测。其中参数micTest每次回调都是相同的值,stopRecordDeviceTest
时需要使用该值。
Parameters:
Name | Type |
---|---|
micTest | number |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
startNetworkTest
• startNetworkTest(callback
: function): void
已废弃。
开始网络状态检测
getNetworkStatus
▸ getNetworkStatus(callback
: function): void
获取自己的网络状态,有音视频或者屏幕共享收发的时候有效
Parameters:
▪ callback: function
网络状况检测完成后的回调,回调入参是 object
▸ (testResult
: object): any
▪ Parameters: object
testResult的属性:
Name | Type | Description |
---|---|---|
rating | string | 评分,可能取值以及含义见下表 |
rtt | number | RTT时延,单位毫秒(ms),-1表示没有检测成功 |
rxLoss | number | 下行丢包率,-1表示没有检测成功 |
txLoss | number | 上行丢包率,-1表示没有检测成功 |
rating
的取值及含义:
Name | Description |
---|---|
Unavailable | 网络不可用或者未能测试成功. |
VeryBad | 服务质量非常差,几乎不可用。 |
Bad | 服务质量比较差,质量不稳定。 |
Poor | 服务质量一般。 |
Good | 服务质量很好。 |
Excellent | 服务质量非常好。 |
stopPreview
▸ stopPreview(videoTag
: HTMLVideoElement): QResult
停止摄像头预览
Parameters:
Name | Type | Description |
---|---|---|
videoTag | HTMLVideoElement |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
snapshotVideo
▸ snapshotVideo(opt
: object, onSuccess
: function, onError
: function): void
获取视频截图
Parameters:
opt
Name | Type | Description |
---|---|---|
userId | string | 必填,指定将要截图的用户Id |
format | SnapshotImageFormat | (可选),指定图片格式为png或者jpeg,默认使用png格式 |
imgObjType | SnapshotImageObjType | (可选),指定传递给onSuccess回调函数的参数类型,可以是JavaScript的File类型的实例或base64编码的String,默认为File对象 |
mirror | boolean | (可选),截图是否做镜像处理,默认不做镜像处理 |
onSuccess
,
snapshotVideo成功时会把结果传递给onSuccess,参数类型可以是File实例或者和Base64编码的String
onError
,
snapshotVideo失败时会把错误原因传递给onError
Returns: void
unmuteCam
▸ unmuteCam(): QResult
恢复视频
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
unmuteMic
▸ unmuteMic(): QResult
将自己发布的音频取消静音。如果当前使用PSTN通话,那么PSTN通话也将被取消静音。
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
unmuteScreen
▸ unmuteScreen(): QResult
恢复屏幕共享
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
unsubscribeAudio
▸ unsubscribeAudio(userId
: string): QResult
取消订阅用户音频
Parameters:
▪ userId: string
userId: 将要取消订阅音频的用户ID
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
注意 如果
joinChannel
时的参数subscribeAudioAll
为true
,unsubscribeAudio
调用将无效
unsubscribeVideo
▸ unsubscribeVideo(param
: object): QResult
取消订阅视频
Parameters:
▪ param: object
将要取消订阅的用户id
Name | Type |
---|---|
userId | string |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
unsubscribeScreen
▸ unsubscribeScreen(param
: object): QResult
取消订阅共享屏幕
Parameters:
▪ param: object
将要取消订阅的用户id
Name | Type |
---|---|
userId | string |
Returns: QResult
QResult {
code: string,
message: string
}
QResult.code
为OK
时表示调用成功,其他表示调用失败,QResult.message
为失败原因。
on
▸ on(event
: string, cb
: Function): void
监听事件,内部分发的事件参见 RtcEngine.Events
Parameters:
Name | Type | Description |
---|---|---|
event | string | RtcEngine.Events |
cb | Function | 回调函数 |
Returns: void
off
▸ off(event
: string, cb
: Function): void
取消监听事件,内部分发的事件参见 RtcEngine.Events
Parameters:
Name | Type | Description |
---|---|---|
event | string | RtcEngine.Events |
cb | Function | 回调函数 |
Returns: void
Object literals
Static
Events
▪ Events: object
RtcEngine 内部状态变化时触发的回调,用户可以调用RtcEngine 实例的 on 方法添加监听回调
activeSpeakerListUpdate
• activeSpeakerListUpdate: string = "active_speaker_list_update"
音频活跃用户更新通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.activeSpeakerListUpdate,
(data) => console.log('activeSpeakerListUpdate', data) // { list: ['123', '456'] }
);
audioDeviceChange
• audioDeviceChange: string = "audio_device_changed"
音频设备状态变化的通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.audioDeviceChange,
(data) => console.log('audioDeviceChange', data)
);
// {
// changeType: 'added', // 变更类型
// device: {
// deviceId: "default",
// groupId: "42f3f1e46aee892d76c671feb614adb09f45df51e57e9c04e01d7c1f2132bf83",
// kind: "audioinput",
// label: "默认 - 外置麦克风 (Built-in)"
// }
// }
channelFailover
• channelFailover: string = "channel_fail_over"
频道错误恢复通知,接收到此通知时 panosdk 已经从服务器断开,panosdk 会尝试重新连接到服务器,开发者可以提示用户正在重连
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.channelFailover,
(data) => console.log('channelFailover', data)
);
// { state: 'Reconnecting' | 'Success' | 'Failed' }
firstAudioDataReceived
• firstAudioDataReceived: string = "first_audio_data_received"
第一个音频包到达通知
joinChannelConfirm
• joinChannelConfirm: string = "channel_join_confirm"
加入频道的通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.joinChannelConfirm,
(data) => console.log('joinChannelConfirm', data)
);
// {
// result: 'failed', 此字段指示joinChannel成功与否
// code: 'CHANNEL_FULL',
// message: 'channel is full'
// }
result
: 'success' 表示加入频道成功(可能不携带 code 和 message), 其他表示加入频道失败,joinChannel 成功与否以此字段为准。
code
: joinChannel 失败时的错误,可能有如下错误 'SUCCESS', 'CHANNEL_MODE', 'AUTH_FAILED', 'CHANNEL_CLOSED', 'INVALID_TOKEN', 'CHANNEL_FULL', 'CHANNEL_LOCKED', 'INVALID_ARGS', 'FAILED', 上述 code 含义分别为:加入成功、模式错误(混用了点对点模式和会议模式)、认证失败、会议已结束、TOKEN参数错误、频道已满、频道锁定、参数非法、其他原因。
message
: 用于帮助开发人员理解错误信息,请注意不同版本的 message 格式有所不同。
leaveChannelIndication
• leaveChannelIndication: string = "current_user_leave"
离开频道的通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.leaveChannelIndication,
(data) => console.log('leaveChannelIndication', data)
);
// {
// reason: 'Meeting Ended',
// reasonCode: 2
// }
reasonCode | reason | Description |
---|---|---|
0 | Kicked Out | 被踢出会议 |
2 | Meeting Ended | 会议结束 |
3 | Login Elsewhere | userId 在别处登录 |
4 | User Count Full | 会议用户数量达到上限 |
5 | Rejoin Channel Failed | failover失败 |
channelCountDown
• channelCountDown: string = "room_count_down"
频道倒计时通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.channelCountDown,
(data) => console.log('channelCountDown', data)
);
// {
// remainsec: 300 // 频道剩余时间,单位:秒
// }
userAudioMute
• userAudioMute: string = "user_audio_mute"
用户设置静音通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userAudioMute,
(data) => console.log('userAudioMute', data)
);
// {
// userId: "3309586" //设置静音用户的 userId
// }
userAudioStart
• userAudioStart: string = "user_audio_start"
用户开启音频通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userAudioStart,
(data) => console.log('userAudioStart', data)
);
// {
// userId: "3309586" //用户的 userId
// }
userAudioStop
• userAudioStop: string = "user_audio_stop"
用户关闭音频通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userAudioStop,
(data) => console.log('userAudioStop', data)
);
// {
// userId: "3309586" //用户的 userId
// }
userAudioUnmute
• userAudioUnmute: string = "user_audio_unmute"
用户取消静音通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userAudioUnmute,
(data) => console.log('userAudioUnmute', data)
);
// {
// userId: "3309586" //用户的 userId
// }
userAudioCallTypeChanged
• userAudioCallTypeChanged: string = "user_audio_call_type_changed"
用户语音通话方式发生变化
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userAudioCallTypeChanged,
(data) => console.log('userAudioCallTypeChanged', data)
);
// {
// userId: "3309586", //用户的 userId,
// type: 1 // 0 = VoIP, 1 = PSTN
// }
userLeave
• userLeave: string = "user_leave"
用户离开频道通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userLeave,
(data) => console.log('userLeave', data)
);
// {
// userId: "3309586" //用户的 userId
// }
userJoin
• userJoin: string = "user_join"
用户加入频道通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userJoin,
(data) => console.log('userJoin', data)
);
// {
// userId: "3309586", //用户的 userId
// user: {
// userId: "3309586",
// userName: "Pano-001",
// audioStatus: "close",
// videoStatus: "close"
// }
// }
videoDeviceChange
• videoDeviceChange: string = "video_device_changed"
视频设备状态变化的通知
whiteboardAvailable
• whiteboardAvailable: string = "whiteboard_available"
白板可用通知,在 failover 成功或者成功加入会议时触发
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.whiteboardAvailable,
(data) => console.log('whiteboardAvailable', data)
);
// {
// type: "join", // 触发类型,'join' 或者 'failover'
// message: "Join channel success." // 提示消息
// }
whiteboardStart
• whiteboardStart: string = "whiteboard_start"
白板打开通知,当 channel 中有任一用户打开白板(open),会触发这个事件,之后再打开不会再触发
whiteboardStop
• whiteboardStop: string = "whiteboard_stop"
白板关闭通知
whiteboardUnavailable
• whiteboardUnavailable: string = "whiteboard_unavailable"
白板不可用通知,在failover过程中或者离开会议时触发
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.whiteboardUnavailable,
(data) => console.log('whiteboardUnavailable', data)
);
// {
// type: "failover", // 触发类型,'left' 或者 'failover'
// message: "Connect lost, reconnecting..." // 提示消息
// }
localVideoStart
• localVideoStart: string = "local_video_start"
已废弃。
本地视频开启成功
userVideoStart
• userVideoStart: string = "user_video_start"
用户开启视频
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userVideoStart,
(data) => console.log('userVideoStart', data)
);
// {
// userId: '1233', // 用户id
// maxVideoProfile: 'HD720P', // string
// }
其中maxVideoProfile是VideoProfileType的key,表示对方发布的视频规格最高不超过该值。
userVideoTransform
• userVideoTransform: string = "user_video_transform"
用户视频旋转变换事件。SDK会把旋转变换应用到userVideoReceived
事件中的video element的style属性,如果APP应用逻辑不需要更精细调整旋转后的style,也不会copy SDK释放的video element,那么不需要监听本事件。
如果需要复制userVideoReceived
事件中的video element,应该监听该事件,把rotate和mirror属性记录下,每当需要显示video element的拷贝时,都检查该video对应的rotate和mirror,并进行转换。
注意 只有旋转角度或者是否镜像发生变化时,SDK才会发布该事件,因此APP层需要记录下状态以供后续订阅的video可以参考。userVideoReceived
事件和userVideoTransform
事件没有固定顺序,因此收到userVideoReceived
事件时需要检查是否已经保存userVideoTransform
事件,收到userVideoTransform
事件时需要检查是否已经保存用户video元素。
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userVideoTransform,
(event) => console.log('userVideoTransform', event.data)
);
// {
// userId: '1233', // 用户id
// streamId: 1, // number
// mirror: false, // boolean
// rotate: 270, // number
// }
其中streamId
是当 SDK 使用多摄像头方案时指定的视频流ID,默认情况不包含该字段;mirror
表示视频是否做左右镜像变换;rotate
表示视频做顺时针旋转角度。
userVideoStop
• userVideoStop: string = "user_video_stop"
用户关闭视频
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userVideoStop,
(data) => console.log('userVideoStop', data)
);
// {
// userId: '1233', // 用户id
// }
getVideoMediaFailed
• getVideoMediaFailed: string = "failed_to_get_video_media"
获取本地视频失败
callbackparams
与getAudioMediaFailed
相似,可以参考getAudioMediaFailed
getScreenMediaFailed
• getScreenMediaFailed: string = "failed_to_get_screen_media"
获取本地屏幕共享失败
callbackparams
与getAudioMediaFailed
相似,可以参考getAudioMediaFailed
getAudioMediaFailed
• getAudioMediaFailed: string = "failed_to_get_audio_media"
获取本地音频失败
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.getAudioMediaFailed,
(data) => {
console.log('getAudioMediaFailed', data)
// {
// errorName: "NotAllowedError", // 错误信息,判断错误类型以该字段为准
// errorMessage: "Permission denied", // 错误说明,帮助开发者理解错误类型,可能改变
// }
if (data.errorName === 'NotAllowedError') {
alert('没有权限开启设备')
} else if (data.errorName === 'NotFoundError') {
alert('找不到设备')
} else if (data.errorName === 'NotReadableError') {
alert('尽管已经授权,但是系统,浏览器,网页层面发生错误导致设备无法访问。例如Windows上其他应用排他访问设备,或者浏览器无法打开设备')
} else {
alert('获取音视频失败')
}
}
);
注意 应用逻辑中应该处理获取媒体失败的情况。errorName 有如下三种常见取值:
- NotAllowedError,没有授权获取音视频
- NotFoundError,没有音视频设备
- NotReadableError,尽管已经授权,但是设备无法访问,例如 Windows 系统上其他应用正在使用
enumerateDeviceTimeout
• enumerateDeviceTimeout: string = "enumerate_device_timeout"
枚举设备超时
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.enumerateDeviceTimeout,
(data) => console.log('enumerateDeviceTimeout', data)
);
// {
// data: {
// kind: 'audioinput' // 设备类型,'audioinput', 'audiooutput', 'videoinput'
// } // 错误信息
// }
userVideoReceived
• userVideoReceived: string = "get_remote_user_video"
用户 video tag 更新
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userVideoReceived,
(data) => console.log('userVideoReceived', data)
);
// {
// event:'get_remote_user_video',
// data: {
// videoTag: HTMLVideoElement; // videoTag
// userId: string; // 用户 Id
// userName: string; // 用户名
// }
// }
userVideoMute
• userVideoMute: string = "user_video_mute"
用户暂停视频
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userVideoMute,
(data) => console.log('userVideoMute', data)
);
// {
// userId: '1233', // 用户id
// }
userVideoUnmute
• userVideoUnmute: string = "user_video_unmute"
用户恢复视频
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userVideoUnmute,
(data) => console.log('userVideoUnmute', data)
);
// {
// userId: '1233', // 用户id
// }
getLocalVideo
• getLocalVideo: string = "get_local_video"
获取本地视频成功,需要显示本地视频时可以通过此事件获得正在发送的视频元素
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.getLocalVideo,
(data) => console.log('getLocalVideo', data)
);
// {
// data: { videoTag: HTMLVideoElement; }
// }
startAudioTimeout
• startAudioTimeout: string = "start_audio_time_out"
开启音频超时
startVideoTimeout
• startVideoTimeout: string = "start_video_time_out"
开启视频超时
failedToSubscribeVideo
• failedToSubscribeVideo: string = "failed_to_subscribe_video"
订阅用户视频失败
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.failedToSubscribeVideo,
(data) => console.log('failedToSubscribeVideo', data)
);
// {
// userId: '1233', // 用户id
// reason: 'something wrong...' // 失败原因
// }
startScreenTimeout
• startScreenTimeout: string = "start_screen_time_out"
startScreen开启屏幕共享超时
userScreenReceived
• userScreenReceived: string = "get_remote_user_screen"
subscribeScreen订阅成功,接收到订阅的其他用户的屏幕共享
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userScreenReceived,
(data) => console.log('userScreenReceived', data)
);
// {
// videoTag: HTMLVideoElement; // videoTag
// userId: string; // 用户 Id
// userName: string; // 用户名
// }
getScreenMediaFailed
• getScreenMediaFailed: string = "failed_to_get_screen_media"
startScreen获取本地桌面共享失败,可能由于未授权或者最终选择要共享的窗口之前取消了共享
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.getScreenMediaFailed,
(data) => console.log('getScreenMediaFailed', data)
);
// {
// error // 错误信息
// }
userScreenStop
• userScreenStop: string = "user_screen_stop"
有用户关闭屏幕共享
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userScreenStop,
(data) => console.log('userScreenStop', data)
);
// {
// userId: '1233', // 用户id
// }
userScreenStart
• userScreenStart: string = "user_screen_start"
其他用户开启屏幕共享
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userScreenStart,
(event) => console.log(event)
);
// {
// event: 'user_screen_start',
// userId: '1233', // 用户id
// }
userScreenResolutionChanged
• userScreenResolutionChanged: string = "user_screen_resolution_changed"
订阅的共享屏幕分辨率发生变化
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userScreenResolutionChanged,
(event) => console.log(event)
);
// {
// event:'user_screen_resolution_changed',
// data: {
// userId: '1233',
// width: 1920,
// height: 1080
// }
// }
localScreenEnded
• localScreenEnded: string = "local_screen_ended"
本地开启的屏幕共享由于被外部中断(例如关闭了共享的应用程序),SDK已经停止共享屏幕
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.localScreenEnded,
(data) => console.log('localScreenEnded', data)
);
// {
// userId: '1233', // 用户id
// }
getLocalScreen
• getLocalScreen: string = "get_local_screen"
本地共享屏幕成功获取媒体,需要显示本地视频时,可以通过此事件获得正在发送的共享屏幕的HTML video
元素
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.getLocalScreen,
(data) => console.log('getLocalScreen', data)
);
// {
// data: { videoTag: HTMLVideoElement; }
// }
userScreenMute
• userScreenMute: string = "user_screen_mute"
其他用户暂停屏幕共享
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userScreenMute,
(data) => console.log('userScreenMute', data)
);
// {
// userId: '1233', // 用户id
// }
userScreenUnmute
• userScreenUnmute: string = "user_screen_unmute"
其他用户恢复屏幕共享
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.userScreenUnmute,
(data) => console.log('userScreenUnmute', data)
);
// {
// userId: '1233', // 用户id
// }
failedToSubscribeScreen
• failedToSubscribeScreen: string = "failed_to_subscribe_screen"
订阅其他用户的共享屏幕失败
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.failedToSubscribeScreen,
(data) => console.log('failedToSubscribeScreen', data)
);
// {
// userId: '1233', // 用户id
// reason: 'something wrong...' // 失败原因
// }
networkStatus
• networkStatus: string = "network_status"
通话中的网络质量通知,joinChannel
成功之后会按周期(2秒)回调该事件
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.on(
PanoRtc.RtcEngine.Events.networkStatus,
(data) => console.log('networkStatus', data)
);
// data 内容
// {
// event: 'network_status', // 事件类型
// networkRatings: [{userId: '1234', rating: 'Good'}] // 数组,所有有网络质量数据的用户的网络质量
// }
rating
的取值及含义:
Name | Description |
---|---|
Unavailable | 网络不可用或者未能测试成功. |
VeryBad | 服务质量非常差,几乎不可用。 |
Bad | 服务质量比较差,质量不稳定。 |
Poor | 服务质量一般。 |
Good | 服务质量很好。 |
Excellent | 服务质量非常好。 |
groupJoinConfirm
• groupJoinConfirm: string = "group_join_confirm"
加入分组的结果事件
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.getGroupManager().on(
PanoRtc.RtcEngine.Events.groupJoinConfirm,
(data) => console.log('groupJoinConfirm', data)
);
// data 内容
// {
// groupId: 'group123',
// result: 'OK' //只有OK表示加入成功,其他表示失败
// }
groupUserJoinIndication
• groupUserJoinIndication: string = "group_user_join_indication"
其他用户加入分组时的通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.getGroupManager().on(
PanoRtc.RtcEngine.Events.groupUserJoinIndication,
(data) => console.log('groupUserJoinIndication', data)
);
// data 内容
// {
// groupId: 'group123',
// userId: '123123',
// userData: 'invisible' // app层调用joinGroup传递的自定义userData
// }
groupUserLeaveIndication
• groupUserLeaveIndication: string = "group_user_leave_indication"
其他用户离开分组时的通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.getGroupManager().on(
PanoRtc.RtcEngine.Events.groupUserLeaveIndication,
(data) => console.log('groupUserLeaveIndication', data)
);
// data 内容
// {
// groupId: 'group123',
// userId: '123123'
// }
groupDismissConfirm
• groupDismissConfirm: string = "group_dismiss_confirm"
解散分组的结果事件
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.getGroupManager().on(
PanoRtc.RtcEngine.Events.groupDismissConfirm,
(data) => console.log('groupDismissConfirm', data)
);
// data 内容
// {
// groupId: 'group123',
// result: 'OK'
// }
groupLeaveIndication
• groupLeaveIndication: string = "group_leave_indication"
被动离开分组的事件,例如分组被他人解散时会发生该事件
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.getGroupManager().on(
PanoRtc.RtcEngine.Events.groupLeaveIndication,
(data) => console.log('groupLeaveIndication', data)
);
// data 内容
// {
// groupId: 'group123',
// }
groupInviteIndication
• groupInviteIndication: string = "group_invite_indication"
该事件表示收到邀请加入分组时的事件通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.getGroupManager().on(
PanoRtc.RtcEngine.Events.groupInviteIndication,
(data) => console.log('groupInviteIndication', data)
);
// data 内容
// {
// groupId: 'group123',
// fromUserId: '456456' //发送邀请的用户
// }
groupDefaultUpdateIndication
• groupDefaultUpdateIndication: string = "group_default_update_indication"
该事件表示收到设置了默认分组的事件通知
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.getGroupManager().on(
PanoRtc.RtcEngine.Events.groupDefaultUpdateIndication,
(data) => console.log('groupDefaultUpdateIndication', data)
);
// data 内容
// {
// groupId: 'group123' // 默认分组
// }
setDefaultGroupConfirm
• setDefaultGroupConfirm: string = "set_default_group_confirm"
设置默认分组的结果事件
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.getGroupManager().on(
PanoRtc.RtcEngine.Events.setDefaultGroupConfirm,
(data) => console.log('setDefaultGroupConfirm', data)
);
// data 内容
// {
// groupId: 'group123' // 默认分组
// result: 'OK' // 结果为OK或者FAILED
// }
groupObserveConfirm
• groupObserveConfirm: string = "group_observe_confirm"
观察分组API调用的结果事件
callbackparams
import PanoRtc from '@pano.video/panortc';
rtcEngine.getGroupManager().on(
PanoRtc.RtcEngine.Events.groupObserveConfirm,
(data) => console.log('groupObserveConfirm', data)
);
// data 内容
// {
// groupId: 'group123' // 默认分组
// result: 'OK' // 结果为OK或者FAILED
// }