You need to enable JavaScript to run this app.
文档中心
实时音视频

实时音视频

复制全文
下载 pdf
SDK 升级指南
Linux 客户端升级指南
复制全文
下载 pdf
Linux 客户端升级指南

如果你希望从此前版本的 Linux 客户端 SDK 升级到最新的客户端 SDK,请在工程文件中,替换最新的客户端 SDK 文件,并参考本文完成 API,回调,参数类型等的替换。

升级过程中,你可能需要参考历史版本文档归档。

3.60.107

错误码变更

SingleStreamTaskErrorCode 新增以下枚举值:

枚举值数值说明
kSingleStreamTaskErrorCodePushToCDN1098推送到 CDN 失败。
kSingleStreamTaskErrorCodeCountOverLimit1099超过单流转推任务数限制,单个主播同时运行的转推任务不能超过 20 个。

3.60.105

类型变更

类型说明

RoomLiveMode(新增枚举)

新增枚举,定义直播模式,包含取值:

  • kRoomLiveModeCoHost(1) 多人连麦
  • kRoomLiveModeSoloHost(2) 单人直播

ProcessorActionDomain(新增枚举)

新增枚举,定义视频前处理作用范围,包含取值:

  • kProcessorActionDomainPreviewAndEncode(0)
  • kProcessorActionDomainPreview(1)
  • kProcessorActionDomainEncode(2)
RTCRoomConfig新增 live_mode 字段(RoomLiveMode 类型),进房时指定直播模式。
VideoPreprocessorConfig新增 action_domain 字段(ProcessorActionDomain 类型),指定视频前处理作用范围。
VideoEncoderConfig新增 key_frame_interval_ms 字段(int32_t),关键帧间隔,单位毫秒。
VideoSolutionDescription新增 key_frame_interval_ms 字段(int32_t),关键帧间隔,单位毫秒。

新增接口

接口说明
IRTCRoom::setLiveMode(RoomLiveMode live_mode)设置房间直播模式,加入房间后调用。返回 0 表示成功。
IRTCEngine::sendLivePushSEIMessage(std::string json_string, int count, bool is_key_frame_only, bool allow_overwrite)以 Key-Value JSON 格式发送 SEI 数据。需先设为 kRoomLiveModeSoloHost 模式。

3.60.104

新增接口

回调说明
onLicenseQuotaExceededAIGC 场景下(AI 音视频互动方案)使用 License 计费的场景下,当 License 配额用尽时 SDK 会触发此回调。 收到该回调时,AIGC 服务会中止。为保证服务连续性,收到该回调后请及时续费,并离开房间、销毁 SDK,待续费成功后重新加入。

依赖项变化

新增插件 libbytertc_license_extension.so。该插件为 CloudRenderLAN 场景合入 ToB 场景下的 License 插件,使用相关功能时需要集成。

3.60.102

API 变更

头文件和基础类名

变更类型V3.58V3.60
头文件名称变更../bytertc_video.h../bytertc_engine.h
../bytertc_video_event_handler.h../bytertc_engine_event_handler.h
基础类名变更(所有模块)class IRTCVideoclass IRTCVideoEventHandlerclass IRTCEngineclass IRTCEngineEventHandler

新增加头文件

无

../IRTSRoom.h

../IRTSRoomEventHandler.h

引擎管理

变更类型V3.58V3.60变更说明

创建引擎对象

createRTCVideo(const char* app_id, bytertc::IRTCVideoEventHandler event_handler, const char parameters)

createRTCEngine(const EngineConfig& config, IRTCEngineEventHandler* event_handler)

  • 接口重命名
  • 参数变更:
    • 参数替换:移除 parameters、app_id,移动至新增的 EngineConfig 类中,且 app_id 名称改为 appID
    • 新增参数:新增 config,类型为 EngineConfig,且EngineConfig中新增字段 is_game_scene,用于控制游戏场景的开关 。
    • 参数类型替换:event_handler参数的类型从 IRTCVideoEventHandler 改为 IRTCEngineEventHandler
销毁引擎destroyRTCVideodestroyRTCEngine接口重命名
音视频引擎事件回调接口IRTCVideoEventHandlerIRTCEngineEventHandler类型重命名

房间管理

变更类型V3.58V3.60变更说明

加入房间

joinRoom(const char* token, const UserInfo& user_info, const RTCRoomConfig& config)

int joinRoom(const char* token, const UserInfo& user_info, bool user_visibility, const RTCRoomConfig& config)

  • 参数变更:
    • 新增参数 user_visibility:指定用户可见性。
      建议在进房时将用户可见性都设置为 false,并在用户需要发送音视频流时再通过 setUserVisibility 设置为 true。由于单个房间的不可见用户容量远高于可见用户容量,按需开启用户可见性可以最大程度利用 RTC 通话房间资源,避免了 RTC 房间内的可见用户达到上限后,后续用户进房失败的情况。
    • RTCRoomConfig 中的参数 is_auto_publish 拆分为视频 is_publish_video 和音频 is_publish_audio
    • RTCRoomConfig 中的参数中的参数 room_profile_type(房间模式)的枚举有增减,具体参见下面的Android*。***
  • 行为变更:
    • V3.58:
      • 进房默认自动发布主流,进房时是否发布音频流或视频流由接口调用前的 publishVideoStream(false) 和 publishAudioStream(false) 决定
      • publishVideoStream/publishAudioStream 进房前后都有效
    • V3.60:
      • 进房自动发布音视频流(主流),流是否发布出去,由 RTCRoomConfig 的 isPublishVideo 和 isPublishAudio决定。
      • publishVideoStream/publishAudioStream 单流版本作用域范围只限进房后,进房前调用无效

创建房间实例

createRTCRoom(const char* room_id)

createRTCRoom(const char* room_id)

行为变更:

使用已存在 roomId 创建房间实例时,将返回上次创建的房间实例,不再触发错误码 kWarningCodeOldRoomBeenReplaced = -2016

创建房间失败回调onCreateRoomStateChanged(const char* room_id, int error_code)onRoomStateChanged( const char* room_id, const char* uid, int state, const char* extra_info)创建房间失败由 onRoomStateChanged 进行通知。不再通过 onCreateRoomStateChanged 回调。
设置房间附加信息结果的回调onSetRoomExtraInfoResult(int64_t task_id, SetRoomExtraInfoResult error_code)onSetRoomExtraInfoResult(int64_t task_id, SetRoomExtraInfoResult result)参数变更: error_code 更名为 result。
远端可见用户加入房间,或房内不可见用户切换为可见的回调onUserJoined(const UserInfo &user_info,int elapsed)onUserJoined(const UserInfo& user_info)参数变更:删除无效参数 elapsed。

发布和订阅 Simulcast 流

变更类型V3.58V3.60说明

开启/关闭推送多路视频流

enableSimulcastMode(bool enabled)

setLocalSimulcastMode(VideoSimulcastMode mode)

  • 接口重命名
  • 功能扩展、参数变更:移除旧方法中的 bool enabled,替换为 VideoSimulcastMode mode,允许通过参数VideoSimulcastMode 指定具体的多路流模式类型。
  • 默认行为调整:
    • 旧接口:当 enabled 为 true 时会发布所有已设置的 Simulcast 流。
    • 新接口:将 mode 参数设置为 kVideoSimulcastModeAlwaysSimulcast = 2 时会发布所有已设置的 Simulcast 流。
  • 调用时机变更:旧方法在进房前或进房后但未发布流时调用,新方法需在进房前调用。
设置期望发布的最大分辨率视频流参数setVideoEncoderConfig(const VideoEncoderConfig& max_solution)setVideoEncoderConfig(const VideoEncoderConfig& encoder_config)参数变更:形参 max_solution 变更为 encoder_Config
设置多路视频流参数setVideoEncoderConfig(const VideoEncoderConfig* channel_solutions, int solution_num)setLocalSimulcastMode(VideoSimulcastMode mode, const VideoEncoderConfig* stream_config, int num)接口替换

设置期望订阅的远端视频流的参数

setRemoteVideoConfig(const char *user_id,const RemoteVideoConfig &remote_video_config)

setRemoteSimulcastStreamType(const char* stream_id, SimulcastStreamType stream_type) = 0

  • 接口重命名
  • 移除参数:
    • 将user_id变为stream_id,追踪流而非用户。
    • 移除 remote_video_config,替换为 streamType(类型为 SimulcastStreamType),不再需要指定具体数值,你可以通过传入枚举值指定订阅偏好。

屏幕分享

  1. 屏幕流和普通视频流在同一引擎中不能共存,开启屏幕流时会自动关闭普通视频流,开启普通视频流时会自动关闭屏幕流。
  2. 屏幕流和普通视频流发布订阅方式一致,废除了一系列带有"screen"的接口。

功能V3.58V3.60变更说明

采集屏幕视频

startScreenVideoCapture(const ScreenCaptureSourceInfo &source_info, const ScreenCaptureParameters &capture_params)=0

startScreenVideoCapture(const ScreenCaptureSourceInfo& source_info, const ScreenCaptureParameters& capture_params) = 0

行为变更:

在开始屏幕采集时,会停止视频采集功能

设置屏幕流编码参数

setVideoEncoderConfig(const VideoEncoderConfig &max_solution)=0

setVideoEncoderConfig(const VideoEncoderConfig& encoder_config) = 0

接口替换:

屏幕流和视频流共用同一套编码参数,setVideoEncoderConfig设置的参数会同时作用于屏幕流和一般视频流

发布/停止发布本地屏幕音视频流

publishScreen(MediaStreamType type)=0

unpublishScreen(MediaStreamType type)=0

publishStreamVideo(bool publish) = 0

publishStreamAudio(bool publish) = 0

接口替换:

屏幕流和视频流共用同一套发布/取消发布接口

接口拆分

音频和视频的发布/取消发布接口拆开

订阅/取消订阅远端屏幕音视频流

subscribeScreen(const char* user_id, MediaStreamType type)=0

unsubscribeScreen(const char* user_id, MediaStreamType type)=0

subscribeStreamVideo(const char *stream_id, bool subscribe) = 0

subscribeStreamAudio(const char *stream_id, bool subscribe) = 0

接口替换:

屏幕流和视频流共用同一套订阅/取消订阅接口

接口拆分

音频和视频的订阅/取消订阅接口拆开

参数变更:

通过参数streamId来区分具体是哪路流,是否为屏幕流

远端用户发布或者取消发布屏幕流回调

onUserPublishScreen(const char* uid, MediaStreamType type)

onUserUnpublishScreen(const char* uid, MediaStreamType type, StreamRemoveReason reason)

onUserPublishStreamVideo(const char* stream_id, const StreamInfo& stream_info, bool is_publish)

onUserPublishStreamAudio(const char* stream_id, const StreamInfo& stream_info, bool is_publish)

接口替换:

屏幕流和视频流共用同一套发布/取消发布回调接口

接口拆分

音频和视频的发布/取消发布回调接口拆开

参数变更:

通过参数streamId来区分具体是哪路流,是否为屏幕流

屏幕共享流的视频首帧发送状态回调

onScreenVideoFrameSendStateChanged(const char* room_id, const RtcUser &user, FirstFrameSendState state)

onVideoFrameSendStateChanged(const char* stream_id, const StreamInfo& stream_info, const RtcUser& user, FirstFrameSendState state)

接口替换:

屏幕流和视频流共用同一套视频首帧发送状态回调

参数变更:

通过参数streamId来区分具体是哪路流,是否为屏幕流

屏幕共享流视频首帧播放状态回调

onScreenVideoFramePlayStateChanged(const char* room_id, const RtcUser &user, FirstFramePlayState state)

onVideoFramePlayStateChanged(const char* stream_id, const StreamInfo& stream_info, const RtcUser& user, FirstFramePlayState state)

接口替换:

