Skip to content

iOS API 说明

Darwin SDK TiRTC 提供 iOS Swift / Objective-C 客户端 API,适用于在 iOS 原生应用中接入 TiRTC。

如果你还没有完成 SDK 引入、工程配置或连接流程准备,先看 iOS SDK 接入

生命周期与调用顺序

典型客户端流程是:连接一个设备端,播放设备端音视频,并按需收发命令或发起语音对讲。主干从 TiRtc.initialize(...) 开始,以 disconnect()dispose() 收尾。

  1. 初始化:传入 AppId,启动 SDK 运行时。

    swift
    let options = TiRtcInitOptions(appId: appId)
    _ = TiRtc.initialize(options)
  2. 创建连接:创建 TiRtcConn,并在连接前设置连接回调 delegate;业务侧需要自己持有 delegate 对象。

    swift
    let conn = TiRtcConn()
    conn.delegate = connDelegate
  3. 准备播放:在发起连接前创建音频输出和视频输出,并指定要播放的 streamId

    swift
    let audioOutput = TiRtcAudioOutput()
    _ = audioOutput.attach(connection: conn, streamId: audioStreamId)
    
    let videoOutput = TiRtcVideoOutput()
    _ = videoOutput.attach(connection: conn, streamId: videoStreamId)
  4. 渲染视频:在主线程把视频输出挂到 iOS 视图中,让视频输出有对应的显示位置。

    swift
    _ = videoOutput.attachView(videoView)
  5. 发起连接:传入目标设备的 device_id 和业务服务端签发的 token

    swift
    _ = conn.connect(remoteId: remoteId, token: token)
  6. 请求媒体:连接进入 connected 后,按需请求设备端发送音频流和视频流。

    swift
    _ = conn.subscribeAudio(streamId: audioStreamId) // 连接成功后订阅音频
    _ = conn.subscribeVideo(streamId: videoStreamId) // 连接成功后订阅视频
  7. 命令交互:连接进入 connected 后,按需通过命令通道和设备端交换业务数据。

    swift
    _ = conn.sendCommand(commandId: commandId, data: data) // 需要命令交互时调用
    // 收到设备端命令时,在 conn(_:didReceiveCommand:data:) 中处理。
  8. 语音对讲(按需):应用获得系统麦克风权限后,创建音频输入,绑定到同一条连接,并启动采集发送。

    swift
    let talkbackInput = TiRtcAudioInput()
    _ = talkbackInput.setOptions(talkbackOptions)
    _ = talkbackInput.attach(connection: conn, streamId: talkbackStreamId)
    _ = talkbackInput.start()
  9. 收尾释放:业务结束时先释放按需创建的输入对象,再按订阅、输出、连接的顺序收尾。

    swift
    _ = talkbackInput.stop() // 创建了 talkbackInput 时调用
    _ = talkbackInput.detach(connection: conn)
    talkbackInput.dispose()
    
    _ = conn.unsubscribeAudio(streamId: audioStreamId) // 停止播放时取消音频订阅
    _ = conn.unsubscribeVideo(streamId: videoStreamId) // 停止播放时取消视频订阅
    
    _ = audioOutput.detach()
    _ = videoOutput.detach()
    _ = videoOutput.detachView()
    audioOutput.dispose()
    videoOutput.dispose()
    
    _ = conn.disconnect()
    conn.dispose()

TiRtcInitOptions

TiRtcInitOptionsTiRtc.initialize(_:) 的参数对象。

初始化时必须传 appId,取值为你的 AppId

swift
// 创建初始化参数;appId 必填。
let options = TiRtcInitOptions(appId: "your-app-id")

// 切换自部署云端实例或测试、联调环境时设置,例如 "https://ep-tirtc.my-domain.com";其他情况保持空字符串。
options.endpoint = ""

// true 时同时把 SDK 日志打印到控制台。
options.consoleLogEnabled = false

TiRtc

TiRtc 提供初始化和错误码名称转换入口。

swift
// 初始化 SDK。返回 0 表示成功,非 0 为错误码。
static func initialize(_ config: TiRtcInitOptions) -> Int32

// 把错误码转成错误名称。
static func errorToString(_ code: Int32) -> String

示例:

swift
let options = TiRtcInitOptions(appId: "your-app-id")
let code = TiRtc.initialize(options)
if code != 0 {
    print("initialize failed: \(TiRtc.errorToString(code)) (\(code))")
}

TiRtcConn

TiRtcConn 表示客户端到远端设备的一条连接。创建对象不会立即发起连接;通常先设置 delegate,再调用 connect(...)。连接建立后,可以通过它发送命令、发送流消息、发起媒体订阅和请求视频关键帧。

