React Native API 说明
React Native SDK 提供客户端 API,JavaScript 和 TypeScript 项目都可以使用。如果你还没有完成包接入、原生工程配置或连接流程准备,先看 React Native SDK 接入。
适用范围
面向 Android 和 iOS 客户端应用。你的项目需要使用 React Native >=0.80.0,并启用 New Architecture。
最低运行系统版本:
- Android 6.0(API Level 23)及以上
- iOS
15.1及以上
导入对象和类型
在 React Native 业务代码中,从 tirtc-react-native 根入口导入运行时对象、组件和枚举。
import {
TiRtc,
TiRtcConn,
TiRtcAudioInput,
TiRtcAudioOutput,
TiRtcVideoOutput,
TiRtcVideoOutputView,
TiRtcLogging,
TiRtcConnState,
TiRtcAudioCodec,
TiRtcAudioAecMode,
TiRtcAudioAgcLevel,
TiRtcAudioAnsLevel,
TiRtcOutputBufferStrategy,
TiRtcVideoDecoderPreference,
} from 'tirtc-react-native';使用 TypeScript 时,只用于类型标注的类型可以用 import type 导入。JavaScript 项目不需要导入这些类型。
import type {
TiRtcInitOptions,
TiRtcAudioInputOptions,
TiRtcAudioOutputOptions,
TiRtcVideoOutputOptions,
TiRtcLoggingUploadResult,
} from 'tirtc-react-native';生命周期与调用顺序
典型客户端流程是:连接一个设备端,播放设备端音视频,并按需收发命令或发起语音对讲。主干从 TiRtc.initialize(...) 开始,以 disconnect() 和 dispose() 收尾。
初始化:传入
AppId,启动 SDK 运行时。tsawait TiRtc.initialize({appId});创建连接:创建
TiRtcConn,并在连接前设置状态、命令和流消息回调。tsconst conn = new TiRtcConn(); conn.onStateChanged = handleConnStateChanged; conn.onCommand = handleCommand; conn.onStreamMessage = handleStreamMessage;准备播放:在发起连接前创建音频输出和视频输出,并指定要播放的
streamId。tsconst audioOutput = new TiRtcAudioOutput(); audioOutput.attach(conn, audioStreamId); const videoOutput = new TiRtcVideoOutput(); videoOutput.attach(conn, videoStreamId);渲染视频:在界面中渲染
TiRtcVideoOutputView,让视频输出有对应的显示位置。tsx<TiRtcVideoOutputView output={videoOutput} />发起连接:传入目标设备的
device_id和业务服务端签发的token。tsconn.connect(remoteId, token);请求媒体:连接进入
connected后,按需请求设备端发送音频流和视频流。tsconn.subscribeAudio(audioStreamId); // 连接成功后订阅音频 conn.subscribeVideo(videoStreamId); // 连接成功后订阅视频命令交互:连接进入
connected后,按需通过命令通道和设备端交换业务数据。tsconn.sendCommand(commandId, data); // 需要命令交互时调用 // 收到设备端命令时,在 handleCommand(commandId, data) 中处理。语音对讲(按需):应用获得系统麦克风权限后,创建音频输入,绑定到同一条连接,并启动采集发送。
tsconst talkbackInput = new TiRtcAudioInput(); talkbackInput.setOptions(talkbackOptions); talkbackInput.attach(conn, talkbackStreamId); talkbackInput.start();收尾释放:业务结束时先释放按需创建的输入对象,再按订阅、输出、连接的顺序收尾。
tstalkbackInput.stop(); // 创建了 talkbackInput 时调用 talkbackInput.detach(conn); talkbackInput.dispose(); conn.unsubscribeAudio(audioStreamId); // 停止播放时取消音频订阅 conn.unsubscribeVideo(videoStreamId); // 停止播放时取消视频订阅 audioOutput.detach(); videoOutput.detach(); audioOutput.dispose(); videoOutput.dispose(); conn.disconnect(); conn.dispose();
TiRtcInitOptions
TiRtcInitOptions 是 TiRtc.initialize(...) 的参数对象。
初始化时必须传 appId,取值为你的 AppId。
type TiRtcInitOptions = Readonly<{
appId?: string; // 必填:你的 AppId
endpoint?: string; // 切换自部署云端实例或测试、联调环境时传,例如 "https://ep-tirtc.my-domain.com";其他情况不传
consoleLogEnabled?: boolean; // true 时同时把 SDK 日志打印到控制台
}>;TiRtc
TiRtc 提供初始化、错误码名称转换入口。
// 初始化 SDK。resolve 0 表示成功,非 0 为错误码。
// 重复调用成功时返回 0,不会替换已生效的配置。
static initialize(config: TiRtcInitOptions): Promise<number>
// 把错误码转成错误名称。
static errorToString(code: number): string
// 返回形如 "error TIRTC_ERROR_INVALID_ARGUMENT (6000)" 的字符串。
static formatError(code: number): string示例:
const code = await TiRtc.initialize({
appId: 'your-app-id',
});
if (code !== 0) {
console.warn(`initialize failed: ${TiRtc.formatError(code)}`);
}TiRtcConn
TiRtcConn 表示客户端到远端设备的一条连接。创建对象不会立即发起连接;通常先设置回调,再调用 connect(...)。连接建立后,可以通过它发送命令、发送流消息、发起媒体订阅和请求视频关键帧。
音频播放和视频显示由 TiRtcAudioOutput / TiRtcVideoOutput 负责,TiRtcConn 本身不播放也不显示媒体。
状态
TiRtcConnState.idle:连接对象已创建,但还没有开始连接。TiRtcConnState.connecting:连接请求已提交,正在等待结果。TiRtcConnState.connected:连接已经建立,可收发命令、流消息,发起媒体订阅和关键帧请求。TiRtcConnState.disconnected:连接失败、对端断开或调用disconnect()后进入该状态。
属性和回调
// 当前连接状态。
state: TiRtcConnState
// 连接状态变化时触发。errorCode 为 0 表示本次状态变化没有错误;非 0 为错误码。
onStateChanged: TiRtcOnConnStateChanged | null
// 收到设备端命令时触发。
onCommand: TiRtcOnConnCommand | null
// 收到设备端的流消息时触发。
onStreamMessage: TiRtcOnConnStreamMessage | null相关类型:
type TiRtcOnConnStateChanged = (
state: TiRtcConnState,
errorCode: number,
) => void;
type TiRtcOnConnCommand = (
commandId: number,
data: Uint8Array,
) => void;
type TiRtcOnConnStreamMessage = (
streamId: number,
timestampMs: number,
data: Uint8Array,
) => void;方法
// 创建连接对象;构造函数本身不会发起连接。通常先设置回调,再调用 connect。
new TiRtcConn()
// 发起连接;初始化完成并拿到连接凭证后调用。
// remoteId 是连接目标;连接设备端时传目标设备的 device_id,例如 "PRODFENGXXXX"。
// token 是业务服务端为本次连接签发的 token,二者不能为空。
// 返回 0 只表示请求已提交,最终连接结果看 onStateChanged;非 0 为错误码。
connect(remoteId: string, token: string): number
// 断开当前连接;业务结束、切换设备或重新连接前调用。对象仍可重新 connect。
disconnect(): number
// 释放连接对象;确认不再使用这条连接后调用。调用后不要再使用这个实例。
dispose(): number
// 在命令通道上发送自定义命令;连接进入 connected 后调用。
sendCommand(commandId: number, data: Uint8Array): number
// 发送流消息;连接进入 connected 后调用。
// streamId 按 stream_id 约定使用 0..15,两端需要提前约定消息语义。
sendStreamMessage(streamId: number, timestampMs: number, data: Uint8Array): number
// 请求远端开始发送指定 streamId 的音频流;连接进入 connected 后调用。
// streamId 按 stream_id 约定使用 0..15。
// 这个方法只请求远端发送音频,不会自动播放。
// 播放远端音频时,先调用 TiRtcAudioOutput.attach(...) 指定要播放的 connection 和 streamId,再发起连接。
// 连接成功后调用 subscribeAudio(...)。
subscribeAudio(streamId: number): number
// 请求远端停止发送指定 streamId 的音频流;streamId 按 stream_id 约定使用 0..15。
// 不会停止已经创建的 TiRtcAudioOutput。停止播放时再调用 TiRtcAudioOutput.detach()。
unsubscribeAudio(streamId: number): number
// 请求远端开始发送指定 streamId 的视频流;连接进入 connected 后调用。
// streamId 按 stream_id 约定使用 0..15。
// 这个方法只请求远端发送视频,不会自动显示。
// 显示远端视频时,先调用 TiRtcVideoOutput.attach(...) 指定要显示的 connection 和 streamId,再发起连接。
// 连接成功后调用 subscribeVideo(...)。
subscribeVideo(streamId: number): number
// 请求远端停止发送指定 streamId 的视频流;streamId 按 stream_id 约定使用 0..15。
// 不会停止已经创建的 TiRtcVideoOutput。停止显示时再调用 TiRtcVideoOutput.detach()。
unsubscribeVideo(streamId: number): number
// 向远端请求指定视频流的关键帧;连接已建立且远端正在发送该视频流时调用。
// streamId 按 stream_id 约定使用 0..15。
requestKeyFrame(streamId: number): number示例:
const conn = new TiRtcConn();
conn.onStateChanged = (state, errorCode) => {
if (state === TiRtcConnState.connected) {
console.info('connected');
return;
}
if (state === TiRtcConnState.disconnected) {
if (errorCode === 0) {
console.info('disconnected');
return;
}
console.warn(`disconnected: ${TiRtc.formatError(errorCode)}`);
}
};
conn.onCommand = (commandId, data) => {
console.info(`command=${commandId} bytes=${data.byteLength}`);
};
const code = conn.connect(remoteId, token);
if (code !== 0) {
console.warn(`connect failed: ${TiRtc.formatError(code)}`);
}
// 结束时:
conn.disconnect();
conn.dispose();TiRtcAudioOutputOptions
TiRtcAudioOutputOptions 配置 TiRtcAudioOutput 的音频输出参数。只需要填写要覆盖默认值的字段。
type TiRtcAudioOutputOptions = Readonly<{
agcLevel?: TiRtcAudioAgcLevel; // 自动增益等级
ansLevel?: TiRtcAudioAnsLevel; // 自动噪声抑制等级
bufferStrategy?: TiRtcOutputBufferStrategy; // 输出缓冲策略
// 最大输出缓冲水位,单位为毫秒;仅 automatic 有效。
// 不传表示由 SDK 自动决定。
maxBufferWatermarkMs?: number;
}>;相关取值:
TiRtcAudioAgcLevel.disabled
TiRtcAudioAgcLevel.low
TiRtcAudioAgcLevel.medium
TiRtcAudioAgcLevel.high
TiRtcAudioAnsLevel.disabled
TiRtcAudioAnsLevel.low
TiRtcAudioAnsLevel.medium
TiRtcAudioAnsLevel.high
TiRtcOutputBufferStrategy.automatic
TiRtcOutputBufferStrategy.noBufferTiRtcAudioOutput
TiRtcAudioOutput 用来播放某条远端音频流。播放远端音频时,先创建 TiRtcConn 和 TiRtcAudioOutput,调用 attach(...) 指定要播放的 connection 和 streamId,再发起连接。连接成功后,调用 TiRtcConn.subscribeAudio(...)。
attach(...) 成功只表示播放对象已经知道要播放哪路音频。如果远端还没有发送这路音频,用户仍然听不到声音。
attach(...) 只选择这路音频由哪个 TiRtcAudioOutput 播放;subscribeAudio(...) 只负责请求远端发送音频。
状态
TiRtcAudioOutputState.idle:还没有选择要播放的远端音频流,或已经detach()。TiRtcAudioOutputState.buffering:已经选择要播放的远端音频流,正在等待可播放数据。TiRtcAudioOutputState.playing:正在播放远端音频。TiRtcAudioOutputState.failed:播放路径发生错误。
属性和回调
// 当前音频播放状态。
state: TiRtcAudioOutputState
// 播放状态变化时触发。
onStateChanged: TiRtcOnAudioOutputStateChanged | null
// 音频输出对象发生错误时触发。
onError: TiRtcOnAudioOutputError | null相关类型:
type TiRtcOnAudioOutputStateChanged = (
state: TiRtcAudioOutputState,
) => void;
type TiRtcOnAudioOutputError = (code: number) => void;方法
// 创建音频输出对象。
new TiRtcAudioOutput()
// 配置音频输出参数;创建对象后、attach 前调用。
// 返回 0 表示成功,非 0 为错误码;已绑定后调用会返回错误码。
configure(options: TiRtcAudioOutputOptions): number
// 设置当前输出实例的相对播放音量;可以在 attach 前或播放过程中调用。
// volumePercent 必须是 0~100 的整数:0 表示静音,100 表示恢复原始音量。
// 静音不会停止音频流,也不会修改系统媒体音量。
// 返回 0 表示成功,非 0 为错误码。
setVolume(volumePercent: number): number
// 指定这个输出对象要播放的远端音频流。通常在 connect(...) 前调用。
// 如果需要显式请求远端发流,应在 subscribeAudio(...) 前完成。
// 远端发送这路音频后,用户才会听到声音。
attach(connection: TiRtcConn, streamId: number): number
// 停止使用这个输出对象播放当前音频流;切换流或释放对象前调用。成功后状态回到 idle。
detach(): number
// 获取音频调试快照,包含当前解析到的音频编码、采样率和声道数。
getDebugSnapshot(): TiRtcAudioOutputDebugSnapshotResult
// 释放音频输出对象;通常在 detach 后调用。调用后不要再使用这个实例。
dispose(): number示例:
const audioOutput = new TiRtcAudioOutput();
audioOutput.onError = (code) => {
console.warn(`audio output error: ${TiRtc.formatError(code)}`);
};
const code = audioOutput.attach(conn, 10);
if (code !== 0) {
console.warn(`audio attach failed: ${TiRtc.formatError(code)}`);
}
// 只调整当前 audioOutput,不修改系统媒体音量。
audioOutput.setVolume(0); // 静音
audioOutput.setVolume(100); // 恢复原始音量
// 结束时:
audioOutput.detach();
audioOutput.dispose();TiRtcVideoOutputOptions
TiRtcVideoOutputOptions 配置 TiRtcVideoOutput 的解码和缓冲参数。只需要填写要覆盖默认值的字段。
type TiRtcVideoOutputOptions = Readonly<{
// 解码偏好:auto 自动,software 软件解码,hardware 硬件解码。
// 这只是请求偏好,实际选择取决于设备、系统和视频编码格式。
decoderPreference?: TiRtcVideoDecoderPreference;
bufferStrategy?: TiRtcOutputBufferStrategy; // 输出缓冲策略
// 最大输出缓冲水位,单位为毫秒;仅 automatic 有效。
// 不传表示由 SDK 自动决定。
maxBufferWatermarkMs?: number;
}>;相关取值:
TiRtcVideoDecoderPreference.auto
TiRtcVideoDecoderPreference.software
TiRtcVideoDecoderPreference.hardware
TiRtcOutputBufferStrategy.automatic
TiRtcOutputBufferStrategy.noBufferTiRtcVideoOutput
TiRtcVideoOutput 用来显示某条远端视频流。显示远端视频时,先创建 TiRtcConn 和 TiRtcVideoOutput,调用 attach(...) 指定要显示的 connection 和 streamId,再发起连接。连接成功后,调用 TiRtcConn.subscribeVideo(...)。
attach(...) 成功只表示输出对象已经准备好。如果远端还没有发送这路视频,页面不会出画面。
attach(...) 只选择这路视频由哪个 TiRtcVideoOutput 显示;subscribeVideo(...) 只负责请求远端发送视频。
状态
TiRtcVideoOutputState.idle:还没有选择要显示的远端视频流,或已经detach()。TiRtcVideoOutputState.buffering:已经选择要显示的远端视频流,正在等待可渲染数据或渲染视图准备。TiRtcVideoOutputState.rendering:正在渲染远端视频。TiRtcVideoOutputState.failed:视频输出路径发生错误。
属性和回调
// 最近一次远端画面渲染尺寸。还没有画面或已经 detach 时可能为 null。
renderSize: TiRtcSize | null
// 播放状态变化时触发。
onStateChanged: TiRtcOnVideoOutputStateChanged | null
// 远端画面尺寸变化时触发。
onRenderSizeChanged: TiRtcOnVideoOutputRenderSizeChanged | null
// 视频输出对象发生错误时触发。
onError: TiRtcOnVideoOutputError | null相关类型:
type TiRtcSize = Readonly<{
width: number;
height: number;
}>;
type TiRtcOnVideoOutputStateChanged = (
state: TiRtcVideoOutputState,
) => void;
type TiRtcOnVideoOutputRenderSizeChanged = (
size: TiRtcSize,
) => void;
type TiRtcOnVideoOutputError = (code: number) => void;方法
// 创建视频输出对象。
new TiRtcVideoOutput()
// 设置视频输出参数;创建对象后、attach 前调用。
// 返回 0 表示成功,非 0 为错误码;需要修改参数时先 detach,再重新 setOptions 和 attach。
setOptions(options: TiRtcVideoOutputOptions): number
// 指定这个输出对象要显示的远端视频流。通常在 connect(...) 前调用。
// 如果需要显式请求远端发流,应在 subscribeVideo(...) 前完成。
// 远端发送这路视频后,页面才会出画面。
attach(connection: TiRtcConn, streamId: number): number
// 停止使用这个输出对象显示当前视频流;切换流或释放对象前调用。成功后状态回到 idle,并清空 renderSize。
detach(): number
// 返回这个输出对象对应的 React 元素;需要显示远端视频时在渲染函数中使用。
// 同一个输出对象同时只支持挂载一个 view。
view(props?: Omit<TiRtcVideoOutputViewProps, 'output'>): React.ReactElement
// 获取视频调试快照,包含当前解析到的视频编码、尺寸、码流格式和解码后端。
getDebugSnapshot(): TiRtcVideoOutputDebugSnapshotResult
// 释放视频输出对象和相关系统资源;通常在 detach 后调用。调用后不要再使用这个实例。
dispose(): number示例:
const videoOutput = new TiRtcVideoOutput();
videoOutput.onRenderSizeChanged = (size) => {
console.info(`remote video size=${size.width}x${size.height}`);
};
const code = videoOutput.attach(conn, 11);
if (code !== 0) {
console.warn(`video attach failed: ${TiRtc.formatError(code)}`);
}
export function RemoteVideo() {
return (
<TiRtcVideoOutputView
output={videoOutput}
resizeMode="contain"
style={{width: '100%', height: '100%'}}
/>
);
}TiRtcVideoOutputView
TiRtcVideoOutputView 是远端视频输出的 React Native Fabric 组件。传入 TiRtcVideoOutput 对象,不要传 native id。
type TiRtcVideoOutputViewProps = ViewProps &
Readonly<{
output: TiRtcVideoOutput;
resizeMode?: 'contain' | 'cover' | 'stretch';
}>;如果 output 已经释放,或传入的不是 TiRtcVideoOutput,组件会退化为普通 View。
TiRtcAudioInputOptions
TiRtcAudioInputOptions 配置 TiRtcAudioInput 的麦克风采集和本地音频发送参数。配置会在下一次采集启动时生效;运行中调用 setOptions(...) 会返回错误码。
type TiRtcAudioInputOptions = Readonly<{
codec?: TiRtcAudioCodec; // 本地音频传输编码
sampleRate?: TiRtcAudioSampleRate; // 麦克风采样率
channels?: TiRtcAudioChannelCount; // 声道数;公开能力只支持单声道
aecMode?: TiRtcAudioAecMode; // 回声消除模式
agcLevel?: TiRtcAudioAgcLevel; // 自动增益等级
ansLevel?: TiRtcAudioAnsLevel; // 自动噪声抑制等级
}>;相关取值:
TiRtcAudioCodec.g711a
TiRtcAudioCodec.aac
TiRtcAudioCodec.pcm
TiRtcAudioCodec.opus
TiRtcAudioCodec.amr
TiRtcAudioSampleRate.rate8k
TiRtcAudioSampleRate.rate16k
TiRtcAudioChannelCount.mono
TiRtcAudioAecMode.disabled
TiRtcAudioAecMode.enabledTiRtcAudioInput
TiRtcAudioInput 采集本地麦克风声音,并通过已建立的连接发送给远端设备。常见用途是语音对讲或语音回复。
应用需要自己申请麦克风权限;SDK 不会替应用弹出系统权限申请框。
状态
TiRtcInputState.idle:输入对象已创建,但还没有开始采集。TiRtcInputState.running:正在采集并传输本地音频。TiRtcInputState.stopped:已停止采集;当前绑定仍可保留给后续start()复用。TiRtcInputState.failed:采集或传输路径发生错误。
属性和回调
// 当前本地音频输入状态。
state: TiRtcInputState
// 输入状态变化时触发。
onStateChanged: TiRtcOnInputStateChanged | null
// 本地音频输入发生错误时触发。message 可能为空。
onError: TiRtcOnInputError | null相关类型:
type TiRtcOnInputStateChanged = (
state: TiRtcInputState,
) => void;
type TiRtcOnInputError = (
code: number,
message: string | null,
) => void;方法
// 创建本地音频输入对象。
new TiRtcAudioInput()
// 设置下次采集使用的参数;创建对象后、start 前调用。
// resolve 0 表示成功,非 0 为错误码;正在采集时调用会返回错误码。
setOptions(options: TiRtcAudioInputOptions): Promise<number>
// 把本地麦克风音频通过指定连接和 streamId 发送给远端设备。
// 在 start 前调用;实际发送发生在连接已建立并 start 成功后,streamId 使用 0..15。
// 重复相同绑定返回 0;更换连接或 streamId 前先 detach。
attach(connection: TiRtcConn, streamId: number): Promise<number>
// 开始麦克风采集和传输;resolve 0 表示成功,非 0 为错误码。
// 调用 start 前,应用必须确保已经获得系统麦克风权限;SDK 不负责申请该权限。
// 还没有 attach 时会返回错误码。
start(): Promise<number>
// 停止采集和传输,但保留当前绑定;已经停止时调用也返回 0。
stop(): Promise<number>
// 移除当前连接上的本地音频绑定;停止发送、切换连接或切换 streamId 前调用。
// 运行中先 stop 再 detach。
detach(connection: TiRtcConn): Promise<number>
// 释放本地音频输入对象并清理绑定;通常在 stop 和 detach 后调用。调用后不要再使用这个实例。
dispose(): Promise<number>示例:
const input = new TiRtcAudioInput();
input.onError = (code, message) => {
console.warn(`audio input error: ${TiRtc.formatError(code)} ${message ?? ''}`);
};
const attachCode = await input.attach(conn, 14);
if (attachCode === 0) {
await input.start();
}
// 结束时:
await input.stop();
await input.detach(conn);
await input.dispose();媒体参数快照
音频输出和视频输出可以读取最近解析到的媒体参数:
audioOutput.getDebugSnapshot();
videoOutput.getDebugSnapshot();code === 0 且 snapshot !== null 表示读取成功。音频快照包含音频编码、采样率和声道数;视频快照包含视频编码、码流格式、宽高、解码偏好和实际解码后端。
TiRtcLogging
TiRtcLogging 用于写入应用侧 TiRTC 日志和上传当前 SDK 日志。排查问题时,把上传成功返回的 logId 提供给支持人员。
// 写入应用侧日志。
static d(tag: string, message: string): void
static i(tag: string, message: string): void
static w(tag: string, message: string): void
static e(tag: string, message: string): void
// 上传当前 SDK 日志;code == 0 且 logId != null 表示上传成功。
static upload(): Promise<TiRtcLoggingUploadResult>相关类型:
type TiRtcLoggingUploadResult = Readonly<{
code: number;
logId: string | null;
}>;示例:
const result = await TiRtcLogging.upload();
if (result.code === 0 && result.logId !== null) {
console.info(`TiRTC logId=${result.logId}`);
}资源释放与权限
- SDK 初始化成功后,再创建
TiRtcConn、输出对象或输入对象。 - 对象构造不会发起连接、订阅或采集;创建后即可设置回调、配置参数或调用
attach(...)。 dispose()成功后会释放底层资源。再次调用dispose()是安全的;释放成功后再调用其他实例方法会返回对象已释放错误。- 输出对象释放前先
detach();输入对象释放前先stop()、detach(...)。 - 视图组件只接收 owner 对象,例如
TiRtcVideoOutput;不要保存或传递 native id。 - Android 和 iOS 的麦克风权限由宿主应用负责申请,SDK 不会替应用弹出系统权限申请框。
错误码
下表列出 React Native SDK 公开方法和回调可能返回的全部错误码。0 表示成功;收到非 0 错误码时,找到对应行并按“解决方案”处理。
如果按表处理后问题仍然存在,或者“解决方案”要求上传日志,请按照收集 SDK 日志中的 React Native 示例上传 SDK 日志。联系技术支持时,一并提供错误码、SDK 版本、运行平台、问题发生时间、最短复现步骤和返回的 logId。日志上传失败时,记录上传接口返回的错误码,并按该文档准备其余排查信息。
| 错误码 | 错误说明 | 解决方案 |
|---|---|---|
0 | 操作成功。 | 无需处理。 |
1000 | SDK 的本地库未能加载,当前功能不可用。 | 确认 npm 包和当前平台的 TiRTC 原生依赖已完整集成,清理构建缓存并重新安装应用。 |
1001 | 当前平台操作失败,SDK 无法继续完成当前调用。 | 释放并重新创建相关对象后重试;如果仍然失败,请上传日志并提供错误发生前的调用步骤。 |
1003 | SDK 无法创建或访问日志目录。 | 检查应用存储空间和目录访问状态,确认应用数据目录可写,然后重新初始化 SDK。 |
1005 | SDK 尚未完成初始化。 | 先调用 TiRtc.initialize(...),确认返回 0 后再创建或使用其他对象。 |
1007 | 仍有连接、输入或输出对象未释放,SDK 不能关闭。 | 按输入、输出、连接的顺序停止并释放所有对象,再调用 TiRtc.shutdown()。 |
1008 | 当前 JavaScript 对象对应的原生对象已经释放。 | 不要继续使用该实例;重新创建对象,并避免在 dispose() 后仍发起异步调用。 |
1010 | 当前视频视图已经绑定到其他输出或预览对象。 | 先卸载或解绑原视图,再把视图绑定到新对象;不要让同一个视图同时承载多个输出。 |
1016 | 当前方法必须在主线程调用。 | 在 React Native 界面生命周期有效时执行预览或视图绑定,不要从后台线程直接调用原生视图操作。 |
1201 | Android 相机不可用。 | 确认设备存在目标相机、相机未被其他应用占用且权限已授予;必要时切换前后摄像头。 |
1202 | Android 麦克风不可用。 | 确认麦克风权限已授予、设备麦克风可用且未被其他应用独占,然后重新创建音频输入。 |
1203 | Android 视频渲染目标不可用。 | 等待 React Native 视频组件完成挂载后重新绑定;组件卸载时及时释放对应对象。 |
1204 | Android 视频输出与渲染目标绑定失败。 | 先卸载旧视图并重新挂载视频组件;仍失败时重新创建视频输出。 |
1205 | Android 相机采集或编码链路启动失败。 | 检查相机权限和占用情况,降低分辨率、帧率或码率后重试;仍失败时上传日志。 |
1301 | iOS 上当前操作需要的连接不可用。 | 确认连接对象尚未释放且已经连接;必要时重新创建并建立连接。 |
1302 | iOS 上当前操作需要的对象绑定不存在或已经失效。 | 重新执行对应的 attach(...),确认成功后再继续。 |
1303 | iOS 上当前操作需要的对象不可用。 | 检查对象是否已经释放以及调用顺序是否正确,重新创建相关对象后重试。 |
6000 | 传入的参数、取值范围或对象关系不合法。 | 对照当前方法说明检查必填参数、数值范围、streamId、数据长度和对象绑定关系。 |
6001 | SDK 尚未初始化。 | 先调用 TiRtc.initialize(...),确认返回 0 后再调用其他 API。 |
6004 | 当前运行环境不支持 SDK 需要的任务调度方式。 | 确认使用了适配当前平台和系统版本的 SDK;如果没有修改过相关运行配置,请上传日志。 |
6005 | SDK 组件版本不一致,完整性校验未通过。 | 确认 npm 包及 Android、iOS TiRTC 依赖来自同一版本,清理缓存并重新构建、安装应用。 |
6006 | 目标对象已经停止。 | 无需重复停止;如需继续使用,按文档重新配置并启动对象。 |
6007 | 目标对象已经销毁。 | 重新创建对象,不要继续持有或调用已经销毁的实例。 |
6008 | 当前应用或设备的 TiRTC 授权无效。 | 核对使用的应用、设备和授权信息;确认无误后联系技术支持检查授权状态。 |
6009 | 当前传输操作等待超时。 | 检查客户端与设备端网络,确认远端在线;网络恢复后重试,连接已断开时重新连接。 |
6010 | 传输通道正忙,常见原因是发送过快或缓冲区已满。 | 降低发送频率或单次数据量,等待通道恢复后重试,避免无间隔地连续重发。 |
6011 | 连接因心跳或等待响应超时而关闭。 | 检查网络连通性和远端运行状态,获取仍然有效的 token 后重新连接。 |
6012 | 远端主动关闭了连接。 | 确认远端是否退出或重启;需要继续通信时,等待远端恢复后重新连接。 |
6013 | 连接因其他传输错误关闭。 | 检查网络和远端状态后重新连接;如果频繁出现,请上传双方日志。 |
6014 | 连接使用的 token 已过期。 | 从业务服务端重新获取 token,再发起连接;不要重复使用已过期的 token。 |
6015 | SDK 无法访问日志或诊断文件目录。 | 检查应用存储空间和目录可写状态,修复后重新初始化或重新执行日志操作。 |
6016 | 日志或媒体数据导出任务已经在进行。 | 等待当前任务结束后再启动下一次,不要同时发起重复导出。 |
6017 | 传输资源不足,无法继续创建连接或处理数据。 | 释放不再使用的连接和媒体对象,降低并发量,等待资源恢复后重试。 |
6018 | 云端服务返回错误。 | 稍后重试;如果持续失败,请确认服务状态并上传日志。 |
6019 | SDK 处理网络连接时发生内部错误。 | 断开并重新建立连接;仍然失败时上传日志,并提供发生时间和远端标识。 |
6020 | 当前连接方式缺少必需的密钥。 | 在建立连接或启动连接服务前补充文档要求的凭据;如果当前场景不需要配置密钥,请上传日志。 |
6021 | 收到的服务端响应无法识别。 | 检查自定义服务地址和网络代理是否正确,升级到最新 SDK 后重试;仍失败时上传日志。 |
6022 | SDK 已经初始化。 | 复用当前 SDK 实例,不要在同一生命周期内重复初始化或替换初始化参数。 |
6023 | 当前方法不能从所在线程调用。 | 按对应方法要求切换到主线程或对象所属线程后重试。 |
6024 | 当前操作没有获得所需权限。 | 在宿主应用中申请并确认相机、麦克风或存储等相关权限已经授予。 |
6025 | 当前对象已经绑定。 | 复用现有绑定,或先调用对应的 detach(...),成功后再绑定新对象。 |
6026 | 当前对象正在使用,不能执行本次操作。 | 先停止采集或播放并解除现有绑定,等待进行中的调用完成后再重试。 |
6027 | 当前对象尚未启动。 | 先完成配置和绑定,再调用对应的启动方法。 |
6028 | 连接尚未建立。 | 等待连接状态进入 connected 后再发送、订阅或启动已绑定的输入。 |
6029 | 当前输入或输出对象尚未绑定。 | 先调用对应的 attach(...),确认成功后再启动或处理媒体。 |
6030 | 当前对象尚未完成必要配置。 | 先设置当前功能要求的参数,确认配置成功后再启动。 |
6031 | 当前设备或媒体通道尚未打开。 | 先调用对应的打开或启动方法;如果已经调用过,请检查前一步的返回值。 |
6032 | 初始化缺少 AppId。 | 传入有效且非空的 AppId,再重新初始化 SDK。 |
6033 | 当前设备没有可用的视频编码能力。 | 尝试降低分辨率和帧率、改用其他编码格式,或更换支持该能力的设备。 |
6034 | 当前视频编码格式不受支持。 | 改用 SDK 和当前设备共同支持的视频编码格式。 |
6035 | 视频编码器初始化失败。 | 降低分辨率、帧率或码率,切换编码格式后重新创建视频输入;仍失败时上传日志。 |
6036 | 当前视频流的编码格式无法解码。 | 让远端改用受支持的编码格式,或切换当前设备可用的解码方式。 |
6037 | 当前设备没有可用的视频解码能力。 | 尝试切换软硬件解码偏好、降低视频规格,或更换支持该格式的设备。 |
6038 | 视频解码器初始化失败。 | 重新创建视频输出并重试;仍失败时切换解码偏好或降低远端视频规格。 |
6039 | 视频解码器无法使用当前码流配置。 | 确认远端发送完整、受支持的码流,重新订阅并请求关键帧;仍失败时检查发送端配置。 |
6040 | 视频解码过程中发生错误。 | 请求关键帧或重新创建视频输出;如果持续出现,请上传日志并检查远端码流。 |
6041 | 视频输出没有可用的渲染目标。 | 挂载并保持有效的视频组件后重新绑定,组件卸载时及时释放对应对象。 |
6042 | 视频帧渲染失败。 | 确认视频组件仍然挂载,重新绑定或重新创建视频输出。 |
6043 | SDK 可用资源不足。 | 释放不再使用的对象,降低并发连接、分辨率或缓冲规模后重试。 |
6044 | 无法打开所需文件。 | 检查文件是否存在、路径是否正确以及应用是否有访问权限。 |
6045 | 读取文件失败。 | 确认文件完整、可读且存储设备状态正常,然后重试。 |
6046 | 写入文件失败。 | 确认目标目录可写且剩余空间充足,清理空间后重试。 |
6047 | HTTP 请求失败。 | 检查网络、自定义服务地址、代理和证书配置,网络恢复后重试。 |
6048 | 导出日志失败。 | 检查日志目录和可用存储空间,结束其他导出任务后重试。 |
6049 | 上传日志失败。 | 检查网络后重新上传;仍然失败时,记录本错误码,并按照收集 SDK 日志准备其余排查信息。 |
6050 | 上传文件到存储服务失败。 | 检查网络并重新发起上传;如果凭证已过期,请重新开始整个上传流程。 |
6051 | 无法打开麦克风输入。 | 确认麦克风权限已授予、麦克风未被其他应用占用,然后重新创建音频输入。 |
6052 | 麦克风采集过程中发生错误。 | 停止并重新创建音频输入,检查系统音频设备和路由;仍失败时上传日志。 |
6053 | 无法打开音频播放设备。 | 检查系统音频设备和音频会话是否可用,然后重新创建音频输出。 |
6054 | 音频播放过程中发生错误。 | 重新创建音频输出并检查系统音频会话和路由;仍失败时上传日志。 |
6055 | 音频处理模块初始化失败。 | 检查采样率、声道数和音频处理参数组合,改用受支持的配置后重试。 |
6056 | 音频处理过程中发生错误。 | 重新创建音频输入或输出;可先关闭可选音频处理能力以确认问题范围。 |
6057 | 视频编码过程中发生错误。 | 降低视频规格并重新创建视频输入;仍失败时切换编码格式或上传日志。 |
6058 | 视频预处理过程中发生错误。 | 重新创建视频输入并降低分辨率或帧率;仍失败时上传日志。 |
6059 | 无法打开摄像头。 | 确认相机权限已授予、摄像头未被占用,并检查所选前后摄像头是否存在。 |
6060 | 摄像头采集过程中发生错误。 | 停止并重新创建视频输入;检查相机是否被系统或其他应用中断。 |
6061 | 无法打开视频输出。 | 确认视频组件和解码配置有效,重新创建并绑定视频输出。 |
6062 | 无法创建本地音视频发送通道。 | 确认连接、输入对象和媒体参数有效,释放旧对象后重新创建并绑定。 |
6063 | 本地音视频发送通道启动失败。 | 等待连接成功并确认输入已经绑定,然后重新启动输入。 |
6064 | 下行视频或音频数据解码失败。 | 确认远端发送受支持且完整的媒体数据,重新订阅或重新创建输出。 |
6065 | 保存诊断用的原始媒体数据失败。 | 检查目标目录权限和剩余空间,停止其他导出任务后重试。 |
6066 | SDK 在处理当前操作时发生内部错误。 | 释放并重新创建相关对象后重试;如果仍然失败,请上传日志。 |
6067 | SDK 日志写入失败。 | 检查日志目录是否可写以及存储空间是否充足,修复后重新初始化。 |
6068 | 音频编码过程中发生错误。 | 检查音频参数,重新创建音频输入;仍失败时切换编码格式或上传日志。 |
6069 | 音频解码过程中发生错误。 | 确认远端音频格式受支持,重新订阅或重新创建音频输出。 |
6070 | 当前 SDK 或系统环境没有可用的 HTTP 客户端。 | 使用包含网络能力的正式 SDK 包并确认系统网络组件可用;仍失败时联系技术支持。 |
6071 | 当前环境不支持 HTTPS/TLS 请求。 | 升级系统或 SDK,或改用支持 TLS 的运行环境;不要绕过生产环境的安全连接要求。 |
6072 | 日志上传凭证已经过期。 | 重新调用日志上传接口,让 SDK 获取新的上传凭证。 |
6074 | 本地视频预览已经被其他对象占用。 | 先解除已有预览绑定,再把预览绑定到当前视频输入。 |
6075 | 当前连接还没有可用的远端标识。 | 等待连接完全建立后再绑定媒体;连接已断开时重新连接。 |
6076 | 接收的媒体数据已经积压,当前设备处理速度跟不上接收速度。 | 降低远端码率、分辨率或帧率,减少同时播放的流,并检查设备负载。 |
6077 | 接收媒体的播放或渲染目标尚未就绪。 | 确认视频组件或音频输出已经准备好并保持有效,等待目标就绪后再继续。 |
6078 | 连接对象无效或已经失效。 | 停止使用旧连接对象,重新创建并建立连接,再重新绑定输入输出。 |
6079 | 视频编码器暂时无法接收新的画面。 | 降低本地视频帧率或分辨率,停止并重新创建视频输入;不要立即连续重试。 |
6080 | 视频编码结果尚未就绪。 | 等待后重试;如果持续出现,请降低本地视频规格并重新创建视频输入。 |
6081 | 视频解码器暂时不能接收当前数据,或还在等待完整的码流参数。 | 重新订阅或请求关键帧;持续出现时重新创建视频输出并降低远端视频规格。 |
6082 | 视频解码结果尚未就绪。 | 等待后重试;持续出现时请求关键帧并重新创建视频输出。 |
6083 | 当前视频输入模式与创建对象时使用的模式不一致。 | 停止并重新创建视频输入;如果没有切换过输入模式,请上传日志。 |
6084 | 发起连接失败,连接请求没有正常进入执行阶段。 | 检查 remoteId、token、当前连接状态和网络;必要时重新创建连接对象。 |
6085 | 当前连接状态不允许执行断开操作。 | 等待正在进行的连接或断开流程结束,再根据最新状态决定是否重试。 |
6086 | HTTP 传输过程失败。 | 检查网络、代理、DNS 和证书配置,恢复后重新执行当前网络操作。 |
6087 | 日志上传服务返回的地址信息无效。 | 确认服务地址和网络代理正确,升级 SDK 后重试;仍然失败时,记录本错误码,并按照收集 SDK 日志准备其余排查信息。 |
6088 | 日志上传服务返回的凭证信息无效。 | 重新发起日志上传;持续失败时,记录本错误码,并按照收集 SDK 日志准备其余排查信息。 |
6089 | 传输服务返回了当前 SDK 无法识别的状态。 | 升级 SDK 并重新连接;仍失败时上传日志,提供发生时间和远端标识。 |
6090 | 传输服务报告了其他连接错误。 | 检查网络和远端状态后重新连接;如果频繁出现,请上传双方日志。 |
6091 | 当前操作所需的对象不可用。 | 检查对象是否已经释放以及调用顺序是否正确,重新创建相关对象后重试。 |
6092 | 音频处理模块的当前状态不允许执行该操作。 | 按“配置—绑定—启动”的顺序调用;需要改配置时先停止当前输入或输出。 |
6093 | 音频处理参数配置失败。 | 改用文档支持的采样率、声道数和处理级别组合后重试。 |
6094 | 音频数据处理失败。 | 重新创建音频对象;可先关闭可选音频处理能力,仍失败时上传日志。 |
6095 | 视频编码器的当前状态不允许执行该操作。 | 按正确顺序配置并启动编码;需要改参数时先停止并重新创建视频输入。 |
6096 | 视频编码器拒绝了当前画面。 | 降低本地视频分辨率或帧率并重新创建视频输入;不要立即连续重试。 |
6097 | 无法取得视频编码结果。 | 重新创建视频输入并降低编码负载;仍失败时上传日志。 |
6098 | 视频编码结果转换失败。 | 改用受支持的编码格式和视频参数,重新创建视频输入后重试。 |
6099 | 视频编码器无法执行当前控制请求。 | 减少运行中参数切换,停止后重新配置并创建编码输入。 |
6100 | 视频解码器的当前状态不允许执行该操作。 | 重新创建视频输出,等待其完成初始化后再送入媒体数据。 |
6101 | 视频解码器拒绝了当前输入数据。 | 确认码流格式正确并包含必要的关键帧,重新订阅或请求关键帧后重试。 |
6102 | 无法取得视频解码结果。 | 重新创建视频输出并降低解码负载;仍失败时上传日志。 |
6103 | 视频解码结果转换失败。 | 改用受支持的输出格式或解码方式,重新创建视频输出。 |
6104 | 视频解码输出释放失败。 | 重新创建视频输出;如果持续失败,请上传日志。 |
6105 | SDK 的网络连接能力尚未完成初始化。 | 先完成 SDK 初始化;初始化已经成功时,重新创建连接对象后再试。 |
6106 | 当前连接方式不受支持。 | 改用 SDK 支持或默认的连接方式,确认初始化和网络配置后重新连接。 |