屏幕流和视频流共用同一套视频首帧播放状态回调

参数变更:

通过参数streamId来区分具体是哪路流,是否为屏幕流

RTS (bytertc_engine_event_handler)

功能v3.58v3.60变更说明
收到房间外用户发来的文本消息时,会收到此回调onUserMessageReceivedOutsideRoom(const char* uid, const char* message)onUserMessageReceivedOutsideRoom(int64_t msgid, const char* uid, const char* message)参数变更:回调参数增加msgid参数
收到房间外用户 发来的二进制消息时,会收到此回调onUserBinaryMessageReceivedOutsideRoom(const char* uid, int size, const uint8_t* message)onUserBinaryMessageReceivedOutsideRoom(int64_t msgid, const char* uid, const uint8_t* message, int size)参数变更:回调参数增加msgid参数
接收到房间内广播消息的回调onRoomMessageReceived(const char* uid, const char* message)onRoomMessageReceived(int64_t msgid, const char* uid, const char* message)参数变更:回调参数增加msgid参数
收到房间内广播二进制消息的回调onRoomBinaryMessageReceived(const char* uid, int size, const uint8_t* message)onRoomBinaryMessageReceived(int64_t msgid, const char* uid, const uint8_t* message, int size)参数变更:回调参数增加msgid参数
收到来自房间中其他用户发来的点对点文本消息时,会收到此回调onUserMessageReceived(const char* uid, const char* message)onUserMessageReceived(int64_t msgid, const char* uid, const char* message)参数变更:回调参数增加msgid参数
收到来自房间中其他用户发来的点对点二进制消息时,会收到此回调onUserBinaryMessageReceived(const char* uid, int size, const uint8_t* message)onUserBinaryMessageReceived(int64_t msgid, const char* uid, const uint8_t* message, int size)参数变更:回调参数增加msgid参数

发布和订阅主流(摄像头/麦克风采集的流)

功能V3.58V3.60变更说明
1. 发布/取消音视频流
  • 发布音视频流
  • 取消发布音视频流
  • publishStream(MediaStreamType type)
  • unpublishStream(MediaStreamType type)
  • publishStreamVideo(bool publish)
  • publishStreamAudio(bool publish)
  • 接口拆分、功能扩展:
    • 按照音频和视频拆分:2 个新方法分别用于控制视频流和音频流的发布
    • 合并发布与取消发布:新接口通过 bool publish 参数处理发布和取消发布操作
  • 参数变更:
    • 移除 type,新方法直接通过方法名直接区分视频和音频流
    • 新增 bool publish
  • 行为变更:
    • V3.58:进房前后都有效
    • V3.60:作用域范围只限进房后,进房前调用无效
  • 房间内远端摄像头/麦克风采集的媒体流的回调
  • 房间内远端摄像头/麦克风采集的媒体流移除的回调
  • onUserPublishStream( const char* uid, MediaStreamType type )
  • onUserUnpublishStream( const char* uid, MediaStreamType type, StreamRemoveReason reason)
  • onUserPublishStreamAudio(const char* stream_id, const StreamInfo& stream_info, bool is_publish)
  • onUserPublishStreamVideo(const char* stream_id, const StreamInfo& stream_info, bool is_publish)
  • 接口拆分重命名、功能扩展:
    • 按照音频和视频拆分:2 个新方法分别用于控制音频流和视频流订阅回调
    • 合并订阅与取消订阅状态:新接口通过 is_publish 参数处理发布和取消发布的回调
  • 参数变更:
    • 移除 uid **,新方法通过 **** streamId ** 参数区分流。
    • 移除 type,新方法直接通过方法名直接区分视频和音频流
    • 新增 room_id参数,用于标识房间 ID
    • 移除了 StreamRemoveReason reason,不再提供移除原因的详细信息

音视频流发布状态触发警告或错误时回调

onStreamStateChanged( const char* room_id, const char* uid, int state, const char* extra_info)

  • onVideoPublishStateChanged(const char* stream_id, const StreamInfo& stream_info, PublishState state, PublishStateChangeReason reason)
  • onAudioPublishStateChanged(const char* stream_id, const StreamInfo& stream_info, PublishState state, PublishStateChangeReason reason)
  • 接口拆分、重命名:按照音频和视频拆分,2 个新方法分别用于控制音频流和视频流发布状态回调
  • 参数变更:
    • 参数类型变更:state 类型从 int改为 PublishState枚举
    • 新增参数:
      • 新增streamId ** 参数区分流。**
      • 新增 reason,类型为 PublishStateChangeReason 枚举,用于表示发布状态变化的具体原因。
    • 移除参数:
      • 移除 uid **,新方法通过 **** streamId ** 参数区分流。
      • 移除无效参数 extraInfo
2. 订阅/取消订阅音视频流
  • 订阅音视频流
  • 取消订阅音视频流
  • subscribeStream(const char *user_id, MediaStreamType type)
  • unsubscribeStream(const char *user_id, MediaStreamType type)
  • subscribeStreamVideo(const char *stream_id, bool subscribe) = 0
  • subscribeStreamAudio(const char *stream_id, bool subscribe) = 0
  • 接口拆分重命名、功能扩展:
    • 按照音频和视频拆分:2 个新方法分别用于控制视频流和音频流的订阅
    • 合并订阅与取消订阅:新接口通过 bool subscribe 参数处理订阅和取消订阅
  • 参数变更:
    • 移除 uid,新方法通过 streamId 参数区分流。
    • 移除 type,新方法直接通过方法名直接区分视频流和音频流
    • 新增 bool subscribe

音视频流订阅状态改变回调

onStreamSubscribed(SubscribeState state_code, const char* user_id, const SubscribeConfig& info)

  • onVideoSubscribeStateChanged(const char* stream_id, const StreamInfo& stream_info, SubscribeState state, SubscribeStateChangeReason reason)
  • onAudioSubscribeStateChanged(const char* stream_id, const StreamInfo& stream_info, subscribeState state, SubscribeStateChangeReason reason)
  • 接口拆分、重命名:按照音频和视频拆分,2 个新方法分别用于控制音频流和视频流订阅状态改变回调
  • 参数变更
    • 新增参数:
      • 新增streamId 和stream_info参数区分流。
      • 新增 reason:用于更详细地描述订阅状态改变的具体原因
    • 参数重命名:
      • state_code:重命名为state
    • 移除参数:
      • 移除user_id,新方法通过 streamId 和stream_info参数区分流。
      • 移除了 info,不再返回

音视频流订阅状态触发警告或错误时回调

onStreamStateChanged( const char* room_id, const char* uid, int state, const char* extra_info)

  • onVideoSubscribeStateChanged(const char* stream_id, const StreamInfo& stream_info, SubscribeState state, SubscribeStateChangeReason reason)
  • onAudioSubscribeStateChanged(const char* stream_id, const StreamInfo& stream_info, subscribeState state, SubscribeStateChangeReason reason)
  • 接口拆分、重命名:按照音频和视频拆分,2 个新方法分别用于控制音频流和视频流订阅状态改变回调
  • 参数变更
    • 参数类型变更:state 类型从 int 改为 SubscribeState枚举
    • 新增参数:
      • 新增streamId和stream_info 参数区分流。
      • 新增 reason,类型为 SubscribeStateChangeReason 枚举,用于表示发布状态变化的具体原因。
    • 移除参数:
      • 移除room_id和user_id,新方法通过 streamId和stream_info 参数区分流。
      • 移除无效参数 extraInfo
3. 订阅/取消订阅所有媒体流
  • 订阅所有媒体流
  • 取消订阅所有媒体流
  • subscribeAllStreams(MediaStreamType type)
  • unsubscribeStream(const char *user_id,MediaStreamType type)
  • subscribeAllStreamsVideo(bool subscribe)
  • subscribeAllStreamsAudio(bool subscribe)
  • 接口拆分重命名、功能扩展:
    • 按照音频和视频拆分:2 个新方法分别用于订阅/取消所有视频流、订阅/取消所有音频流
    • 合并订阅与取消订阅:新接口通过 bool subscribe 参数处理订阅和取消订阅
  • 参数变更:
    • 移除参数:
      • 移除 type,新方法直接通过方法名直接区分视频和音频流
      • 移除 user_id,无需传入
    • 新增参数:bool subscribe

暂停接收来自远端的媒体流

pauseAllSubscribedStream(PauseResumeControlMediaType media_type)

  • pauseAllSubscribedStreamAudio()
  • pauseAllSubscribedStreamVideo()
  • 接口拆分:按照音频和视频拆分,2 个新方法分别用于暂停接收所有远端的音频流、暂停所有远端的视频流
  • 参数变更:移除了 media_type,新方法通过方法名直接区分音频和视频流

恢复接收来自远端的媒体流

resumeAllSubscribedStream(PauseResumeControlMediaType media_type)

  • resumeAllSubscribedStreamAudio()
  • resumeAllSubscribedStreamVideo()
  • 接口拆分:按照音频和视频拆分,2 个新方法分别用于恢复接收所有远端的音频流、恢复接收所有远端的视频流
  • 参数变更:移除了 media_type,新方法通过方法名直接区分音频和视频流

WTN 流(原公共流)

  • 移动接口位置:
    • 订阅 WTN 流的接口移动到新增的 IWTNStream 类中。
    • WTN 流订阅端回调移动到新增的 IWTNStreamEventHandler 回调类中。你需要先调用 setWTNStreamEventHandler 设置回调手柄。
  • 与合流转推接口共用 IMixedStreamConfig,提升易用性。
  • 新增 onWTNRemoteVideoStats 和 onWTNRemoteAudioStats 用于获取 WTN 流信息,检测流质量。
  • 拆分、重命名、替换接口,具体变更如下:

功能V3.58V3.60详情

发布 WTN 流

支持指定房间内多个用户发布的媒体流合成一路 WTN 流

startPushPublicStream(const char* public_stream_id, IPublicStreamParam* param)

startPushMixedStream(const char* task_id, MixedStreamPushTargetConfig push_target_config, IMixedStreamConfig* config)

  • 接口重命名
  • 接口合并、功能扩展:startPushPublicStream 和 startPushMixedStreamToCDN 合并为 startPushMixedStream,新接口可同时用于合流转推至 CDN 或转推 WTN(原公共流)
  • 参数变更:
    • 新增参数:新增 task_id:设置转推任务 ID,用于标识转推任务
    • 参数替换:
      • 移除 public_stream_id:由新增参数 push_target_config 来指定 WTN 流 ID(即公共流 ID)
      • 移除 param:替换为新增参数 config,用于配置 WTN 流。

更新 WTN 流

updatePublicStreamParam(const char* public_stream_id, IPublicStreamParam* param)

updatePushMixedStream(const char* task_id, MixedStreamPushTargetConfig push_target_config, IMixedStreamConfig* config)

  • 接口重命名
  • 接口合并、功能扩展:updatePublicStreamParam 和 updatePushMixedStreamToCDN 合并为 updatePushMixedStream,新接口可同时用于更新合流转推 CDN 和转推 WTN(原公共流)任务
  • 参数变更:
    • 新增参数:新增 task_id:设置转推任务 ID,用于标识转推任务
    • 参数替换:
      • 移除 public_stream_id:由新增参数 push_target_config 的来指定 WTN 流 ID(即公共流 ID)
      • 移除 param:替换为新增参数 config,用于配置 WTN 流。

停止发布 WTN 流

stopPushPublicStream(const char* public_stream_id)

stopPushMixedStream(const char* task_id, MixedStreamPushTargetType target_type)

  • 接口重命名
  • 接口合并、功能扩展:stopPushPublicStream 和 stopPushStreamToCDN 合并为 stopPushMixedStream,新接口可同时用于停止发布 WTN 流(原公共流)和停止合流转推
  • 参数变更:
    • 新增参数:taskId,合流任务的 ID
    • 移除参数:移除 public_stream_idString publicStreamId,由 push_target_config 来指定用于指定要停止的 WTN 流 ID(即公共流 ID)