音频播放和视频显示由 TiRtcAudioOutput / TiRtcVideoOutput 负责,TiRtcConn 本身不播放也不显示媒体。

状态

  • TiRtcConnState.idle:连接对象已创建,但还没有开始连接。
  • TiRtcConnState.connecting:连接请求已提交,正在等待结果。
  • TiRtcConnState.connected:连接已经建立,可收发命令、流消息,发起媒体订阅和关键帧请求。
  • TiRtcConnState.disconnected:连接失败、对端断开或调用 disconnect() 后进入该状态。

属性和 delegate

swift
// 当前连接状态。
var state: TiRtcConnState { get }

// 连接回调入口,SDK 弱引用持有;调用方需要自己持有 delegate 对象。
weak var delegate: TiRtcConnDelegate?

相关类型:

swift
@objc public protocol TiRtcConnDelegate: NSObjectProtocol {
    // 连接状态变化时触发。errorCode 为 0 表示本次状态变化没有错误;非 0 为错误码。
    @objc optional func conn(
        _ conn: TiRtcConn,
        didChangeState state: TiRtcConnState,
        errorCode: Int32
    )

    // 收到设备端命令时触发。
    @objc optional func conn(
        _ conn: TiRtcConn,
        didReceiveCommand commandId: UInt32,
        data: Data
    )

    // 收到设备端的流消息时触发。
    @objc optional func conn(
        _ conn: TiRtcConn,
        didReceiveStreamMessage streamId: UInt8,
        timestampMs: UInt32,
        data: Data
    )
}

delegate 回调会切回主线程分发。

方法

swift
// 创建连接对象;构造函数本身不会发起连接。通常先设置 delegate,再调用 connect。
init(delegate: TiRtcConnDelegate? = nil)

// 发起连接;初始化完成并拿到连接凭证后调用。
// remoteId 是连接目标;连接设备端时传目标设备的 device_id,例如 "PRODFENGXXXX"。
// token 是业务服务端为本次连接签发的 token,二者不能为空。
// 返回 0 只表示请求已提交,最终连接结果看 delegate;非 0 为错误码。
func connect(remoteId: String, token: String) -> Int32

// 断开当前连接;业务结束、切换设备或重新连接前调用。对象仍可重新 connect。
func disconnect() -> Int32

// 释放连接对象;确认不再使用这条连接后调用。调用后不要再使用这个实例。
func dispose()

// 在命令通道上发送自定义命令;连接进入 connected 后调用。
func sendCommand(commandId: UInt32, data: Data) -> Int32

// 发送流消息;连接进入 connected 后调用。
// streamId 按 stream_id 约定使用 0..15,两端需要提前约定消息语义。
func sendStreamMessage(streamId: UInt8, timestampMs: UInt32, data: Data) -> Int32

// 请求远端开始发送指定 streamId 的音频流;连接进入 connected 后调用。
// streamId 按 stream_id 约定使用 0..15。
// 这个方法只请求远端发送音频,不会自动播放。
// 播放远端音频前,先调用 TiRtcAudioOutput.attach(...) 指定要播放的 connection 和 streamId;然后调用 connect(...) 建立连接。
// 连接成功后,再调用 subscribeAudio(...) 请求远端发送这路音频。
func subscribeAudio(streamId: UInt8) -> Int32

// 请求远端停止发送指定 streamId 的音频流;streamId 按 stream_id 约定使用 0..15。
// 不会停止已经创建的 TiRtcAudioOutput。停止播放时再调用 TiRtcAudioOutput.detach()。
func unsubscribeAudio(streamId: UInt8) -> Int32

// 请求远端开始发送指定 streamId 的视频流;连接进入 connected 后调用。
// streamId 按 stream_id 约定使用 0..15。
// 这个方法只请求远端发送视频,不会自动显示。
// 显示远端视频前,先调用 TiRtcVideoOutput.attach(...) 指定要显示的 connection 和 streamId;然后调用 connect(...) 建立连接。
// 连接成功后,再调用 subscribeVideo(...) 请求远端发送这路视频。
func subscribeVideo(streamId: UInt8) -> Int32

// 请求远端停止发送指定 streamId 的视频流;streamId 按 stream_id 约定使用 0..15。
// 不会停止已经创建的 TiRtcVideoOutput。停止显示时再调用 TiRtcVideoOutput.detach()。
func unsubscribeVideo(streamId: UInt8) -> Int32

