Interface IAgoraRTC
Agora Web SDK 的入口。
Events
audio-context-state-changed
audio-context-state-changed(currState: AudioContextState | "interrupted", prevState: AudioContextState | "interrupted" | undefined): void
参数
参数名 | 描述 |
---|---|
currState: AudioContextState | "interrupted" | |
prevState: AudioContextState | "interrupted" | undefined | 之前的状态,取值如下:
|
返回值
autoplay-failed
camera-changed
camera-changed(deviceInfo: DeviceInfo): void
参数
参数名 | 描述 |
---|---|
deviceInfo: DeviceInfo | 设备信息,详见 DeviceInfo。 |
返回值
microphone-changed
microphone-changed(deviceInfo: DeviceInfo): void
参数
参数名 | 描述 |
---|---|
deviceInfo: DeviceInfo | 设备信息,详见 DeviceInfo。 |
返回值
playback-device-changed
playback-device-changed(deviceInfo: DeviceInfo): void
参数
参数名 | 描述 |
---|---|
deviceInfo: DeviceInfo | 设备信息,详见 DeviceInfo。 |
返回值
security-policy-violation
Global Callback Properties
onAudioAutoplayFailed
onAudioAutoplayFailed: function
音频轨道自动播放失败回调。
该回调在音频轨道自动播放失败的时候触发。如果短时间内有多个音频轨道对象都调用了 play,SDK 会触发多次 onAudioAutoplayFailed。
音频自动播放失败是浏览器的自动播放策略导致的,视频轨道的播放不受此影响。
在 Agora Web SDK 中,只要用户和页面发生过一次点击交互,就会自动解锁浏览器音频自动播放的限制,所以针对音频自动播放有两种解决方案:
-
如果不希望收到 onAudioAutoplayFailed 回调,就确保在调用 RemoteAudioTrack.play 和 LocalAudioTrack.play 之前用户已经和页面发生了点击交互。
-
如果无法保证在调用 RemoteAudioTrack.play 和 LocalAudioTrack.play 之前用户已经和页面发生点击交互,就监听 onAudioAutoplayFailed 回调,通过回调在页面上显示一个按钮引导用户点击。
无论使用何种方案,只要浏览器启用了自动播放策略,都需要用户至少触发一次点击交互操作才能播放音频。随着用户使用某个页面的次数变多,浏览器会在这个页面上默认关闭自动播放策略,此时不需要任何交互也可以播放音频了,但是我们无法通过 JavaScript 去感知浏览器这个行为。
下面的示例代码演示了当检测到自动播放失败后的处理:在页面上动态显示一个按钮让用户点击。
let isAudioAutoplayFailed = false;
AgoraRTC.onAudioAutoplayFailed = () => {
if (isAudioAutoplayFailed) return;
isAudioAutoplayFailed = true;
const btn = document.createElement("button");
btn.innerText = "Click me to resume the audio playback";
btn.onClick = () => {
isAudioAutoplayFailed = false;
btn.remove();
};
document.body.append(btn);
};
需要注意的是,短时间内可能会有多个音频轨道对象都调用了 play,此时会触发多次 onAudioAutoplayFailed。示例代码中通过 isAudioAutoplayFailed 这个对象防止创建重复的按钮对象。
onAutoplayFailed
onAutoplayFailed: function
音频或视频轨道自动播放失败回调。
4.6.0
SDK 在音频或视频轨道自动播放失败时触发该回调。
-
音频自动播放失败是由浏览器的自动播放策略导致的。
-
在大部分浏览器中,纯视频不受到自动播放策略的限制,但是在低电量模式下的 iOS Safari 浏览器中以及开启自定义自动播放限制的 iOS WKWebView 中(如 iOS 微信浏览器),纯视频的自动播放也会受到限制。
在 Agora Web SDK 中,只要用户和页面发生过一次点击交互,就会自动解锁浏览器音频或视频的自动播放限制,所以针对自动播放有两种解决方案:
-
如果不希望收到 onAutoplayFailed 回调,就确保在调用 RemoteTrack.play 和 LocalTrack.play 之前用户已经和页面发生了点击交互。
-
如果无法保证在调用 RemoteTrack.play 和 LocalTrack.play 之前用户已经和页面发生点击交互,就监听 onAutoplayFailed 回调,通过回调在页面上显示一个按钮引导用户点击。
无论使用何种方案,只要浏览器启用了自动播放策略,都需要用户至少触发一次点击交互操作才能播放音频或视频。随着用户使用某个页面的次数变多,浏览器会在这个页面上默认关闭自动播放策略,此时不需要任何交互也可以播放音频和视频了,但是我们无法通过 JavaScript 去感知浏览器这个行为。
下面的示例代码演示了当检测到自动播放失败后的处理:在页面上动态显示一个按钮让用户点击。
AgoraRTC.onAutoplayFailed = () => {
const btn = document.createElement("button");
btn.innerText = "Click me to resume the audio/video playback";
btn.onClick = () => {
btn.remove();
};
document.body.append(btn);
由于自动播放失败后在用户通过手势点击恢复播放之前,onAutoplayFailed 只会触发一次,因此在业务代码中不需要像 onAudioAutoplayFailed 回调一样维护 isAutoplayFailed 状态。
onCameraChanged
onCameraChanged: function
视频采集设备状态变化回调。
该回调提示有摄像头被添加或移除。
注意事项:当该回调提示有设备被添加时,如果该设备是虚拟设备,可能无法采集到音频或视频。
AgoraRTC.onCameraChanged = (info) => {
console.log("camera changed!", info.state, info.device);
};
- deviceInfo:设备信息,详见 DeviceInfo。
onMicrophoneChanged
onMicrophoneChanged: function
音频采集设备状态变化回调。
该回调提示有麦克风被添加或移除。
注意事项:当该回调提示有设备被添加时,如果该设备是虚拟设备,可能无法采集到音频或视频。
AgoraRTC.onMicrophoneChanged = (info) => {
console.log("microphone changed!", info.state, info.device);
};
- deviceInfo:设备信息,详见 DeviceInfo。
onPlaybackDeviceChanged
onPlaybackDeviceChanged: function
4.1.0
音频播放设备状态变化回调。
该回调提示有音频播放设备被添加或移除。
AgoraRTC.onPlaybackDeviceChanged = (info) => {
console.log("speaker changed!", info.state, info.device);
};
- deviceInfo:设备信息,详见 DeviceInfo。
onSecurityPolicyViolation
onSecurityPolicyViolation: function
4.15.0
触发 CSP 规则回调。
当声网服务相关的资源加载或请求发送因为触发浏览器的 CSP(Content Security Policy,内容安全策略)规则而失败时,SDK 会触发该回调。
收到该回调后,请及时调整你的 CSP 设置,确保能正常体验声网的服务。
Other Properties
VERSION
VERSION: string
Agora Web SDK 的版本信息。
Agora Core Methods
createClient
createClient(config: ClientConfig): IAgoraRTCClient
创建一个客户端对象用于通话/直播管理,通常来说这是使用 Agora Web SDK 的第一步。
参数
参数名 | 描述 |
---|---|
config: ClientConfig | 客户端的配置,包括通话场景、编码格式等,默认使用 |
返回值
Local Track Methods
createBufferSourceAudioTrack
createBufferSourceAudioTrack(config: BufferSourceAudioTrackInitConfig): Promise<IBufferSourceAudioTrack>
参数
参数名 | 描述 |
---|---|
config: BufferSourceAudioTrackInitConfig | 通过该配置指定文件路径、缓存策略和编码配置。 |
返回值
返回的音频轨道对象相对于普通的音频轨道对象增加了一些控制音频播放流程的方法。包括播放、暂停、跳转、实时播放状态获取等。
createCameraVideoTrack
createCameraVideoTrack(config?: CameraVideoTrackInitConfig): Promise<ICameraVideoTrack>
通过摄像头采集的视频创建一个视频轨道。
参数
参数名 | 描述 |
---|---|
config: CameraVideoTrackInitConfig | 采集视频的配置,包括采集设备、编码配置等。详见 CameraVideoTrackInitConfig。 |
返回值
createCustomAudioTrack
createCustomAudioTrack(config: CustomAudioTrackInitConfig): ILocalAudioTrack
创建一个自定义的音频轨道。
你可以使用这个方法将自己维护的 MediaStreamTrack 转换成一个可以用于 SDK 的音频轨道。
参数
参数名 | 描述 |
---|---|
config: CustomAudioTrackInitConfig | 自定义音频的配置,详见 CustomAudioTrackInitConfig。 |
返回值
createCustomVideoTrack
createCustomVideoTrack(config: CustomVideoTrackInitConfig): ILocalVideoTrack
创建一个自定义的视频轨道。
你可以使用这个方法将自己维护的 MediaStreamTrack 转换成一个可以用于 SDK 的视频轨道。
参数
参数名 | 描述 |
---|---|
config: CustomVideoTrackInitConfig | 自定义视频轨道的配置,详见 CustomVideoTrackInitConfig。
|
返回值
createMicrophoneAndCameraTracks
createMicrophoneAndCameraTracks(audioConfig?: MicrophoneAudioTrackInitConfig, videoConfig?: CameraVideoTrackInitConfig): Promise<[IMicrophoneAudioTrack, ICameraVideoTrack]>
同时创建麦克风音频轨道和摄像头视频轨道。
通过麦克风采集的音频创建一个音频轨道,同时通过摄像头采集的视频创建一个视频轨道。
调用该方法和分别调用 createMicrophoneAudioTrack 以及 createCameraVideoTrack 的区别是:
- 调用该方法会同时要求麦克风和摄像头的授权,用户只需授权一次。
- 分别创建音频轨道和视频轨道需要用户分别对麦克风和摄像头进行授权,也就是说用户需要授权两次。
参数
参数名 | 描述 |
---|---|
audioConfig: MicrophoneAudioTrackInitConfig | 采集音频的配置,包括采集设备、编码配置等。 |
videoConfig: CameraVideoTrackInitConfig | 采集视频的配置,包括采集设备、编码配置等。 |
返回值
createMicrophoneAudioTrack
createMicrophoneAudioTrack(config?: MicrophoneAudioTrackInitConfig): Promise<IMicrophoneAudioTrack>
通过麦克风采集的音频创建一个音频轨道。
参数
参数名 | 描述 |
---|---|
config: MicrophoneAudioTrackInitConfig | 麦克风采集音频的配置,包括采集设备、音频编码配置等,详见 MicrophoneAudioTrackInitConfig。 |
返回值
createScreenVideoTrack
createScreenVideoTrack(config: ScreenVideoTrackInitConfig, withAudio: "enable"): Promise<[ILocalVideoTrack, ILocalAudioTrack]>
创建用于屏幕共享的视频轨道。
参数
参数名 | 描述 |
---|---|
config: ScreenVideoTrackInitConfig | 屏幕共享的视频配置,包括编码配置、采集配置等。 |
withAudio: "enable" | 屏幕共享时是否同时分享屏幕共享输入源的音频。
|
返回值
- 如果
withAudio
设为enable
,返回包含屏幕共享视频轨道和一个音频轨道的列表。如果用户没有勾选分享音频,SDK 会抛出错误。 - 如果
withAudio
设为disable
,返回屏幕共享的视频轨道。 - 如果
withAudio
设为auto
,在支持屏幕共享音频的浏览器上 SDK 会默认尝试分享音频。- 如果用户勾选了分享音频,会返回包含屏幕共享视频轨道和一个音频轨道的列表。
- 如果用户没有勾选分享音频,只返回屏幕共享视频轨道。
createScreenVideoTrack(config: ScreenVideoTrackInitConfig, withAudio: "disable"): Promise<ILocalVideoTrack>
创建用于屏幕共享的视频轨道。
参数
参数名 | 描述 |
---|---|
config: ScreenVideoTrackInitConfig | 屏幕共享的视频配置,包括编码配置、采集配置等。 |
withAudio: "disable" | 屏幕共享时是否同时分享屏幕共享输入源的音频。
|
返回值
- 如果
withAudio
设为enable
,返回包含屏幕共享视频轨道和一个音频轨道的列表。如果用户没有勾选分享音频,SDK 会抛出错误。 - 如果
withAudio
设为disable
,返回屏幕共享的视频轨道。 - 如果
withAudio
设为auto
,在支持屏幕共享音频的浏览器上 SDK 会默认尝试分享音频。- 如果用户勾选了分享音频,会返回包含屏幕共享视频轨道和一个音频轨道的列表。
- 如果用户没有勾选分享音频,只返回屏幕共享视频轨道。
createScreenVideoTrack(config: ScreenVideoTrackInitConfig, withAudio?: "enable" | "disable" | "auto"): Promise<[ILocalVideoTrack, ILocalAudioTrack] | ILocalVideoTrack>
创建用于屏幕共享的视频轨道。
参数
参数名 | 描述 |
---|---|
config: ScreenVideoTrackInitConfig | 屏幕共享的视频配置,包括编码配置、采集配置等。 |
withAudio: "enable" | "disable" | "auto" | 屏幕共享时是否同时分享屏幕共享输入源的音频。
|
返回值
- 如果
withAudio
设为enable
,返回包含屏幕共享视频轨道和一个音频轨道的列表。如果用户没有勾选分享音频,SDK 会抛出错误。 - 如果
withAudio
设为disable
,返回屏幕共享的视频轨道。 - 如果
withAudio
设为auto
,在支持屏幕共享音频的浏览器上 SDK 会默认尝试分享音频。- 如果用户勾选了分享音频,会返回包含屏幕共享视频轨道和一个音频轨道的列表。
- 如果用户没有勾选分享音频,只返回屏幕共享视频轨道。
Logger Methods
disableLogUpload
enableLogUpload
enableLogUpload(): void
开启日志上传。开启后 SDK 的日志会上传到声网的服务器。
日志上传功能默认为关闭状态,如果你需要开启此功能,请确保在所有方法之前调用本方法。
如果没有成功加入频道,则服务器上无法查看日志信息。
返回值
setLogLevel
setLogLevel(level: number): void
设置 SDK 的日志输出级别。
选择一个级别,你就可以看到在该级别及该级别以上所有级别的日志信息。
参数
参数名 | 描述 |
---|---|
level: number | SDK 日志输出级别。按照输出日志最全到最少排列:
例如,如果你输入代码 |
返回值
Media Devices Methods
getCameras
getCameras(skipPermissionCheck?: boolean): Promise<MediaDeviceInfo[]>
该方法枚举可用的视频输入设备,比如摄像头。
调用成功后 SDK 会通过 MediaDeviceInfo 对象返回可用的视频输入设备。
调用本方法会暂时打开摄像头以触发浏览器的媒体设备权限申请。在 Chrome 67+,Firefox 70+ 以及 Safari 12+ 等浏览器上没有媒体设备权限时,无法准确获取到设备信息。
参数
参数名 | 描述 |
---|---|
skipPermissionCheck: boolean | 是否跳过权限检查。你可以通过将该参数设置成
|
返回值
getDevices
getDevices(skipPermissionCheck?: boolean): Promise<MediaDeviceInfo[]>
该方法枚举可用的媒体输入和输出设备,比如麦克风、摄像头、耳机等。 调用成功后 SDK 会通过 MediaDeviceInfo 对象返回可用的媒体设备。
注意事项:
- 调用本方法会暂时打开摄像头和麦克风以触发浏览器的媒体设备权限申请。在 Chrome 67+,Firefox 70+ 以及 Safari 12+ 等浏览器上没有媒体设备权限时,无法准确获取到设备信息。
- 即使是对于同一设备,SDK 返回的 MediaDeviceInfo.deviceId 也可能会发生变化,例如用户清除 Cookie 后,
deviceId
就会被重置。因此,声网不建议基于deviceId
开发业务逻辑。
getDevices().then(devices => {
console.log("first device id", devices[0].deviceId);
}).catch(e => {
console.log("get devices error!", e);
});
参数
参数名 | 描述 |
---|---|
skipPermissionCheck: boolean | 是否跳过权限检查。你可以通过将该参数设置成
|
返回值
getElectronScreenSources
getElectronScreenSources(type?: ScreenSourceType): Promise<ElectronDesktopCapturerSource[]>
在 Electron 环境下获取屏幕共享源。
调用成功后 SDK 会返回一组 ElectronDesktopCapturerSource 对象。
如果你的 Electron 运行环境开启了 contextIsolation 配置,调用此方法会报错。你需要自己使用 contextBridge.exposeInMainWorld 来获取视频源 id。
// preload.js
const {
contextBridge, desktopCapturer
} = require("electron");
contextBridge.exposeInMainWorld(
"electronDesktopCapturer", {
getSources: async (...args) => {
const sources = await desktopCapturer.getSources(...args);
return sources;
}
}
);
// renderer.js
(async () => {
sources = await window.electronDesktopCapturer.getSources(["window", "screen"]);
const source = sources[0]; // just for example ,you shuould make an UI for user to select the exact source.
const screenVideoTrack = await AgoraRTC.createScreenVideoTrack({ electronScreenSourceId: source.id });
})()
参数
参数名 | 描述 |
---|---|
type: ScreenSourceType | 需要获取的共享源类型(窗口/应用/屏幕),详见 ScreenSourceType。如果为空则获取所有可以获取的共享源。 |
返回值
getMicrophones
getMicrophones(skipPermissionCheck?: boolean): Promise<MediaDeviceInfo[]>
该方法枚举可用的音频输入设备,比如麦克风。
调用成功后 SDK 会通过 MediaDeviceInfo 对象返回可用的音频输入设备。
调用本方法会暂时打开麦克风以触发浏览器的媒体设备权限申请。在 Chrome 67+,Firefox 70+ 以及 Safari 12+ 等浏览器上没有媒体设备权限时,无法准确获取到设备信息。
参数
参数名 | 描述 |
---|---|
skipPermissionCheck: boolean | 是否跳过权限检查。你可以通过将该参数设置成
|
返回值
getPlaybackDevices
Other Methods
checkAudioTrackIsActive
checkAudioTrackIsActive(track: ILocalAudioTrack | IRemoteAudioTrack, timeout?: number): Promise<boolean>
检测音频轨道是否活跃。
SDK 通过检测指定时间范围内音量是否发生变化来判断音频轨道是否活跃。
声网建议通过此方法在开始通话前对音频输入设备进行可用性检测。你可以将麦克风采集到的音频轨道作为参数传入该方法,判断麦克风是否正常运行。
注意事项:
- 极为安静的环境下可能检测失败,所以声网建议你在使用此方法的时候提示用户发出声响。
- 当音频轨道被 mute 时,会返回
false
。 - 不建议频繁调用此方法。
const audioTrack = await AgoraRTC.createMicrophoneAudioTrack({ microphoneId });
AgoraRTC.checkAudioTrackIsActive(audioTrack).then(result => {
console.log(`${ microphoneLabel } is ${ result ? "available" : "unavailable" }`);
}).catch(e => {
console.log("check audio track error!", e);
});
参数
参数名 | 描述 |
---|---|
需要进行检测的本地或远端音频轨道。 | |
timeout: number | 音频轨道检测的超时时间,单位为毫秒,默认 5,000 毫秒。 |
返回值
传入该方法的音频轨道中的音量大小是否发生了变化:
true
: 音量大小有变化。对于麦克风音频轨道,说明音频采集设备采集到了声音。false
: 音量大小未变化,说明音频采集设备没有采集到声音,或自定义音频轨道中没有音量变化,或音频轨道被 mute。
checkSystemRequirements
checkSystemRequirements(): boolean
检查 Agora Web SDK 对正在使用的浏览器的适配情况。
该方法必须在创建客户端对象 createClient 之前调用。
返回值
是否支持当前浏览器。
true
: 支持。false
: 不支持。
checkVideoTrackIsActive
checkVideoTrackIsActive(track: ILocalVideoTrack | IRemoteVideoTrack, timeout?: number): Promise<boolean>
检测视频轨道是否活跃。
SDK 通过检测指定时间范围内视频图像是否发生变动来判断视频轨道是否活跃。
声网建议通过此方法在开始通话前对视频输入设备进行可用性检测。你可以将摄像头采集到的视频轨道作为参数传入该方法,判断摄像头是否正常运行。
注意事项:
- 当视频轨道被 mute 时,会返回
false
。 - 不建议频繁调用此方法。
const videoTrack = await AgoraRTC.createCameraVideoTrack({ cameraId });
AgoraRTC.checkVideoTrackIsActive(videoTrack).then(result => {
console.log(`${ cameraLabel } is ${ result ? "available" : "unavailable" }`);
}).catch(e => {
console.log("check video track error!", e);
});
参数
参数名 | 描述 |
---|---|
需要进行检测的本地或远端视频轨道。 | |
timeout: number | 视频轨道检测的超时时间,单位为毫秒,默认 5,000 毫秒。 |
返回值
传入该方法的视频轨道中的图像是否发生了变动:
true
: 视频画面发生变动。对于摄像头视频轨道,说明视频采集设备采集到了画面。false
: 视频画面未变动,说明视频采集设备异常或被完全遮挡,或视频轨道被 mute。
createChannelMediaRelayConfiguration
getListeners
getSupportedCodec
getSupportedCodec(): Promise<object>
获取 Agora Web SDK 对当前浏览器支持的编解码格式。
调用该方法会返回声网服务与当前浏览器同时支持的编解码格式。目前而言,视频支持 VP8 及 H.264 格式,音频支持 OPUS 格式。
注意事项:
- 该方法支持所有浏览器。对于不支持 WebRTC 或无法识别的浏览器环境,编解码列表返回为空。
- 返回的音视频编码为浏览器通过 SDP 声称的编码类型,为参考值。
- 目前部分安卓手机 H.264 与其他平台 H.264 存在无法互通或单通问题,对于这部分机型推荐使用 VP8 编码格式。
AgoraRTC.getSupportedCodec().then(result => {
console.log(`Supported video codec: ${result.video.join(",")}`);
console.log(`Supported audio codec: ${result.audio.join(",")}`);
});
返回值
调用该方法会返回一个 Promise
对象,在 .then(function(result){})
回调中,result
包含以下属性:
video
: 数组类型,支持的视频编解码格式。可能含有"H264"
、"VP8"
两种取值,或为空数组。audio
: 数组类型,支持的音频编解码格式。可能含有"OPUS"
,或为空数组。
off
on
once
preload
preload(appid: string, channel: string, token: string | null, uid?: UID | null): Promise<void>
使用appid
、channel
、token
、uid
预加载频道。
调用该方法可以减少观众频繁切换频道时加入频道的时间,从而缩短观众听到主播首帧音频以及看到首帧画面的耗时,提升观众端的视频体验。
如果当前频道已经成功预加载,观众加入、离开频道后如需再次加入该频道,只要预加载时传入的 Token 仍在有效期内,则无需重新预加载。
- 预加载的有效时间只有两分钟。
- 为了保护页面性能,此方法采取一次性尽力而为的策略,无法保证一定成功。但预加载失败不会影响观众正常加入频道,也不会增加加入频道的耗时。
- 系统最多缓存 10 条最新的不同预加载数据。
- 目前此方法不支持通过 proxy 代理进行转发。
参数
参数名 | 描述 |
---|---|
appid: string | 你的声网项目的 App ID。 |
channel: string | 标识通话的频道名称,长度在 64 字节以内的字符串。以下为支持的字符集范围(共 89 个字符):
|
token: string | null | 用于鉴权的 token。
|
标识用户的 ID。整数或字符串,ASCII 字符,需保证唯一性。如果不指定或设为
为保证最佳的用户体验,声网强烈建议你不要使用字符串作为用户 ID。
|
返回值
processExternalMediaAEC
processExternalMediaAEC(element: HTMLMediaElement): void
参数
参数名 | 描述 |
---|---|
element: HTMLMediaElement | 需要进行回声消除的媒体元素,详见 HTMLMediaElement。 |
返回值
registerExtensions
removeAllListeners
resumeAudioContext
resumeAudioContext(): void
恢复音视频播放。
在某些版本的 iOS 设备上,App 通话被微信通话或系统电话打断后有概率无法自动恢复。你可以调用该方法恢复 App 通话。
声网推荐你通过 IAgoraRTC.on 监听 "audio-context-state-changed"
事件,并在回调函数 event_audio_context_state_changed 中进行以下处理:
- 当状态变为
"interrupted"
时,弹窗提示用户 App 通话被打断,需要点击按钮恢复通话。用户点击按钮后,调用resumeAudioContext
。 - 当状态变为
"running"
时,关闭弹窗。
当前的状态,取值如下:
AudioContextState
:枚举值的含义详见 BaseAudioContext.state。"interrupted"
:App 的音视频播放被微信通话或系统电话打断。你可以调用 resumeAudioContext 方法恢复音视频播放。