订阅/取消订阅 WTN 流

  • startPlayPublicStream(const char* public_stream_id)
  • stopPlayPublicStream(const char* public_stream_id)
  • subscribeWTNVideoStream(const char* stream_id, bool subscribe)
  • subscribeWTNAudioStream(const char* stream_id, bool subscribe)
  • 接口拆分重命名、功能扩展:
    • 按照音频和视频拆分:2 个新方法别用于订阅/取消订阅 WTN 音频流、订阅/取消订阅 WTN 视频流
    • 合并订阅与取消订阅:新接口通过 bool subscribe 参数处理订阅和取消订阅
  • 参数变更:
    • public_stream_id:重命名为 stream_id
    • 新增 bool subscribe

绑定 WTN 流画布

setPublicStreamVideoCanvas(const char* public_stream_id, const VideoCanvas& canvas)

setWTNRemoteVideoCanvas(const char* stream_id, const VideoCanvas& canvas)

  • 接口重命名
  • 参数变更:public_stream_id:重命名为 stream_id

为 WTN 流指定外部渲染器

setPublicStreamVideoSink(const char* public_stream_id, IVideoSink* video_sink, IVideoSink::PixelFormat format)

setWTNRemoteVideoSink(const char* stream_id, IVideoSink* video_sink, RemoteVideoSinkConfig& config)

  • 接口重命名
  • 参数变更:
    • 参数重命名:public_stream_id 重命名为 stream_id
    • 新增参数: 新增 config,用于配置远端视频帧(例如位置、格式、是否将视频帧镜像等)
    • 参数替换:原 format,由RemoteVideoSinkConfig 中的字段 pixel_format 实现,默认为 0(原格式)

设置 WTN 流播放音量。

setPublicStreamAudioPlaybackVolume(const char* public_stream_id, int volume)

setWTNRemoteAudioPlaybackVolume(const char* stream_id, int volume)

  • 接口重命名
  • 参数变更:public_stream_id 重命名为 stream_id

播放 WTN 流任务回调

onPlayPublicStreamResult(const char* public_stream_id, PublicStreamErrorCode error_code)

  • onWTNVideoSubscribeStateChanged(const char* stream_id, WTNSubscribeState state_code, WTNSubscribeStateChangeReason reason)
  • onWTNAudioSubscribeStateChanged(const char* stream_id, WTNSubscribeState state_code, WTNSubscribeStateChangeReason reason)
  • 接口拆分、重命名:拆分为 2 个独立接口,分别用于回调 WTN 音频/视频流订阅状态变化
  • 参数变更
    • 参数重命名:public_stream_id 重命名为 stream_id
    • 参数替换:移除 error_code:替换为state_code (订阅状态码)和 reason(订阅状态变化原因)

接收 WTN 流中的 SEI 回调

onPublicStreamSEIMessageReceived(const char* public_stream_id,

const uint8_t* message,

int message_length,

DataMessageSourceType source_type)

onWTNSEIMessageReceived(const char* stream_id, int channel_id, const uint8_t* message, int length)

  • 接口重命名
  • 位置移动:移动到 IWTNStream 类中
  • 参数变更:
    • 参数重命名:
      • public_stream_id 重命名为 stream_id
      • message_length 重命名为 length
    • 新增参数:新增 channel_id:为不同接受方设置不同的 channel_id,接收方可以根据回调中的 channel_id选择应关注的 SEI 信息
    • 移除参数:移除 source_type 参数,不再需要传入

接收 WTN 流中的 Data Message 回调

onPublicStreamDataMessageReceived(const char* public_stream_id,

const uint8_t* message,

int message_length,

DataMessageSourceType source_type)

onWTNDataMessageReceived(const char* stream_id, onst uint8_t* message, int message_length, DataMessageSourceType source_type)

  • 接口重命名
  • 位置移动:移动到 IWTNStream 类中
  • 参数变更:public_stream_id 重命名为 stream_id

WTN 视频流首帧解码成功回调

onFirstPublicStreamVideoFrameDecoded(const char* public_stream_id, const VideoFrameInfo& info)

onWTNFirstRemoteVideoFrameDecoded(const char* stream_id, const VideoFrameInfo& info)

,重命名和移动到 IWTNStream 类中

  • 接口重命名
  • 位置移动:移动到 IWTNStream 类中
  • 参数变更:public_stream_id 重命名为 stream_id

WTN 音频流首帧解码成功回调

onFirstPublicStreamAudioFrame(const char* public_stream_id)

onWTNFirstRemoteAudioFrame(const char* stream_id)

  • 接口重命名
  • 位置移动:移动到 IWTNStream 类中
  • 参数变更:public_stream_id 重命名为 stream_id

WTN 流发布结果回调

onPushPublicStreamResult(

const char* room_id,

const char* public_streamid,

PublicStreamErrorCode error_code

)

onMixedStreamEvent(MixedStreamTaskInfo info, MixedStreamTaskEvent event, MixedStreamTaskErrorCode error_code)

  • 接口重命名
  • 接口合并:onMixingEvent、onStreamMixingEvent 和 onPushPublicStreamResult 合并为 onMixedStreamEvent,新接口可同时用于回调合流转推 CDN / WTN 流状态
  • 参数变更:
    • 参数类型变更:参数 error_code 的类型由 PublicStreamErrorCode 变更为 MixedStreamTaskErrorCode,和合流转推任务共用同一个枚举类。变更详情,请参见Windows
    • room_id:不再需要传入
    • public_streamid:替换为新增的 MixedStreamTaskInfo info 中的 task_id
    • 新增 MixedStreamTaskEvent event

转推直播

优化了转推直播接口的易用性。与 WTN 接口共用 IMixedStreamConfig,提升易用性。如果你已经实现了转推直播功能,参考以下表格对接口进行替换。

功能V3.58V3.60详情

合流转推

startPushMixedStreamToCDN(const char* task_id, IMixedStreamConfig* config, IMixedStreamObserver* observer)

startPushMixedStream(const char* task_id, MixedStreamPushTargetConfig push_target_config, IMixedStreamConfig* config)

  • 接口重命名
  • 接口合并、功能变更:startPushPublicStream 和 startPushMixedStreamToCDN 合并为 startPushMixedStream,新接口可同时用于合流转推 CDN 和转推 WTN(原公共流)
  • 参数变更:
    • 删除 observer,不再需要传入
    • 新增:push_target_config,用于指定指定推流地址(比如CDN 地址、WTN 流 ID)

更新合流转推任务

updatePushMixedStreamToCDN(const char* task_id, IMixedStreamConfig* config)

pdatePushMixedStream(const char* task_id, MixedStreamPushTargetConfig push_target_config, IMixedStreamConfig* config)

  • 接口重命名
  • 接口合并:updatePublicStreamParam 和 updatePushMixedStreamToCDN 合并为 updatePushMixedStream,新接口可同时用于更新合流转推 CDN 和转推 WTN(原公共流)任务
  • 参数变更:新增 push_target_config,用于指定指定推流地址(比如CDN 地址、WTN 流 ID)

合流转推回调

  • onMixingEvent( StreamMixingEvent event, const char* task_id, StreamMixingErrorCode error, MixedStreamType mix_type)
  • onStreamMixingEvent( StreamMixingEvent event, const char* task_id, StreamMixingErrorCode error, StreamMixingType mix_type)

onMixedStreamEvent(MixedStreamTaskInfo info, MixedStreamTaskEvent event, MixedStreamTaskErrorCode error_code)

  • 接口拆分、重命名:按合流任务事件回调、单流任务的事件回调拆分。
  • 接口合并:onMixingEvent、onStreamMixingEvent 和 onPushPublicStreamResult 合并为 onMixedStreamEvent,新接口可同时用于回调合流转推 CDN / WTN 流状态
  • 参数变更:
    • 类型变更:
      • event(事件**)**:类型替换为 MixedStreamTaskEvent
      • error(错误码):重命名为 error_code,类型替换为 MixedStreamTaskErrorCode
    • 移除参数: 移除 mix_type,无替代
    • 新增参数:新增 info,包含了合流任务的相关信息,如流类型等。
  • 位置移动:移动到 IRTCEngineEventHandler

单流转推

startPushSingleStreamToCDN(const char* task_id, PushSingleStreamParam& param, IPushSingleStreamToCDNObserver* observer)

startPushSingleStream(const char* task_id, PushSingleStreamParam& param)

  • 接口重命名
  • 移除参数:observer,不再需要传入

停止转推任务

stopPushStreamToCDN(const char* task_id)

  • stopPushSingleStream(const char* task_id)
  • stopPushMixedStream(const char* task_id, MixedStreamPushTargetType target_type)
  • 接口拆分、重命名:按单流和合流拆分
  • **其中,停止合流转推接口(**stopPushMixedStream):
    • 功能上:既可用于停止转推 CDN,也可以用于停止转推 WTN 流
    • 新增参数:target_type,用于指定要停止转推的流类型

单流转推回调

onStreamPushEvent(

SingleStreamPushEvent event,

const char* task_id,

int error

)

onSingleStreamEvent(const char *task_id, SingleStreamTaskEvent event, SingleStreamTaskErrorCode error_code)

  • 接口重命名
  • 参数变更:
    • 类型变更:
      • event(事件**)**:类型替换为 SingleStreamTaskEvent
      • error(错误码):重命名为 error_code,类型替换为 SingleStreamTaskErrorCode

音视频传输

功能接口名变更说明
接收到来自远端某音频流的第一帧时回调onFirstRemoteAudioFrame(const char* stream_id, const StreamInfo& stream_info)新增适用场景,远端用户取消发布音频再发布音频后,也会收到该回调。取消发布包括发布端主动取消、主动退房、掉线以及停止采集。
  • SDK 渲染成功远端视频流首帧后回调
  • SDK 接收并解码远端视频流首帧后回调
  • onFirstRemoteVideoFrameRendered(const char* stream_id, const StreamInfo& stream_info, const VideoFrameInfo& info)
  • onFirstRemoteVideoFrameDecoded(const char* stream_id, const StreamInfo& stream_info, const VideoFrameInfo& info)

新增适用场景:远端用户取消发布视频并再发布视频后,也会收到该这两个回调。

取消发布包括发布端主动取消、主动退房、掉线以及停止采集。

音画同步

功能V3.58V3.60变更说明

音视频同步状态发生改变时

onAVSyncStateChange(AVSyncState state)

onAVSyncEvent(const char* room_id, const char* uid, AVSyncEvent event)

  • 接口重命名
  • 参数变更
    • 新增了 room_id 和 uid
    • state(同步状态): 类型替换为 AVSyncEvent(同步失败事件 ),你可以在收到该通知时,调用 setMultiDeviceAVSync传入空参数解绑同步关系,并再次调用该接口进行绑定。
  • 行为变更:音视频同步失败
    • 3.58:由以下错误码返回:kErrorCodeInvalidAudioSyncUidRepeated
    • 3.60:通过 onAVSyncEvent 返回 kAVSyncEventInvalidUidRepeated

播放音量

setAudioRoute:Windows 和 Linux 端不支持。

功能V3.58V3.60变更说明

调节指定远端用户的音频流在本地设备上的播放音量

setRemoteAudioPlaybackVolume(const char* room_id,const char* user_id, int volume)

setRemoteAudioPlaybackVolume(const RemoteStreamKey& stream_key, int volume)

  • 参数变更:
    用于指定音频流的 room_id 和 user_id 移动到新增的 stream_key 参数结构体中。
  • 功能拓展:
    仅支持调节来自指定用户的媒体流音量,升级为支持分别调节本地采集媒体流音量,屏幕流音量,和指定进程音量。

推送外部视频帧