// 向远端请求指定视频流的关键帧;连接已建立且远端正在发送该视频流时调用。
// streamId 按 stream_id 约定使用 0..15。
func requestKeyFrame(streamId: UInt8) -> Int32

示例:

swift
let conn = TiRtcConn()

let code = conn.connect(remoteId: remoteId, token: token)
if code != 0 {
    print("connect failed: \(TiRtc.errorToString(code)) (\(code))")
}

// 结束时:
_ = conn.disconnect()
conn.dispose()

TiRtcAudioOutputOptions

TiRtcAudioOutputOptions 配置 TiRtcAudioOutput 的音频输出参数。只需要填写要覆盖默认值的字段。

swift
let options = TiRtcAudioOutputOptions()
options.agcLevel = 0 // 自动增益等级:0 关闭,1 低,2 中,3 高
options.ansLevel = 0 // 自动噪声抑制等级:0 关闭,1 低,2 中,3 高
options.bufferStrategy = .automatic // 输出缓冲策略
// 最大输出缓冲水位,单位为毫秒;仅 .automatic 有效。
// nil 表示由 SDK 自动决定。
options.maxBufferWatermarkMs = nil

相关枚举:

swift
// 输出缓冲策略。
enum TiRtcOutputBufferStrategy {
    case automatic // SDK 根据当前平台和链路状态决定缓冲策略
    case noBuffer // 不使用输出缓冲;不要同时设置 maxBufferWatermarkMs
}

TiRtcAudioOutput

TiRtcAudioOutput 用来播放某条远端音频流。 播放远端音频前,先创建 TiRtcAudioOutput,调用 attach(...) 指定要播放的 connectionstreamId,再调用 connect(...) 建立连接;连接成功后,调用 TiRtcConn.subscribeAudio(...) 请求远端发送这路音频。 attach(...) 成功只表示播放对象已经知道要播放哪路音频。如果远端还没有发送这路音频,用户仍然听不到声音。 attach(...) 只选择这路音频由哪个 TiRtcAudioOutput 播放;subscribeAudio(...) 才会请求远端发送。

状态

  • TiRtcAudioOutputState.idle:还没有选择要播放的远端音频流,或已经 detach()
  • TiRtcAudioOutputState.buffering:已经选择要播放的远端音频流,正在等待可播放数据。
  • TiRtcAudioOutputState.playing:正在播放远端音频。
  • TiRtcAudioOutputState.failed:播放路径发生错误。

属性和 delegate

swift
// 当前音频播放状态。
var state: TiRtcAudioOutputState { get }

// 音频输出回调入口,SDK 弱引用持有;调用方需要自己持有 delegate 对象。
weak var delegate: TiRtcAudioOutputDelegate?

相关类型:

swift
@objc public protocol TiRtcAudioOutputDelegate: NSObjectProtocol {
    // 播放状态变化时触发。
    @objc optional func audioOutput(
        _ output: TiRtcAudioOutput,
        didChangeState state: TiRtcAudioOutputState
    )

    // 音频输出对象发生错误时触发。message 可能为空。
    @objc optional func audioOutput(
        _ output: TiRtcAudioOutput,
        didFailWithCode code: Int32,
        message: String?
    )
}

delegate 回调会切回主线程分发。

方法

swift
// 创建音频输出对象。
TiRtcAudioOutput()

// 配置音频输出参数;创建对象后、attach 前调用。
// 返回 0 表示成功,非 0 为错误码;已绑定后调用会返回错误码。
func configure(_ options: TiRtcAudioOutputOptions) -> Int32

// 设置当前输出实例的相对播放音量;可以在 attach 前或播放过程中调用。
// volumePercent 的取值范围为 0...100:0 表示静音,100 表示恢复原始音量。
// 静音不会停止音频流,也不会修改系统输出音量。
// 返回 0 表示成功,非 0 为错误码。
func setVolume(_ volumePercent: UInt32) -> Int32

// 指定这个输出对象要播放的远端音频流。通常在 connect 前调用;如果输出对象晚创建,也可以在连接建立后调用。
// 远端发送这路音频后,用户才会听到声音。
func attach(connection: TiRtcConn, streamId: UInt8) -> Int32

// 停止使用这个输出对象播放当前音频流;切换流或释放对象前调用。成功后状态回到 idle。
func detach() -> Int32

// 释放音频输出对象;通常在 detach 后调用。调用后不要再使用这个实例。
func dispose()

示例:

swift
let audioOutput = TiRtcAudioOutput()

let code = audioOutput.attach(connection: conn, streamId: 10)
if code != 0 {
    print("audio attach failed: \(TiRtc.errorToString(code)) (\(code))")
}