V3.58V3.60变更说明

pushExternalVideoFrame(StreamIndex stream_index, IVideoFrame* frame)

pushExternalVideoFrame(const VideoFrameData & frame)

参数变更:

参数 frame 的类型由 IVideoFrame* 替换为 VideoFrameData。与原参数类型相比,包含参数和是否必填均发生变化。详情,请参见Windows

根据热榜获取每个榜单的歌曲列表

3.58V3.60变更说明

getHotMusic(int hot_types, int filters)

getHotMusic(const char** custom_hotlist_id, int id_num, int filters)

参数变更:

  • 参数替换:移除 hot_types ,替换为 custom_hotlist_id,类型由枚举改为 const char** ,用于提供自定义的热门音乐列表 ID。属性值对应如下:
    • kMusicHotTypeContentCenter → ContentCenter
    • kMusicHotTypeProject → Project
  • 新增参数:新增 id_num,用于指定榜单 ID 的个数

StreamId唯一识别流

当前版本使用 StreamId 唯一标识一路流,因此各个API中以前版本的 StreamIndex / RemoteStreamKey 参数被 StreamId 或相关信息替换,涉及到API如下:

所属类v3.58v3.60变更说明
IRTCEnginesetAudioSourceType (AudioSourceType type)setAudioSourceType (AudioSourceType type)
IRTCEnginemuteAudioCapture(StreamIndex index, bool mute)muteAudioCapture(bool mute)参数变化: 删除StreamIndex参数
IRTCEnginesetCaptureVolume(StreamIndex index, int volume)setCaptureVolume(int volume)参数变化: 删除StreamIndex参数
IRTCEnginesetLocalVideoCanvas(StreamIndex index, const VideoCanvas& canvas)setLocalVideoCanvas(const VideoCanvas& canvas)参数变化: 删除StreamIndex参数
IRTCEngineupdateLocalVideoCanvas(StreamIndex index, const enum RenderMode render_mode, const uint32_t background_color)updateLocalVideoCanvas(const enum RenderMode render_mode, const uint32_t background_color)参数变化: 删除StreamIndex参数
IRTCEnginesetRemoteVideoCanvas(RemoteStreamKey stream_key, const VideoCanvas& canvas)setRemoteVideoCanvas(const char* stream_id, const VideoCanvas& canvas)参数变化: 将RemoteStreamKey变为stream_id
IRTCEngineupdateRemoteStreamVideoCanvas(RemoteStreamKey stream_key, const RemoteVideoRenderConfig& remote_video_render_config)updateRemoteStreamVideoCanvas(const char* stream_id, const RemoteVideoRenderConfig& remote_video_render_config)参数变化: 将RemoteStreamKey变为stream_id
IRTCEnginesetLocalVideoSink(StreamIndex index, IVideoSink* video_sink, LocalVideoSinkConfig& config)setLocalVideoSink(IVideoSink* video_sink, LocalVideoSinkConfig& config)参数变化: 删除StreamIndex参数
IRTCEnginesetRemoteVideoSink(RemoteStreamKey stream_key, IVideoSink* video_sink, RemoteVideoSinkConfig& config)setRemoteVideoSink(const char* stream_id, IVideoSink* video_sink, RemoteVideoSinkConfig& config)参数变化: 将RemoteStreamKey变为stream_id
IRTCEnginesetVideoSourceType(StreamIndex stream_index, VideoSourceType type)setVideoSourceType(VideoSourceType type)参数变化: 删除StreamIndex参数
IRTCEnginesetRemoteVideoMirrorType(RemoteStreamKey stream_key, RemoteMirrorType mirror_type)setRemoteVideoMirrorType(const char* stream_id, RemoteMirrorType mirror_type)参数变化: 将RemoteStreamKey变为stream_id
IRTCEnginesendSEIMessage(StreamIndex stream_index, const uint8_t* message, int length, int repeat_count, SEICountPerFrame mode)sendSEIMessage(const uint8_t* message, int length, int repeat_count, SEICountPerFrame mode)参数变化: 删除StreamIndex参数
IRTCEnginestartFileRecording(StreamIndex type, RecordingConfig config, RecordingType recording_type)startFileRecording(RecordingConfig config, RecordingType recording_type)参数变化: 删除StreamIndex参数
IRTCEnginestopFileRecording(StreamIndex type)stopFileRecording()参数变化: 删除StreamIndex参数
IRTCEnginesetRemoteAudioPlaybackVolume(const RemoteStreamKey& stream_key, int volume)setRemoteAudioPlaybackVolume(const char* stream_id, int volume)参数变化: 将RemoteStreamKey变为stream_id
IRTCEnginepushExternalEncodedVideoFrame(StreamIndex index, int video_index, IEncodedVideoFrame* video_stream)pushExternalEncodedVideoFrame(int video_index, IEncodedVideoFrame* video_stream)参数变化: 删除StreamIndex参数
IRTCEnginesetVideoDecoderConfig(RemoteStreamKey key, VideoDecoderConfig config)setVideoDecoderConfig(const char* stream_id, VideoDecoderConfig config)参数变化: 将RemoteStreamKey变为stream_id
IRTCEnginerequestRemoteVideoKeyFrame(const RemoteStreamKey& stream_info)requestRemoteVideoKeyFrame(const char* stream_id)参数变化: 将RemoteStreamKey变为stream_id
IRTCEnginesetVideoWatermark(StreamIndex stream_index, const char* image_path, RTCWatermarkConfig config)setVideoWatermark(const char* image_path, RTCWatermarkConfig config)参数变化: 删除StreamIndex参数
IRTCEngineclearVideoWatermark(StreamIndex stream_index)clearVideoWatermark()参数变化: 删除StreamIndex参数
IRTCEngineEventHandleronUserStartVideoCapture(const char* room_id, const char* user_id)onUserStartVideoCapture(const char* stream_id, const StreamInfo& stream_info)参数变化: 将roomId和userId改为streamId和streamInfo
IRTCEngineEventHandleronUserStopVideoCapture(const char* room_id, const char* user_id)onUserStopVideoCapture(const char* stream_id, const StreamInfo& stream_info)参数变化: 将roomId和userId改为streamId和streamInfo
IRTCEngineEventHandleronUserStartAudioCapture(const char* room_id, const char* user_id)onUserStartAudioCapture(const char* stream_id, const StreamInfo& stream_info)参数变化: 将roomId和userId改为streamId和streamInfo
IRTCEngineEventHandleronUserStopAudioCapture(const char* room_id, const char* user_id)onUserStopAudioCapture(const char* stream_id, const StreamInfo& stream_info)参数变化: 将roomId和userId改为streamId和streamInfo
IRTCEngineEventHandleronLocalAudioStateChanged(LocalAudioStreamState state, LocalAudioStreamError error)onLocalAudioStateChanged(const char* stream_id, const StreamInfo& stream_info, LocalAudioStreamState state, LocalAudioStreamError error)参数变化: 添加streamId和streamInfo参数
IRTCEngineEventHandleronLocalVideoStateChanged(StreamIndex index, LocalVideoStreamState state, LocalVideoStreamError error)onLocalVideoStateChanged(const char* stream_id, const StreamInfo& stream_info, LocalVideoStreamState state, LocalVideoStreamError error)参数变化: 将streamIndex变为streamId和streamInfo
IRTCEngineEventHandleronRemoteAudioStateChanged(const RemoteStreamKey& key, RemoteAudioState state, RemoteAudioStateChangeReason reason)onRemoteAudioStateChanged(const char* stream_id, const StreamInfo& stream_info, RemoteAudioState state, RemoteAudioStateChangeReason reason)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IRTCEngineEventHandleronRemoteVideoStateChanged(RemoteStreamKey key, RemoteVideoState state, RemoteVideoStateChangeReason reason)onRemoteVideoStateChanged(const char* stream_id, const StreamInfo& stream_info, RemoteVideoState state, RemoteVideoStateChangeReason reason)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IRTCEngineEventHandleronFirstRemoteVideoFrameRendered(const RemoteStreamKey key, const VideoFrameInfo& info)onFirstRemoteVideoFrameRendered(const char* stream_id, const StreamInfo& stream_info, const VideoFrameInfo& info)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IRTCEngineEventHandleronFirstRemoteVideoFrameDecoded(const RemoteStreamKey key, const VideoFrameInfo& info)onFirstRemoteVideoFrameDecoded(const char* stream_id, const StreamInfo& stream_info, const VideoFrameInfo& info)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IRTCEngineEventHandleronFirstLocalVideoFrameCaptured(StreamIndex index, VideoFrameInfo info)onFirstLocalVideoFrameCaptured(IVideoSource* video_source, VideoFrameInfo info)参数变化: 将streamIndex变为VideoSource
IRTCEngineEventHandleronLocalVideoSizeChanged(StreamIndex index, const VideoFrameInfo& info)onLocalVideoSizeChanged(IVideoSource* video_source, const VideoFrameInfo& info)参数变化: 将streamIndex变为VideoSource
IRTCEngineEventHandleronRemoteVideoSizeChanged(RemoteStreamKey key, const VideoFrameInfo& info)onRemoteVideoSizeChanged(const char* stream_id, const StreamInfo& stream_info, const VideoFrameInfo& info)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IRTCEngineEventHandleronFirstLocalAudioFrame(StreamIndex index)onFirstLocalAudioFrame(IAudioSource* audio_source)参数变化: 将streamIndex变为AudioSource
IRTCEngineEventHandleronFirstRemoteAudioFrame(const RemoteStreamKey& key)onFirstRemoteAudioFrame(const char* stream_id, const StreamInfo& stream_info)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IRTCEngineEventHandleronSEIMessageReceived(RemoteStreamKey stream_key, const uint8_t* message, int length)onSEIMessageReceived(const char* stream_id, const StreamInfo& stream_info, const uint8_t* message, int length)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IRTCEngineEventHandleronSEIStreamUpdate(const RemoteStreamKey& key, SEIStreamEventType type)onSEIStreamUpdate(const char* stream_id, const StreamInfo& stream_info, SEIStreamEventType type)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IRTCEngineEventHandleronRecordingStateUpdate(StreamIndex type, RecordingState state, RecordingErrorCode error_code, RecordingInfo info)onRecordingStateUpdate(IVideoSource* video_source, RecordingState state, RecordingErrorCode error_code, RecordingInfo info)参数变化: 将streamIndex变为VideoSource
IRTCEngineEventHandleronRecordingProgressUpdate(StreamIndex type, RecordingProgress process, RecordingInfo info)onRecordingProgressUpdate(IVideoSource* video_source, RecordingProgress process, RecordingInfo info)参数变化: 将streamIndex变为VideoSource
IRTCEngineEventHandleronStreamSyncInfoReceived(RemoteStreamKey stream_key, SyncInfoStreamType stream_type, const uint8_t* data, int32_t length)onStreamSyncInfoReceived(const char* stream_id, const StreamInfo& stream_info, SyncInfoStreamType stream_type, const uint8_t* data, int32_t length)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IRTCEngineEventHandleronAudioFrameSendStateChanged(const char* room_id, const RtcUser& user, FirstFrameSendState state)onAudioFrameSendStateChanged(const char* stream_id, const StreamInfo& stream_info, const RtcUser& user, FirstFrameSendState state)参数变化: 将roomId改为streamId和streamInfo
IRTCEngineEventHandleronVideoFrameSendStateChanged(const char* room_id, const RtcUser& user, FirstFrameSendState state)onVideoFrameSendStateChanged(const char* stream_id, const StreamInfo& stream_info, const RtcUser& user, FirstFrameSendState state)参数变化: 将roomId改为streamId和streamInfo
IRTCEngineEventHandleronAudioFramePlayStateChanged(const char* room_id, const RtcUser& user, FirstFramePlayState state)onAudioFramePlayStateChanged(const char* stream_id, const StreamInfo& stream_info, const RtcUser& user, FirstFramePlayState state)参数变化: 将roomId改为streamId和streamInfo
IRTCEngineEventHandleronVideoFramePlayStateChanged(const char* room_id, const RtcUser& user, FirstFramePlayState state)onVideoFramePlayStateChanged(const char* stream_id, const StreamInfo& stream_info, const RtcUser& user, FirstFramePlayState state)参数变化: 将roomId改为streamId和streamInfo
IRTCEngineEventHandleronSimulcastSubscribeFallback(const RemoteStreamSwitch& event)onSimulcastSubscribeFallback(const char* stream_id, const StreamInfo& stream_info, const bytertc::RemoteStreamSwitch& event)参数变化: 添加参数streamId和streamInfo
IRTCEngineEventHandleronPerformanceAlarms(bytertc::PerformanceAlarmMode mode, const char* room_id, bytertc::PerformanceAlarmReason reason, const bytertc::SourceWantedData& data)onPerformanceAlarms(const char* stream_id, const StreamInfo& stream_info, bytertc::PerformanceAlarmMode mode, bytertc::PerformanceAlarmReason reason, const bytertc::SourceWantedData& data)参数变化: 添加参数streamId和streamInfo
IRTCRoomEventHandleronRemoteStreamStats(const char* stream_id, const bytertc::StreamInfo& stream_info, const RemoteStreamStats& stats)onRemoteStreamStats(const RemoteStreamStats& stats)参数变化: 添加参数streamId和streamInfo
ILocalEncodedVideoFrameObserveronLocalEncodedVideoFrame(StreamIndex type, const IEncodedVideoFrame& video_stream))onLocalEncodedVideoFrame(IVideoSource *video_source, const IEncodedVideoFrame& video_stream)参数变化: 将streamIndex变为VideoSource
IRemoteEncodedVideoFrameObserveronRemoteEncodedVideoFrame(const RemoteStreamKey& stream_info, const IEncodedVideoFrame& video_stream)onRemoteEncodedVideoFrame(const char* stream_id, const StreamInfo& stream_info, const IEncodedVideoFrame& video_stream)参数变化: 将RemoteStreamKey变为streamId和streamInfo
ISnapshotResultCallbackonTakeLocalSnapshotResult(long task_id, StreamIndex stream_index, IVideoFrame* image, int error_code)onTakeLocalSnapshotResult(long task_id, IVideoSource* video_source, IVideoFrame* image, int error_code)参数变化: 将streamIndex变为VideoSource
ISnapshotResultCallbackonTakeRemoteSnapshotResult(long task_id, RemoteStreamKey stream_key, IVideoFrame* image, int error_code)onTakeRemoteSnapshotResult(long task_id, const char* stream_id, const StreamInfo& stream_info, IVideoFrame* image, int error_code)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IAudioFrameObserveronRemoteUserAudioFrame(const RemoteStreamKey& stream_info, const IAudioFrame& audio_frame)onRemoteUserAudioFrame(const char* stream_id, const StreamInfo& stream_info, const IAudioFrame& audio_frame)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IAudioFrameProcessoronProcessRemoteUserAudioFrame(const RemoteStreamKey& stream_info, IAudioFrame& audio_frame)onProcessRemoteUserAudioFrame(const char* stream_id, const StreamInfo& stream_info, IAudioFrame& audio_frame)参数变化: 将RemoteStreamKey变为streamId和streamInfo
IExternalVideoEncoderEventHandleronStart(StreamIndex index)onStart(const char* stream_id, const StreamInfo& stream_info)参数变化: 将streamIndex变为streamId和streamInfo
IExternalVideoEncoderEventHandleronStop(StreamIndex index)onStop(const char* stream_id, const StreamInfo& stream_info)参数变化: 将streamIndex变为streamId和streamInfo
IExternalVideoEncoderEventHandleronRateUpdate(StreamIndex index, int32_t video_index, VideoRateInfo info)onRateUpdate(const char* stream_id, const StreamInfo& stream_info, int32_t video_index, VideoRateInfo info)参数变化: 将streamIndex变为streamId和streamInfo
IExternalVideoEncoderEventHandleronRequestKeyFrame(StreamIndex index, int32_t video_index)onRequestKeyFrame(const char* stream_id, const StreamInfo& stream_info, int32_t video_index)参数变化: 将streamIndex变为streamId和streamInfo
IExternalVideoEncoderEventHandleronActiveVideoLayer(StreamIndex index, int32_t video_index, bool active)onActiveVideoLayer(const char* stream_id, const StreamInfo& stream_info, int32_t video_index, bool active)参数变化: 将streamIndex变为streamId和streamInfo
ILocalEncodedAudioFrameObserveronLocalEncodedAudioFrame(StreamIndex type, const EncodedAudioFrameData& audio_stream)onLocalEncodedAudioFrame(IAudioSource* audio_source, const EncodedAudioFrameData& audio_stream)参数变化: 将streamIndex变为AudioSource

类型变更

房间模式

类型名V3.58V3.60详情

RoomProfileType

kRoomProfileTypeChat = 5

kRoomProfileTypeLwTogether = 7

kRoomProfileTypeCall = 19

注重流畅性,视频缺省码率相对低,对音质要求低,流畅性要求高。

kRoomProfileTypeGameHD = 8

kRoomProfileTypeCoHost = 9

kRoomProfileTypeKTV = 11

kRoomProfileTypeVRChat = 13

kRoomProfileTypeLanLiveStreaming = 15

kRoomProfileTypeLiveBroadcasting = 1

kRoomProfileTypeLive = 20

更注重画质,视频缺省码率相对高,对音质要求高。

  • 自定义流处理

变更类型V3.58V3.60
名称变更、默认值变更LocalVideoRenderPosition名称变更为: LocalVideoSinkPosition默认值变更:由 kLocalVideoRenderPositionAfterCapture(前处理前) 变更为 kLocalVideoSinkPositionAfterPreProcess(前处理后)。
名称变更RemoteVideoRenderPositionRemoteVideoSinkPosition
名称变更VideoRenderMirrorTypeVideoSinkMirrorType

视频帧相关

变更类型V3.58V3.60变更说明

参数变更

IVideoFrame

VideoFrameData

具体变更如下:

  • 变更参数:
    • frameType() 变更为 bufferType()
    • videoContentType() 变更为 contentType()
    • getPlaneData(int plane_index) 变更为 planeData(int plane_index)
    • getPlaneStride(int plane_index) 变更为 planeStride(int plane_index)
    • getExtraDataInfo(int& size) 变更为 seiData(int& size)
    • getTexMatrix(float matrix[16]) 变更为 textureMatrix(float matrix[16])
    • getTextureId() 变更为 textureId()getCameraId() 变更为 cameraId()
    • getHwaccelContext() 变更为 hwContext()
    • getHwaccelBuffer() 变更为 hwBuffer()
  • 删除参数:
    • 删除 colorSpace()
    • 删除 flip()
    • getSupplementaryInfo(int& size) 删除
    • 删除 release()
    • 删除 toI420()
    • 删除 shadowCopy()
    • 删除 getAndroidHwaccelContext()
  • 新增参数:
    • 新增 addRef()
    • 新增 releaseRef()

合流转推事件

  • 名称替换:StreamMixingEvent 变更为 MixedStreamTaskEvent,和 WTN 流任务共用同一个事件枚举类。
  • 枚举值变更如下:

描述V3.58V3.60

请求发起任务

推流成功

kStreamMixingEventStart = 1

kStreamMixingEventStartSuccess = 2

kMixedStreamTaskEventStartSuccess = 1

任务发起失败

kStreamMixingEventStartFailed= 3

kMixedStreamTaskEventStartFailed = 2

具体失败原因参看 MixedStreamTaskErrorCode

请求更新

任务更新成功

kStreamMixingEventUpdate = 4

kStreamMixingEventUpdateSuccess = 5

kMixedStreamTaskEventUpdateSuccess = 3

任务更新失败

kStreamMixingEventUpdateFailed = 6

kMixedStreamTaskEventUpdateFailed = 4

具体失败原因参看 MixedStreamTaskErrorCode

请求结束任务

任务结束成功

kStreamMixingEventStop = 7

kStreamMixingEventStopSuccess = 8

kMixedStreamTaskEventStopSuccess = 5

任务结束失败

kStreamMixingEventStopFailed = 9

kMixedStreamTaskEventStopFailed = 6

具体失败原因参看 MixedStreamTaskErrorCode

参数错误kStreamMixingEventRequestParamError = 15调用 startPushMixedStream 或 updatePushMixedStream 返回 kReturnStatusParameterErr = -2

任务处理超时,请检查网络状态并重试

kStreamMixingEventUpdateTimeout = 13

kStreamMixingEventStartTimeout = 14

调用 startPushMixedStream 或 updatePushMixedStream 时返回 kMixedStreamTaskErrorCodeTimeout = 1091

合流加图片

kStreamMixingEventMixImageEvent = 16

kMixedStreamTaskEventWarning = 7

具体失败原因参看 MixedStreamTaskErrorCode

Warning 事件无kMixedStreamTaskEventWarning = 7

其他

kStreamMixingEventFirstAudioFrameByClientMix = 11

kStreamMixingEventFirstVideoFrameByClientMix = 12

kStreamMixingEventChangeMixType = 10

移除

单流转推事件

  • 名称变化:由 SingleStreamPushEvent 变更为 SingleStreamTaskEvent。
  • 具体枚举值变化如下

描述V3.58V3.60
开始推流kSingleStreamPushEventStart = 1kSingleStreamTaskEventStartSuccess = 1
推流成功kSingleStreamPushEventStartSuccess = 2kSingleStreamTaskEventStartSuccess = 1
推流失败kSingleStreamPushEventStartFailed = 3kSingleStreamTaskEventStartFailed = 2
停止推流kSingleStreamPushEventStop = 4kSingleStreamTaskEventStopSuccess = 3
单流转推直播任务处理超时,请检查网络状态并重试kSingleStreamPushEventTimeout = 5kSingleStreamTaskEventWarning = 5,具体错误信息参看 SingleStreamTaskErrorCode。
参数错误kSingleStreamPushEventParamError = 6调用 startPushSingleStream 时返回 kReturnStatusParameterErr = -2。
停止推流失败无kSingleStreamTaskEventStopFailed = 4

音视频流统计信息相关

功能改动的数据类型变更说明
本地音频流统计信息LocalAudioStats增加字段 audio_device_loop_delay(音频采集播放延时)、encode_frame_rate(音频编码帧率)
远端音频流统计信息RemoteAudioStats增加字段 decode_frame_rate(音频解码帧率)
远端视频流统计信息RemoteVideoStats增加字段 cap_to_render_delay(从发送端开始采集到接收端渲染完成的延时)、av_sync_diff_ms(音画同步差异)、codec_elapse_per_frame(视频解码平均耗时)

自定义加密类型

功能改动的数据类型变更说明
参数变更EncryptTypekEncryptTypeCustomize = 0 改为 kEncryptTypeNone = 0,实现关闭内置加密如果已调用了 setCustomizeEncryptHandler 设置自定义加密,再调用 setEncryptInfo 传入 0,会关闭自定义加密,如果你需要开启自定义加密,需要调用 setCustomizeEncryptHandler 重新设置。(更改之前,不会关闭自定义加密)

其他

功能名称变更说明
发布状态变化原因PublishStateChangeReason新增类

截图错误码

SnapshotErrorCode

新增枚举

截图成功(0、kSnapshotErrorCodeOk)

截图错误。生成图片数据失败或 RGBA 编码失败(-1、kSnapshotErrorCodeCreateFail)

截图错误。流无效(-2、kSnapshotErrorCodeStreamInvalid)

截图错误。截图超时,超时时间 1 秒(-3、kSnapshotErrorCodeTimeout)