// 只调整当前 audioOutput,不修改系统输出音量。
_ = audioOutput.setVolume(0)   // 静音
_ = audioOutput.setVolume(100) // 恢复原始音量

// 结束时:
_ = audioOutput.detach()
audioOutput.dispose()

TiRtcVideoOutputOptions

TiRtcVideoOutputOptions 配置 TiRtcVideoOutput 的解码和缓冲参数。只需要填写要覆盖默认值的字段。

swift
let options = TiRtcVideoOutputOptions()
// 解码偏好:0 自动,1 软件解码,2 硬件解码。
// 这只是请求偏好,实际选择取决于设备、系统和视频编码格式。
options.decoderPreference = 0
options.bufferStrategy = .automatic // 输出缓冲策略
// 最大输出缓冲水位,单位为毫秒;仅 .automatic 有效。
// nil 表示由 SDK 自动决定。
options.maxBufferWatermarkMs = nil

相关枚举:

swift
// 输出缓冲策略。
enum TiRtcOutputBufferStrategy {
    case automatic // SDK 根据当前平台和链路状态决定缓冲策略
    case noBuffer // 不使用输出缓冲;不要同时设置 maxBufferWatermarkMs
}

TiRtcVideoOutput

TiRtcVideoOutput 用来显示某条远端视频流。 显示远端视频前,先创建 TiRtcVideoOutput,调用 attach(...) 指定要显示的 connectionstreamId,并调用 attachView(...) 选择画面显示到哪个 iOS 视图,再调用 connect(...) 建立连接;连接成功后,调用 TiRtcConn.subscribeVideo(...) 请求远端发送这路视频。 attach(...) 成功只表示输出对象已经知道要显示哪路视频。如果远端还没有发送这路视频,视图不会出画面。 attach(...) 只选择这路视频由哪个 TiRtcVideoOutput 显示;subscribeVideo(...) 才会请求远端发送。

状态

  • TiRtcVideoOutputState.idle:还没有选择要显示的远端视频流,或已经 detach()
  • TiRtcVideoOutputState.buffering:已经选择要显示的远端视频流,正在等待可渲染数据或渲染视图准备。
  • TiRtcVideoOutputState.rendering:正在渲染远端视频。
  • TiRtcVideoOutputState.failed:视频输出路径发生错误。

属性和 delegate

swift
// 当前视频播放状态。
var state: TiRtcVideoOutputState { get }

// 最近一次远端画面渲染尺寸。还没有画面时为 .zero。
var renderSize: CGSize { get }

// 视频输出回调入口,SDK 弱引用持有;调用方需要自己持有 delegate 对象。
weak var delegate: TiRtcVideoOutputDelegate?

相关类型:

swift
// iOS 下 TiRtcPlatformView 是 UIView。
typealias TiRtcPlatformView = UIView

@objc public protocol TiRtcVideoOutputDelegate: NSObjectProtocol {
    // 播放状态变化时触发。
    @objc optional func videoOutput(
        _ output: TiRtcVideoOutput,
        didChangeState state: TiRtcVideoOutputState
    )

    // 远端画面尺寸变化时触发。
    @objc optional func videoOutput(
        _ output: TiRtcVideoOutput,
        didChangeRenderSize size: CGSize
    )

    // 视频输出对象发生错误时触发。message 可能为空。
    @objc optional func videoOutput(
        _ output: TiRtcVideoOutput,
        didFailWithCode code: Int32,
        message: String?
    )
}

delegate 回调会切回主线程分发。

方法

swift
// 创建视频输出对象。
TiRtcVideoOutput()

// 设置视频输出参数;创建对象后、attach 前调用。
// 返回 0 表示成功,非 0 为错误码;需要修改参数时先 detach,再重新 setOptions 和 attach。
func setOptions(_ options: TiRtcVideoOutputOptions) -> Int32

// 指定这个输出对象要显示的远端视频流。通常在 connect 前调用;如果输出对象晚创建,也可以在连接建立后调用。
// 远端发送这路视频后,页面才会出画面。
func attach(connection: TiRtcConn, streamId: UInt8) -> Int32

// 停止使用这个输出对象显示当前视频流;切换流或释放对象前调用。成功后状态回到 idle。
func detach() -> Int32

// 指定远端视频显示到哪个 iOS 视图;需要显示远端视频时调用。必须在主线程调用。
func attachView(_ view: TiRtcPlatformView) -> Int32

// 停止把画面显示到当前视图,但不改变 attach(...) 选择的远端视频流;隐藏或销毁视图前调用。
func detachView() -> Int32

// 释放视频输出对象和相关系统资源;通常在 detach 和 detachView 后调用。调用后不要再使用这个实例。
func dispose()

示例:

swift
let videoOutput = TiRtcVideoOutput()

_ = videoOutput.attachView(videoView)

let code = videoOutput.attach(connection: conn, streamId: 11)
if code != 0 {
    print("video attach failed: \(TiRtc.errorToString(code)) (\(code))")
}

// 结束时:
_ = videoOutput.detach()
_ = videoOutput.detachView()
videoOutput.dispose()

TiRtcAudioInputOptions

TiRtcAudioInputOptions 配置 TiRtcAudioInput 的麦克风采集和本地音频发送参数。配置会在下一次采集启动时生效;运行中调用 setOptions(...) 会返回错误码。

swift
let options = TiRtcAudioInputOptions()
options.codec = .g711a // 本地音频传输编码
options.sampleRate = .rate16k // 麦克风采样率
options.channels = .mono // 声道数;公开能力只支持单声道
options.aecMode = 0 // 回声消除模式:0 关闭,1 开启
options.agcLevel = 0 // 自动增益等级:0 关闭,1 低,2 中,3 高
options.ansLevel = 0 // 自动噪声抑制等级:0 关闭,1 低,2 中,3 高

相关枚举:

swift
// 本地音频传输编码。
enum TiRtcAudioCodec {
    case g711a
    case aac
    case pcm
    case opus
    case amr // AMR-NB
}

// 麦克风采样率。
enum TiRtcAudioSampleRate {
    case rate8k
    case rate16k
}

// 声道数。公开能力只支持单声道。
enum TiRtcAudioChannelCount {
    case mono
}

TiRtcAudioInput

TiRtcAudioInput 采集本地麦克风声音,并通过已建立的连接发送给远端设备。常见用途是语音对讲或语音回复。

应用需要自己申请麦克风权限;SDK 不会替应用弹出系统权限申请框。

状态

  • TiRtcInputState.idle:输入对象已创建,但还没有开始采集。
  • TiRtcInputState.running:正在采集并传输本地音频。
  • TiRtcInputState.stopped:已停止采集;当前绑定仍可保留给后续 start() 复用。
  • TiRtcInputState.failed:采集或传输路径发生错误。

属性和 delegate

swift
// 当前本地音频输入状态。
var state: TiRtcInputState { get }

// 本地音频输入回调入口,SDK 弱引用持有;调用方需要自己持有 delegate 对象。
weak var delegate: TiRtcAudioInputDelegate?

相关类型:

swift
@objc public protocol TiRtcAudioInputDelegate: AnyObject {
    // 输入状态变化时触发。
    @objc optional func audioInput(
        _ input: TiRtcAudioInput,
        didChangeState state: TiRtcInputState
    )

    // 本地音频输入发生错误时触发。message 可能为空。
    @objc optional func audioInput(
        _ input: TiRtcAudioInput,
        didFailWithCode code: Int32,
        message: String?
    )
}

delegate 回调会切回主线程分发。

方法

swift
// 创建本地音频输入对象。
TiRtcAudioInput()

// 设置下次采集使用的参数;创建对象后、start 前调用。
// 返回 0 表示成功,非 0 为错误码;正在采集时调用会返回错误码。
func setOptions(_ options: TiRtcAudioInputOptions) -> Int32

// 把本地麦克风音频通过指定连接和 streamId 发送给远端设备。
// 连接必须已进入 connected;在 start 前调用,streamId 使用 0..15。
func attach(connection: TiRtcConn, streamId: UInt8) -> Int32

// 开始麦克风采集和传输;返回 0 表示成功,非 0 为错误码。
// 调用 start 前,应用必须确保已经获得系统麦克风权限;SDK 不负责申请该权限。
// 还没有 attach 时会返回错误码。
func start() -> Int32

// 停止采集和传输,但保留当前绑定;暂停对讲或 detach 前调用。
func stop() -> Int32

// 移除当前连接上的本地音频绑定;停止发送、切换连接或切换 streamId 前调用。
// 运行中先 stop 再 detach。
func detach(connection: TiRtcConn) -> Int32

// 释放本地音频输入对象并清理绑定;通常在 stop 和 detach 后调用。调用后不要再使用这个实例。
func dispose()

示例:

swift
let input = TiRtcAudioInput()

let attachCode = input.attach(connection: conn, streamId: 14)
if attachCode == 0 {
    _ = input.start()
}

// 结束时:
_ = input.stop()
_ = input.detach(connection: conn)
input.dispose()

TiRtcLogging