截图错误。图片保存失败(-4、kSnapshotErrorCodeFileSaveError)

音频场景类型

AudioScenarioType

枚举值增加

教育场景。适用于以人声教学内容为主的高音质场景(4、kAudioScenarioTypeEducation)

AI 对话场景(5、kAudioScenarioTypeAiClient)

耳返功能的 Audio Filter 类型

EarMonitorAudioFilter

新增枚举

没有 Audio Filter(默认设置)(0x0001、kEarMonitorAudioFilterNone)

耳返复用 3A 处理(0x8000、kEarMonitorAudioFilterReuseAudioProcessing)

登录错误码

LoginErrorCode

错误码增加:

增加登录错误码增加-1004,代表当前为受限模式

在受限模式下使用RTS的能力具有以下限制:

支持房间内广播和点对点;

发送消息速率不超过30KB/秒;

发送消息频率不超过60包/秒;

发送消息包长度不超过1KB;

受限/非受限模式的切换,需要在火山控制台设置。

单流转推直播错误码

SingleStreamTaskErrorCode

枚举值增加

服务端检测任务参数不合法(1093、kSingleStreamTaskErrorCodeInvalidParamByServer)

转推任务在目标房间的用户ID被踢出目标房间(1094、kSingleStreamTaskErrorRemoteKicked)

转推任务加入目标房间失败(1095、kSingleStreamTaskErrorCodeJoinDestRoomFailed)

转推任务在源房间拉流超时(1096、kSingleStreamTaskErrorCodeReceiveSrcStreamTimeout)

音视频编码转推任务不支持(1097、kSingleStreamTaskErrorCodeNotSurportCodec)

单流转推配置目标房间信息DestInfo新增类

单流转推类型

SingleStreamPushType

枚举增加

单流转推到CDN(1、kPushToCDN)

单流转推到RTC房间(2、kPushToRTC)

单流转推直播配置参数

PushSingleStreamParam

成员增加

单流转推直播配置参数中增加:单流转推配置目标房间信息列表(dest_info)、转推目标房间数量,dest_info 的数组长度(dest_info_size)、转推类型(push_type)三个成员

镜像类型

MirrorType

枚举值增加

本地预览时无镜像效果,仅编码传输时有镜像效果(2、ByteRTCMirrorTypeEncoder)

错误码变更

回调告警 - WarningCode

V3.58V3.60

kWarningCodeOldRoomBeenReplaced = -2016

移除:

使用相同 roomId 再次创建房间时,将返回上次创建的房间实例,不再触发此错误码。

WTN 流错误码(原公共流)

  • 错误码名称变更:PublicStreamErrorCode 变更为 MixedStreamTaskErrorCode,和合流转推任务共用同一个枚举类。
  • 具体错误码的变更详情如下:

描述V3.58V3.60
成功kPublicStreamErrorCodeOK = 0kMixedStreamTaskErrorCodeOK = 0
服务端参数检验失败kPublicStreamErrorCodePushInvalidParam = 1191删除,不会回调此类错误。
服务端内部错误kPublicStreamErrorCodePushInvalidStatus = 1192删除,不会回调此类错误。
服务端未知错误kPublicStreamErrorCodePushInternalError = 1193删除,不会回调此类错误。
任务失败kPublicStreamErrorCodePushFailed = 1195kMixedStreamTaskErrorCodePushWTNFailed = 1195
任务超时kPublicStreamErrorCodePushTimeout = 1196kMixedStreamTaskErrorCodeTimeout = 1091
流订阅超时kPublicStreamErrorCodePullNoPushStream = 1300WTNSubscribeStateChangeReason.kWTNSubscribeStateChangeReasonUnsubscribe = 1300,通过 onWTNVideoSubscribeStateChanged 或onWTNAudioSubscribeStateChanged 返回。

合流转推错误码

  • 错误码名称变更:StreamMixingErrorCode 变更为 MixedStreamTaskErrorCode,和 WTN 流任务共用同一个枚举类。
  • 具体错误码的变更详情如下:

描述V3.58V3.60
推流成功kStreamMixingErrorCodeCodeOK = 0kMixedStreamTaskErrorCodeOK = 0
未定义的合流错误kStreamMixingErrorCodeCodeBase = 1090无,该错误码未启用。
客户端 SDK 检测到无效推流参数kStreamMixingErrorCodeCodeInvalidParam = 1091调用 startPushMixedStream 或 updatePushMixedStream 时返回 kReturnStatusParameterErr = -2。
状态错误,需要在状态机正常状态下发起操作kStreamMixingErrorCodeCodeInvalidState = 1092kMixedStreamTaskErrorCodeInvalidStateByServer = 1094
无效操作kStreamMixingErrorCodeCodeInvalidOperator = 1093kMixedStreamTaskErrorCodeInvalidStateByServer = 1094
转推直播任务处理超时,请检查网络状态并重试kStreamMixingErrorCodeCodeTimeOut = 1094kMixedStreamTaskErrorCodeTimeOut = 1091
服务端检测到错误的推流参数kStreamMixingErrorCodeCodeInvalidParamByServer = 1095kMixedStreamTaskErrorCodeInvalidParamByServer = 1092
对流的订阅超时kStreamMixingErrorCodeCodeSubTimeoutByServer = 1096kMixedStreamTaskErrorCodeSubTimeoutByServer = 1093
合流服务端内部错误kStreamMixingErrorCodeCodeInvalidStateByServer = 1097kMixedStreamTaskErrorCodeInvalidStateByServer = 1094
合流服务端推 CDN 失败kStreamMixingErrorCodeCodeAuthenticationByCDN = 1098kMixedStreamTaskErrorCodeAuthenticationByCDN = 1095
服务端接收信令超时,请检查网络状态并重试。kStreamMixingErrorCodeCodeTimeoutBySignaling = 1099kMixedStreamTaskErrorCodeSignalRequestTimeout = 1097
图片合流失败kStreamMixingErrorCodeCodeMixImageFail = 1100kMixedStreamTaskErrorCodeMixImageFailed = 1098
服务端未知错误kStreamMixingErrorCodeCodeUnKnownErrorByServer = 1101kMixedStreamTaskErrorCodeUnKnownErrorByServer = 1096

单流转推错误码

  • 错误码替换:由 StreamMixingErrorCode 替换为 SingleStreamTaskErrorCode。
  • 具体错误码的变更和对应详情如下:

描述V3.58V3.60
推流成功TRANSCODER_ERROR_OK = 0kSingleStreamTaskErrorCodeOK = 0
未定义的合流错误TRANSCODER_ERROR_BASE = 1090无,该错误码未启用。
客户端 SDK 检测到无效推流参数TRANSCODER_ERROR_INVALID_PARAM = 1091调用 startPushSingleStream 时返回 kReturnStatusParameterErr = -2。
状态错误,需要在状态机正常状态下发起操作TRANSCODER_ERROR_INVALID_STATE = 1092无,单流任务不会触发该错误码。
无效操作TRANSCODER_ERROR_INVALID_OPERATOR = 1093无,单流任务不会触发该错误码。
转推直播任务处理超时,请检查网络状态并重试TRANSCODER_ERROR_TIMEOUT = 1094无,单流任务不会触发该错误码。
服务端检测到错误的推流参数TRANSCODER_ERROR_INVALID_PARAM_BY_SERVER = 1095无,单流任务不会触发该错误码。
对流的订阅超时TRANSCODER_ERROR_SUB_TIMEOUT_BY_SERVER = 1096无,单流任务不会触发该错误码。
合流服务端内部错误TRANSCODER_ERROR_INVALID_STATE_BY_SERVER = 1097无,单流任务不会触发该错误码。
合流服务端推 CDN 失败TRANSCODER_ERROR_AUTHENTICATION_BY_CDN = 1098无,单流任务不会触发该错误码。
服务端接收信令超时,请检查网络状态并重试TRANSCODER_ERROR_TIMEOUT_BY_SIGNALING = 1099kSingleStreamTaskErrorCodeSignalRequestTimeout = 1092
图片合流失败TRANSCODER_ERROR_MIX_IMAGE_FAIL = 1100无,单流任务不会触发该错误码。
服务端未知错误TRANSCODER_ERROR_UNKNOW_ERROR_BY_SERVER = 1101kSingleStreamTaskErrorCodeUnKnownByServer = 1091

其他错误码

删除了部分已废弃多个版本的错误码:

描述错误码
调用 createRTCRoom 时使用的 roomid 非法,会返回 null,并抛出该 error。kRoomErrorCodeRoomIdIllegal = -1007
通话回路检测已经存在同样 roomId 的房间了。kErrorCodeRoomAlreadyExist = -1013
获取房间信息失败警告。kWarningCodeGetRoomFailed = -2000
自动订阅模式未关闭时,尝试开启手动订阅模式会触发此警告。kWarningCodeSubscribeStreamForbiden = -2010
发布流总数超过上限。kErrorCodeOverScreenPublishLimit = -1081
公共流的参数异常,请修改参数后重试。kPublicStreamErrorCodePushInvalidParam = 1191
服务端状态异常,将自动重试。kPublicStreamErrorCodePushInvalidStatus = 1192
内部错误,不可恢复,请重试。kPublicStreamErrorCodePushInternalError = 1193
发布失败,将自动重试,请关注重试结果。kPublicStreamErrorCodePushFailed = 1195
发布失败,10 s 后会重试,重试 3 次后自动停止。kPublicStreamErrorCodePushTimeout = 1196

新增接口