TiRtcLogging 用于上传当前 SDK 日志。排查问题时,把上传成功返回的 logId 提供给支持人员。

swift
// 异步上传当前 SDK 日志。
// 返回 0 只表示上传任务已经开始,结果通过 completion 返回。
static func upload(completion: @escaping (TiRtcLogUploadResult) -> Void) -> Int32

相关类型:

swift
final class TiRtcLogUploadResult {
    let code: Int32
    let logId: String?

    // true 表示上传成功并拿到可用 logId。
    var succeeded: Bool { get }
}

示例:

swift
TiRtcLogging.upload { result in
    if result.succeeded, let logId = result.logId {
        print("TiRTC logId=\(logId)")
    }
}

错误码

下表列出 iOS SDK 公开方法和 delegate 回调可能返回的全部错误码。0 表示成功;收到非 0 错误码时,找到对应行并按“解决方案”处理。

如果按表处理后问题仍然存在,或者“解决方案”要求上传日志,请按照收集 SDK 日志中的 iOS 示例上传 SDK 日志。联系技术支持时,一并提供错误码、SDK 版本、问题发生时间、最短复现步骤和返回的 logId。日志上传失败时,记录上传接口返回的错误码,并按该文档准备其余排查信息。

错误码错误说明解决方案
0操作成功。无需处理。
1000SDK 的本地库未能加载,当前功能不可用。确认 TiRTC framework 或 Swift Package 已完整链接到当前 target,清理构建缓存并重新安装应用。
1001iOS 平台操作失败,SDK 无法继续完成当前调用。释放并重新创建相关对象后重试;如果仍然失败,请上传日志并提供错误发生前的调用步骤。
1002传入的参数、取值范围或对象关系不合法。对照当前方法说明检查必填参数、数值范围、streamId 和对象绑定关系。
1003SDK 无法创建或访问日志目录。检查应用存储空间和沙盒目录状态,确认应用数据目录可写,然后重新初始化 SDK。
1005SDK 尚未完成初始化。先调用 TiRtc.initialize(...),确认返回 0 后再创建或使用其他对象。
1007仍有连接、输入或输出对象未释放,SDK 不能关闭或修改当前配置。按输入、输出、连接的顺序停止并释放所有对象,再执行关闭或配置操作。
1008当前对象已经释放。不要继续使用该实例;重新创建对象,并修正 dispose() 之后仍发起调用的生命周期逻辑。
1010当前视图已经绑定到其他视频输出或预览对象。先从原对象解绑视图,再绑定到新对象;不要让同一个视图同时承载多个输出。
1011当前操作需要的连接不可用。确认连接对象尚未释放且已经连接;必要时重新创建并建立连接。
1012当前操作需要的对象绑定不存在或已经失效。重新执行对应的 attach(...),确认成功后再继续。
1013当前操作需要的对象不可用。检查对象是否已经释放以及调用顺序是否正确,重新创建相关对象后重试。
1014应用缺少当前操作需要的系统权限。在宿主应用中申请并确认相机或麦克风等权限已经授予,再重试当前操作。
1016当前方法必须在主线程调用。把视图绑定、预览等界面相关操作切换到主线程执行。
6000传入的参数、取值范围或对象关系不合法。对照当前方法说明检查必填参数、数值范围、streamId、数据长度和对象绑定关系。
6001SDK 尚未初始化。先调用 TiRtc.initialize(...),确认返回 0 后再调用其他 API。
6004当前运行环境不支持 SDK 需要的任务调度方式。确认使用了适配当前平台和系统版本的 SDK;如果没有修改过相关运行配置,请上传日志。
6005SDK 组件版本不一致,完整性校验未通过。确认所有 TiRTC 依赖来自同一版本,清理缓存并重新构建、安装应用。
6006目标对象已经停止。无需重复停止;如需继续使用,按文档重新配置并启动对象。
6007目标对象已经销毁。重新创建对象,不要继续持有或调用已经销毁的实例。
6008当前应用或设备的 TiRTC 授权无效。核对使用的应用、设备和授权信息;确认无误后联系技术支持检查授权状态。
6009当前传输操作等待超时。检查客户端与设备端网络,确认远端在线;网络恢复后重试,连接已断开时重新连接。
6010传输通道正忙,常见原因是发送过快或缓冲区已满。降低发送频率或单次数据量,等待通道恢复后重试,避免无间隔地连续重发。
6011连接因心跳或等待响应超时而关闭。检查网络连通性和远端运行状态,获取仍然有效的 token 后重新连接。
6012远端主动关闭了连接。确认远端是否退出或重启;需要继续通信时,等待远端恢复后重新连接。
6013连接因其他传输错误关闭。检查网络和远端状态后重新连接;如果频繁出现,请上传双方日志。
6014连接使用的 token 已过期。从业务服务端重新获取 token,再发起连接;不要重复使用已过期的 token
6015SDK 无法访问日志或诊断文件目录。检查应用存储空间和目录可写状态,修复后重新初始化或重新执行日志操作。
6016日志或媒体数据导出任务已经在进行。等待当前任务结束后再启动下一次,不要同时发起重复导出。
6017传输资源不足,无法继续创建连接或处理数据。释放不再使用的连接和媒体对象,降低并发量,等待资源恢复后重试。
6018云端服务返回错误。稍后重试;如果持续失败,请确认服务状态并上传日志。
6019SDK 处理网络连接时发生内部错误。断开并重新建立连接;仍然失败时上传日志,并提供发生时间和远端标识。
6020当前连接方式缺少必需的密钥。在建立连接或启动连接服务前补充文档要求的凭据;如果当前场景不需要配置密钥,请上传日志。
6021收到的服务端响应无法识别。检查自定义服务地址和网络代理是否正确,升级到最新 SDK 后重试;仍失败时上传日志。
6022SDK 已经初始化。复用当前 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视频帧渲染失败。确认渲染视图仍然有效并在主线程完成绑定;重新绑定或重新创建视频输出。
6043SDK 可用资源不足。释放不再使用的对象,降低并发连接、分辨率或缓冲规模后重试。
6044无法打开所需文件。检查文件是否存在、路径是否正确以及应用是否有访问权限。
6045读取文件失败。确认文件完整、可读且存储设备状态正常,然后重试。
6046写入文件失败。确认目标目录可写且剩余空间充足,清理空间后重试。
6047HTTP 请求失败。检查网络、自定义服务地址、代理和证书配置,网络恢复后重试。
6048导出日志失败。检查日志目录和可用存储空间,结束其他导出任务后重试。
6049上传日志失败。检查网络后重新上传;仍然失败时,记录本错误码,并按照收集 SDK 日志准备其余排查信息。
6050上传文件到存储服务失败。检查网络并重新发起上传;如果凭证已过期,请重新开始整个上传流程。
6051无法打开麦克风输入。确认麦克风权限已授予、麦克风未被其他应用占用,然后重新创建音频输入。
6052麦克风采集过程中发生错误。停止并重新创建音频输入,检查系统音频设备和路由;仍失败时上传日志。
6053无法打开音频播放设备。检查系统音频设备和音频会话是否可用,然后重新创建音频输出。
6054音频播放过程中发生错误。重新创建音频输出并检查系统音频会话和路由;仍失败时上传日志。
6055音频处理模块初始化失败。检查采样率、声道数和音频处理参数组合,改用受支持的配置后重试。
6056音频处理过程中发生错误。重新创建音频输入或输出;可先关闭可选音频处理能力以确认问题范围。
6057视频编码过程中发生错误。降低视频规格并重新创建视频输入;仍失败时切换编码格式或上传日志。
6058视频预处理过程中发生错误。重新创建视频输入并降低分辨率或帧率;仍失败时上传日志。
6059无法打开摄像头。确认相机权限已授予、摄像头未被占用,并检查所选前后摄像头是否存在。
6060摄像头采集过程中发生错误。停止并重新创建视频输入;检查相机是否被系统或其他应用中断。
6061无法打开视频输出。确认视频视图和解码配置有效,重新创建并绑定视频输出。
6062无法创建本地音视频发送通道。确认连接、输入对象和媒体参数有效,释放旧对象后重新创建并绑定。
6063本地音视频发送通道启动失败。等待连接成功并确认输入已经绑定,然后重新启动输入。
6064下行视频或音频数据解码失败。确认远端发送受支持且完整的媒体数据,重新订阅或重新创建输出。
6065保存诊断用的原始媒体数据失败。检查目标目录权限和剩余空间,停止其他导出任务后重试。
6066SDK 在处理当前操作时发生内部错误。释放并重新创建相关对象后重试;如果仍然失败,请上传日志。
6067SDK 日志写入失败。检查日志目录是否可写以及存储空间是否充足,修复后重新初始化。
6068音频编码过程中发生错误。检查音频参数,重新创建音频输入;仍失败时切换编码格式或上传日志。
6069音频解码过程中发生错误。确认远端音频格式受支持,重新订阅或重新创建音频输出。
6070当前 SDK 或系统环境没有可用的 HTTP 客户端。使用包含网络能力的正式 SDK 包并确认系统网络组件可用;仍失败时联系技术支持。
6071当前环境不支持 HTTPS/TLS 请求。升级系统或 SDK,或改用支持 TLS 的运行环境;不要绕过生产环境的安全连接要求。
6072日志上传凭证已经过期。重新调用日志上传接口,让 SDK 获取新的上传凭证。
6074本地视频预览已经被其他对象占用。先解除已有预览绑定,再把预览绑定到当前视频输入。
6075当前连接还没有可用的远端标识。等待连接完全建立后再绑定媒体;连接已断开时重新连接。
6076接收的媒体数据已经积压,当前设备处理速度跟不上接收速度。降低远端码率、分辨率或帧率,减少同时播放的流,并检查设备负载。
6077接收媒体的播放或渲染目标尚未就绪。确认视频视图或音频输出已经准备好并保持有效,等待目标就绪后再继续。
6078连接对象无效或已经失效。停止使用旧连接对象,重新创建并建立连接,再重新绑定输入输出。
6079视频编码器暂时无法接收新的画面。降低本地视频帧率或分辨率,停止并重新创建视频输入;不要立即连续重试。
6080视频编码结果尚未就绪。等待后重试;如果持续出现,请降低本地视频规格并重新创建视频输入。
6081视频解码器暂时不能接收当前数据,或还在等待完整的码流参数。重新订阅或请求关键帧;持续出现时重新创建视频输出并降低远端视频规格。
6082视频解码结果尚未就绪。等待后重试;持续出现时请求关键帧并重新创建视频输出。
6083当前视频输入模式与创建对象时使用的模式不一致。停止并重新创建视频输入;如果没有切换过输入模式,请上传日志。
6084发起连接失败,连接请求没有正常进入执行阶段。检查 remoteIdtoken、当前连接状态和网络;必要时重新创建连接对象。
6085当前连接状态不允许执行断开操作。等待正在进行的连接或断开流程结束,再根据最新状态决定是否重试。
6086HTTP 传输过程失败。检查网络、代理、DNS 和证书配置,恢复后重新执行当前网络操作。
6087日志上传服务返回的地址信息无效。确认服务地址和网络代理正确,升级 SDK 后重试;仍然失败时,记录本错误码,并按照收集 SDK 日志准备其余排查信息。
6088日志上传服务返回的凭证信息无效。重新发起日志上传;持续失败时,记录本错误码,并按照收集 SDK 日志准备其余排查信息。
6089传输服务返回了当前 SDK 无法识别的状态。升级 SDK 并重新连接;仍失败时上传日志,提供发生时间和远端标识。
6090传输服务报告了其他连接错误。检查网络和远端状态后重新连接;如果频繁出现,请上传双方日志。
6091当前操作所需的对象不可用。检查对象是否已经释放以及调用顺序是否正确,重新创建相关对象后重试。
6092音频处理模块的当前状态不允许执行该操作。按“配置—绑定—启动”的顺序调用;需要改配置时先停止当前输入或输出。
6093音频处理参数配置失败。改用文档支持的采样率、声道数和处理级别组合后重试。
6094音频数据处理失败。重新创建音频对象;可先关闭可选音频处理能力,仍失败时上传日志。
6095视频编码器的当前状态不允许执行该操作。按正确顺序配置并启动编码;需要改参数时先停止并重新创建视频输入。
6096视频编码器拒绝了当前画面。降低本地视频分辨率或帧率并重新创建视频输入;不要立即连续重试。
6097无法取得视频编码结果。重新创建视频输入并降低编码负载;仍失败时上传日志。
6098视频编码结果转换失败。改用受支持的编码格式和视频参数,重新创建视频输入后重试。
6099视频编码器无法执行当前控制请求。减少运行中参数切换,停止后重新配置并创建编码输入。
6100视频解码器的当前状态不允许执行该操作。重新创建视频输出,等待其完成初始化后再送入媒体数据。
6101视频解码器拒绝了当前输入数据。确认码流格式正确并包含必要的关键帧,重新订阅或请求关键帧后重试。
6102无法取得视频解码结果。重新创建视频输出并降低解码负载;仍失败时上传日志。
6103视频解码结果转换失败。改用受支持的输出格式或解码方式,重新创建视频输出。
6104视频解码输出释放失败。重新创建视频输出;如果持续失败,请上传日志。
6105SDK 的网络连接能力尚未完成初始化。先完成 SDK 初始化;初始化已经成功时,重新创建连接对象后再试。
6106当前连接方式不受支持。改用 SDK 支持或默认的连接方式,确认初始化和网络配置后重新连接。

TiRTC 开发文档