接口功能说明
IRTCEngine::createRTSRoom创建RTS房间
IRTCEngine::pushReferenceAudioPCMData将外部音频参考帧推到sdk内
IRTCRoom::getCallId获取通话 ID。该方法需要在加入房间后调用
IRemoteEncodedAudioFrameObserver::onRemoteEncodedAudioFrame调用 RegisterRemoteEncodedAudioFrameObserver 后,SDK 收到远端音频帧信息时,回调该事件
IRTCEngine::muteScreenAudioCapture设置是否将屏幕音频源的录音信号静音(不改变本端硬件)。
IRTCRoom::setStreamExtraInfo设置当前推流的流附加信息。
IRTCRoomEventHandler::onRoomStreamExtraInfoUpdate接收同一房间内,其他用户调用 setStreamExtraInfo设置的流附加信息的回调。
IRTCEngine::takeLocalSnapshotToFile截取本地视频流画面,生成 JPG 文件,并保存到本地指定路径。
IRTCEngine::takeRemoteSnapshotToFile截取远端的视频流画面,生成 JPG 文件,并保存到本地指定路径。
IRTCEngineEventHandler::onLocalSnapshotTakenToFile用 takeSnapshotToFile:filePath:{@link #ByteRTCVideo#takeSnapshotToFile:filePath:} 截取视频画面时,会收到此回调报告截图是否成功,以及截取的图片信息。
IRTCEngineEventHandler::onRemoteSnapshotTakenToFile用 takeSnapshotToFile:filePath:{@link #ByteRTCVideo#takeSnapshotToFile:filePath:} 截取视频画面时,会收到此回调报告截图是否成功,以及截取的图片信息。

删除/废弃接口

删除了已废弃或不推荐使用的方法,具体如下:

变更类型已删除/废弃接口替代接口
废弃setLocalVideoSink(IVideoSink* video_sink, IVideoSink::PixelFormat required_format)setLocalVideoSink(IVideoSink* video_sink, LocalVideoSinkConfig& config) = 0
废弃setRemoteVideoSink(RemoteStreamKey stream_key, IVideoSink* video_sink, IVideoSink::PixelFormat required_format)setRemoteVideoSink(const char* stream_id, IVideoSink* video_sink, RemoteVideoSinkConfig& config)
删除createRTCVideo(const char* app_id, bytertc::IRTCVideoEventHandler event_handler, const char parameters)createRTCEngine(const EngineConfig& config, IRTCEngineEventHandler* event_handler)
删除IAudioDeviceManager::enableFilterSilentDevice(bool enable)如果你需要使用过滤无声设备功能,请联系技术支持。
删除IVideoFrame.buildVideoFrame使用 VideoFrameData 替代。
删除getErrorDescription无替代接口

删除

  • startASR(const RTCASRConfig& asr_config, IRTCASREngineEventHandler* handler)
  • stopASR()

无替代接口

如果需要使用 ASR 功能,可以通过实时字幕功能相关接口实现:startSubtitle、stopSubtitle

删除* onError(int err)如果需要使用 ASR 功能,可以通过实时字幕功能相关接口实现。onSubtitleStateChanged、onSubtitleMessageReceived

删除

subscribeUserStream(const char* user_id, StreamIndex stream_type, SubscribeMediaType media_type, const SubscribeVideoConfig& video_config)

  • subscribeStreamVideo(const char *stream_id, bool subscribe)
  • subscribeStreamAudio(const char *stream_id, bool subscribe)
删除onRoomError(int err)onRoomStateChanged(const char* room_id, const char* uid, int state, const char* extra_info)

删除

IAudioMixingManager

IMediaPlayer

IAudioEffectPlayer

删除

onAudioMixingStateChanged(int mix_id, bytertc::AudioMixingState state, bytertc::AudioMixingError error)

onMediaPlayerStateChanged( int player_id, PlayerState state, PlayerError error)

onAudioEffectPlayerStateChanged(int effect_id, PlayerState state, PlayerError error)

删除

  1. startLiveTranscoding(const char* task_id, ITranscoderParam* param, ITranscoderObserver* observer)
  2. stopLiveTranscoding(const char* task_id)
  3. updateLiveTranscoding(const char* task_id, ITranscoderParam* param)
  1. startPushMixedStream(const char* task_id, MixedStreamPushTargetConfig push_target_config, IMixedStreamConfig* config)
  2. stopPushMixedStream(const char* task_id, MixedStreamPushTargetType target_type)
  3. updatePushMixedStream(const char* task_id, MixedStreamPushTargetConfig push_target_config, IMixedStreamConfig* config)
删除muteAudioPlayback(MuteState mute_state)setPlaybackVolume(const int volume)

删除

  1. onMediaDeviceStateChanged(const char* device_id, bytertc::MediaDeviceType device_type, bytertc::MediaDeviceState device_state, bytertc::MediaDeviceError device_error)
  2. onMediaDeviceWarning(const char* device_id, bytertc::MediaDeviceType device_type, bytertc::MediaDeviceWarning device_warning)
  3. onHttpProxyState(int state)
  4. onHttpsProxyState(int state)
  5. onSocks5ProxyState(int state, const char* cmd, const char* proxy_address, const char* local_address, const char* remote_address)
  6. onUserMuteAudio(const char* room_id, const char* user_id, MuteState mute_state)
  7. onUserMuteVideo(const char* room_id, const char* uid, MuteState mute)
  1. onAudioDeviceStateChanged(const char* device_id, bytertc::RTCAudioDeviceType device_type, bytertc::MediaDeviceState device_state, bytertc::MediaDeviceError device_error)
    onVideoDeviceStateChanged(const char* device_id, bytertc::RTCVideoDeviceType device_type, bytertc::MediaDeviceState device_state, bytertc::MediaDeviceError device_error)
  2. onAudioDeviceWarning(const char* device_id, bytertc::RTCAudioDeviceType device_type, bytertc::MediaDeviceWarning device_warning)
    onVideoDeviceWarning(const char* device_id, bytertc::RTCVideoDeviceType device_type, bytertc::MediaDeviceWarning device_warning)
  3. onLocalProxyStateChanged(LocalProxyType local_proxy_type, LocalProxyState local_proxy_state, LocalProxyError local_proxy_error)
  4. onLocalProxyStateChanged(LocalProxyType local_proxy_type, LocalProxyState local_proxy_state, LocalProxyError local_proxy_error)
  5. onLocalProxyStateChanged(LocalProxyType local_proxy_type, LocalProxyState local_proxy_state, LocalProxyError local_proxy_error)
  6. onUserPublishStreamAudio(const char* stream_id, const StreamInfo& stream_info, bool is_publish)
  7. onUserPublishStreamVideo(const char* stream_id, const StreamInfo& stream_info, bool is_publish)

删除

  1. ISpatialAudio.updatePosition(const Position& pos)
  2. ISpatialAudio.updateSelfOrientation(const HumanOrientation& orientation)
  3. ISpatialAudio.updateListenerPosition(const Position &pos)
  4. ISpatialAudio.updateListenerOrientation(const HumanOrientation& orientation)
  1. ISpatialAudio.updateSelfPosition(const PositionInfo& position_info)
  2. ISpatialAudio.updateSelfPosition(const PositionInfo& position_info)
  3. ISpatialAudio.updateRemotePosition(const char* uid, const PositionInfo& position_info)
  4. ISpatialAudio.updateRemotePosition(const char* uid, const PositionInfo& position_info)

删除

  1. IVideoEffect.checkLicense(void* android_context, void* jnienv, const char* license_path)
  2. IVideoEffect.setAlgoModelPath(const char* model_path)
  3. IVideoEffect.enableEffect(bool enabled)
  4. IVideoEffect.updateNode(const char* node_path, const char* node_key, float node_value)
  5. IVideoEffect.registerFaceDetectionObserver(IFaceDetectionObserver* observer, int interval_ms)
  6. IVideoEffect.setBackgroundSticker(const char* model_path, const VirtualBackgroundSource& source)
  1. IVideoEffect.initCVResource(const char* license_file_path, const char* algo_model_dir)
  2. IVideoEffect.initCVResource(const char* license_file_path, const char* algo_model_dir)
  3. IVideoEffect.enableVideoEffect()
  4. IVideoEffect.updateEffectNode(const char* effect_node_path, const char* node_key, float node_value)
  5. IVideoEffect.enableFaceDetection(IFaceDetectionObserver* observer, unsigned int interval_ms, const char* face_model_path)
  6. IVideoEffect.enableVirtualBackground(const char* background_sticker_path, const VirtualBackgroundSource& source)

删除

  1. onScreenAudioFrameSendStateChanged(const char* room_id, const RtcUser& user, FirstFrameSendState state)
  2. onScreenVideoFramePlayStateChanged(const char* room_id, const RtcUser& user, FirstFramePlayState state)
  1. onAudioFrameSendStateChanged(String streamId, StreamInfo streamInfo, InternalRTCUser user, int state)
  2. onVideoFrameSendStateChanged(String streamId, StreamInfo streamInfo, InternalRTCUser user, int state)

删除

  1. onScreenAudioFrameSendStateChanged(const char* room_id, const RtcUser& user, FirstFrameSendState state)
  2. onScreenVideoFramePlayStateChanged(const char* room_id, const RtcUser& user, FirstFramePlayState state)
  1. onAudioFrameSendStateChanged(String streamId, StreamInfo streamInfo, InternalRTCUser user, int state)
  2. onVideoFrameSendStateChanged(String streamId, StreamInfo streamInfo, InternalRTCUser user, int state)

删除

RTCEngine(原RTCVideo)类定义的以下方法:

  • pushScreenVideoFrame(const VideoFrameData& frame)

无替代接口

3.58

类型变更

变更详情功能模块改动的数据类型说明
新增枚举值音效PlayerState

3.57

重要说明

  1. 该版本对所有不规范的 API 命名进行了统一修复,提升代码规范度和易用性。以下仅为变更示例,请至类型详情页查看所用类型的具体改动。
    变更对象变更详情旧版示例新版示例

    枚举值

    改为以 “k” 开头,“k+类名+值名”,大小写混合

    以 UserWorkerType 为例:

    • UserWorkerNormal = 0,
    • UserWorkerSupportSip = (1 << 0),
    • UserWorkerByteVc1Transcoder = (1 << 1),
    • UserWorkerNeedUserListAndCb = (1 << 2),
    • UserWorkerNeedStreamCallBack = (1 << 3),
    • UserWorkerAudioSelectionExemption = (1 << 4),

    以 UserWorkerType 为例:

    • kUserWorkerTypeNormal = 0,
    • kUserWorkerTypeSupportSip = (1 << 0),
    • kUserWorkerTypeByteVc1Transcoder = (1 << 1),
    • kUserWorkerTypeNeedUserListAndCb = (1 << 2),
    • kUserWorkerTypeNeedStreamCallBack = (1 << 3),
    • kUserWorkerTypeAudioSelectionExemption = (1 << 4),

    结构体成员

    改用下划线命名法

    以 RTCWatermarkConfig 为例:

    • visibleInPreview
    • positionInLandscapeMode
    • positionInPortraitMode

    以 RTCWatermarkConfig 为例:

    • visible_in_preview
    • position_in_landscape_mode
    • position_in_portrait_mode

方法变更

变更详情功能模块废弃的类/接口替代的类/接口说明
删除主调类IRTCEngineIRTCVideo
使用范围拓展视频处理setVideoDecoderConfigsetVideoDecoderConfig旧版接口仅支持在手动订阅时使用,新增支持在自动订阅时使用。

回调变更

变更详情功能模块废弃的类/接口替代的类/接口说明
删除主回调类IRTCEngineEventHandlerIRTCVideoEventHandler
参数变更消息virtual void onLogout()virtual void onLogout(LogoutReason reason)在 onLogout 回调上新增 reason 参数,区分用户主动/被动登出。

类型变更

变更详情功能模块改动的数据类型说明

枚举值名称变更

视频管理

RenderTargetType

kRenderTargetView 改为 kRenderTargetTypeView

kRenderTargetSurface 改为 kRenderTargetTypeSurface

成员变量新增字幕翻译服务SubtitleMessage在字幕内容回调 onSubtitleMessageReceived 的参数 SubtitleMessage 中新增成员变量 language 和 mode,可用于同时收到字幕原文和字幕译文。
类型名称变更消息USER_ONLINE_STATUS名称变更为 UserOnlineStatus。

错误码变更

变更详情错误码说明

枚举值增删

UserMessageSendResult

新增客户端向业务服务器发送消息失败错误码:

kUserMessageSendResultE2BSSendFailed = 17

kUserMessageSendResultE2BSReturnFailed = 18

3.54

重要说明

  1. 该版本 Linux 端新增音频编解码器插件、视频编解码器插件,详情参看按需集成插件文档。
  2. 该版本为全部 API 增加返回值,通过返回值可以明确发现失败的 API 调用,定位失败原因。具体返回值的含义参看各 API 注释。

方法变更

变更详情功能模块变动前方法变动后方法说明

将混音相关的类和接口按音效和音乐进行拆分,具体变动情况请参看混音相关的新旧接口对应表

混音

  • getAudioMixingManager
  • IAudioMixingManager

一般来说,对于短时间的音效(比如小于 20s),可以使用音效类;对于较长的音频或 PCM 数据,可以使用音乐类。


附:混音相关的新旧接口对应表

接口分类接口用途废弃类/接口新类/接口(音效)新类/接口(音乐)备注
获取实例获取播放器实例getAudioMixingManagergetAudioEffectPlayergetMediaPlayer
混音类IAudioMixingManagerIAudioEffectPlayerIMediaPlayer

混音主调接口

将音效文件加载至内存

  • preloadAudioMixing
  • unloadAudioMixing
  • preload
  • unload
  • unloadAll
  • open
  • openWithCustomSource

播放/停止/暂停/恢复

  • startAudioMixing
  • stopAudioMixing
  • stopAllAudioMixing
  • pauseAudioMixing
  • pauseAllAudioMixing
  • resumeAudioMixing
  • resumeAllAudioMixing
  • start
  • stop
  • stopAll
  • pause
  • pauseAll
  • resume
  • resumeAll
  • start
  • stop
  • stopAll
  • pause
  • resume

获取/指定位置/时长

  • setAudioMixingPosition
  • getAudioMixingCurrentPosition
  • getAudioMixingDuration
  • setPosition
  • getPosition
  • getDuration
  • setPosition
  • getTotalDuration
  • getPlaybackDuration

获取/指定音量

  • setAudioMixingVolume
  • NA
  • setVolume
  • getVolume
  • setVolume
  • getVolume
调整音调setAudioMixingPitchNAsetAudioPitch
设置声道模式setAudioMixingDualMonoModeNAsetAudioDualMonoMode

获取/设置音轨数

  • getAudioTrackCount
  • selectAudioTrack

NA

  • getAudioTrackCount
  • selectAudioTrack

Index 取值修改为从 0 开始

设置播放速度setAudioMixingPlaybackSpeedNAsetPlaybackSpeed
设置播放进度回调间隔setAudioMixingProgressIntervalNAsetProgressInterval
设置响度setAudioMixingLoudnessNAsetLoudness

播放外部音频源

  • enableAudioMixingFrame
  • disableAudioMixingFrame
  • pushAudioMixingFrame

NA

  • openWithCustomSource
  • pushExternalAudioFrame

混音回调接口

播放状态回调

onAudioMixingStateChanged

  • setEventHandler
  • onAudioEffectPlayerStateChanged
  • setEventHandler
  • onMediaPlayerStateChanged
  • onMediaPlayerPlayingProgress

音频数据回调

  • registerAudioFileFrameObserver
  • onAudioFileFrame

NA

  • IMediaPlayerAudioFrameObserver
  • onFrame

3.52

方法变更

变更详情方法说明
参数变更feedback参数数据类型变更

回调变更

变更详情方法说明

参数变更

onPublicStreamSEIMessageReceived

参数 sourceType 的类型由 SEIMessageSourceType 变更为 DataMessageSourceType

拆分为:

  • onPublicStreamSEIMessageReceived:接收客户端插入的 SEI 消息。
  • onPublicStreamDataMessageReceived:接收服务端插入的 SEI 消息和其他数据信息,例如音量信息。

错误码变更

变更详情错误码说明

枚举值变更

PublicStreamErrorCode

新增枚举值:

  • kPublicStreamErrorCodePullNoPushStream = 1300

名称变更:

  • kPublicStreamOK = 0 更新为 kPublicStreamErrorCodeOK = 0
  • kPublicStreamPushInvalidParam = 1191 更新为 kPublicStreamErrorCodePushInvalidParam = 119
  • kPublicStreamPushInvalidStatus = 1192 更新为 kPublicStreamErrorCodePushInvalidStatus = 1192
  • kPublicStreamPushInternalError = 1193 更新为 kPublicStreamErrorCodePushInternalError = 1193
  • kPublicStreamPushFailed = 1195 更新为 kPublicStreamErrorCodePushFailed = 1195
  • kPublicStreamPushTimeout = 1196 更新为 kPublicStreamErrorCodePushTimeout = 1196

ErrorCode

新增枚举值 ByteRTCErrorCodeJoinRoomRoomForbidden=-1025 和 ByteRTCErrorCodeJoinRoomUserForbidden=-1026。

当服务端在指定房间封禁指定用户,而此用户加入房间失败,或从房间中被踢出时收到。

废弃枚举值 kErrorCodeOverScreenPublishLimit=-1081,用 kErrorCodeOverStreamPublishLimit=-1080 代替。

3.50

头文件变更

原 bytertc_common_defines.h 文件拆分为 bytertc_media_defines.h 及 bytertc_rts_defines.h

方法变更

变更详情功能模块变动前方法变动后方法备注

返回值变更

房间管理

joinRoom 返回值含义如下:

  • -1:无效的参数。
  • -2:已经在房间内。

joinRoom 返回值含义如下:

  • -1:调用失败。
  • -2:无效的参数。
  • -4:已经在房间内。

返回值为 0 代表成功,不变。

引擎管理

setBusinessId 返回值含义如下:

  • < 0: 失败,具体原因参照 BusinessCheckCode。
  • -6001: 用户已经在房间中。
  • -6002: 输入非法。

setBusinessId 返回值含义如下:

  • < 0: 失败,具体原因参照 ReturnStatus
  • -2: 输入非法。

拆分

视频管理

virtual int registerFaceDetectionObserver(IFaceDetectionObserver* observer, int interval_ms) = 0;

  • virtual int enableFaceDetection(IFaceDetectionObserver* observer, unsigned int interval_ms, const char* faceModelPath) = 0;
  • virtual int disableFaceDetection() = 0;

解除人脸识别与视频特效之间的耦合,提升接口易用性。

参数类型变更屏幕共享virtual int setScreenVideoEncoderConfig(const VideoEncoderConfig& screen_solution) = 0;virtual int setScreenVideoEncoderConfig(const ScreenVideoEncoderConfig& screen_solution) = 0;参数类型变更为新增的 ScreenVideoEncoderConfig

行为变更

屏幕共享

  • setVideoSourceType: 屏幕流默认为外部源
  • setScreenAudioSourceType: 当前设置为内部源时,且已开启了采集,调用该接口切换为外部源时,不会停止内部采集
  • startScreenVideoCapture: 当前为外部源时,调用本接口将自动切换为内部源,并开启采集
  • stopScreenVideoCapture: 当前为外部源时,调用本接口将关闭外部采集
  • setVideoSourceType: 屏幕流默认为内部源
  • setScreenAudioSourceType: 当前设置为内部源时,且已开启了采集,调用该接口切换为外部源时,自动停止内部采集
  • startScreenVideoCapture: 当前为外部源时,调用本接口失败,并触发 onVideoDeviceWarning
  • stopScreenVideoCapture: 当前为外部源时,调用本接口失败,并触发 onVideoDeviceWarning

优化屏幕共享接口的行为

废弃自定义流处理registerVideoFrameObserver用 setLocalVideoSink 和 setRemoteVideoSink 代替

名称和参数变更

音视频处理

  • virtual int checkLicense(void* androidContext, void* jnienv, const char* licensePath) = 0;
  • virtual void setAlgoModelPath(const char* modelPath) = 0;

virtual int initCVResource(const char* license_file_path, const char* algo_model_dir) = 0;

统一返回值

virtual int enableEffect(bool enabled) = 0;

  • virtual int enableVideoEffect() = 0;
  • virtual int disableVideoEffect() = 0;
virtual int updateNode(const char* nodePath, const char* nodeKey, float nodeValue) = 0;virtual int updateEffectNode(const char* effectNodePath, const char* nodeKey, float nodeValue) = 0;
屏幕分享virtual bool pushScreenFrame(IVideoFrame* frame)virtual int pushScreenVideoFrame(IVideoFrame* frame)
参数变更消息virtual int sendSEIMessage(StreamIndex stream_index, const uint8_t* message, int length, int repeat_count) = 0;virtual int sendSEIMessage(StreamIndex stream_index, const uint8_t* message, int length, int repeat_count, SEICountPerFrame mode) = 0;支持 SEI 多发模式,即在 1 帧间隔内多次发送 SEI 数据时,多个 SEI 随下个视频帧同时发送。

多个模块

返回值类型变化,例如:

  • 旧方法——virtual void updateToken(const char* token) = 0;
  • 新方法——virtual int updateToken(const char* token) = 0;

该版本中含此变更的方法包括:

updateToken (返回值 void—>int)

setRemoteVideoConfig (返回值 void—>int)

subscribeStream (返回值 void—>int)

unsubscribeStream (返回值 void—>int)

subscribeScreen (返回值 void—>int)

unsubscribeScreen (返回值 void—>int)

pushExternalAudioFrame (返回值 bool—>int)

pullExternalAudioFrame (返回值 bool—>int)

pushExternalVideoFrame (返回值 bool—>int)

setRemoteAudioPlaybackVolume (返回值 void—>int)

pushExternalEncodedVideoFrame (返回值 bool—>int)

setPublicStreamVideoSink (返回值 void—>int)

enableSimulcastMode (返回值 int—>void)

setPublishFallbackOption (返回值 int—>void)

setSubscribeFallbackOption (返回值 int—>void)

名称变更视频管理setRemoteStreamVideoCanvassetRemoteVideoCanvas
CDN 推流onStreamMixingVideoFrameonMixingVideoFrame
onStreamMixingAudioFrameonMixingAudioFrame
onStreamMixingDataFrameonMixingDataFrame

回调变更

变更详情功能模块变动前方法变动后方法备注
参数变更消息virtual void onPublicStreamSEIMessageReceived(const char* public_stream_id, const uint8_t* message, int message_length) { (void)public_stream_id; (void)message; (void)message_length; }virtual void onPublicStreamSEIMessageReceived(const char* public_stream_id, const uint8_t* message, int message_length, SEIMessageSourceType source_type) { (void)public_stream_id; (void)message; (void)message_length; (void)source_type; }

类型变更

变更详情数据类型备注
取值范围拓展TranscoderLayoutRegion中,width 和 height取值范围由 (0.0, 1.0] 拓展为 [0.0, 1.0]。
枚举值增删UserMessageSendResult新增枚举值:kUserMessageSendResultExceedQPS = 5
RoomMessageSendResult新增枚举值:kRoomMessageSendResultExceedQPS = 5
AudioProcessorMethod新增枚举值:kAudioFrameProcessorEarMonitor = 3
成员变量变更FaceDetectResult新增成员变量:frame_timestamp_us
ContentHint废弃屏幕共享内部采集的变量content_hint。可通过 VideoEncodePreference设置视频流编码偏好,通过ScreenVideoEncodePreference设置屏幕流编码偏好。
AudioDeviceInfo增加成员变量 device_short_name[MAX_DEVICE_ID_LENGTH]
ITranscoderParam新增成员变量:TranscoderClientMixParam
变量类型变更空间音频功能中表示空间坐标的 position 的 变量 x, y, z 类型由 int 更改为 float。提升球面立体声渲染效果。

枚举值名称变更

VideoSourceType

枚举值名称增加前缀 k,更改后的枚举值如下:

enum VideoSourceType {

kVideoSourceTypeExternal = 0,

kVideoSourceTypeInternal = 1,

kVideoSourceTypeEncodedWithAutoSimulcast = 2,

kVideoSourceTypeEncodedWithoutAutoSimulcast = 3,

};

配置变更RoomProfileType房间属性的默认值 kRoomProfileTypeCommunication = 0,对应的由 kRoomProfileTypeChatRoom = 6 变更为 kRoomProfileTypeMeeting = 16。
新增PublicStreamErrorCodeonPlayPublicStreamResult 和 onPushPublicStreamResult 中的 errorCode 参数类型由 int 改为 PublicStreamErrorCode

错误码变更

变更详情错误码备注
枚举值增删ErrorCode新增枚举值:kErrorCodeUserIDDifferent = -1014

3.45.2

方法变更

以下表格中的方法发生了变化。你需要在工程文件中找到该方法,并进行相关修改:

变更详情功能模块方法备注

参数数据结构改动

音频管理

virtual void enableAudioPropertiesReport(const AudioPropertiesConfig& config) = 0;

数据结构中,新增参数:

AudioPropertiesMode

AudioReportMode

3.45.1

方法变更

以下表格中的方法发生了变化。你需要在工程文件中找到该方法,并进行相关修改:

变更详情功能模块变动前方法变动后方法备注
废弃原方法音频处理virtual void muteAudioPlayback(MuteState mute_state) = 0;virtual void setPlaybackVolume(const int volume) = 0;设置远端用户音量为 0 即可停止播放本地收到的音频流
最近更新时间:2026.09.28 10:19:27
这个页面对您有帮助吗?
有用
有用
无用
无用