[12] - 2026.10.13
版本号:0.2.1-alpha.14 添加- 新增 C# 封装
srtcNet:Srtc命名空间的 C++/CLI 混合程序集srtcNet.dll,把 srtc 的 C++ 接口(引擎、频道、频道设置、轨道、视图、录制、设备枚举、IM)完整暴露为惯用的 C#class/event/IDisposable,回调无需手写 vtable - 交付包内新增
rtc_dll/net/srtcNet.dll(x86、x64 各一份,位数与包内原生 DLL 一致),与rtc_dll/bin/下的原生依赖配套使用
- 修复设备名乱码:设备枚举(
getEnumVideo/getEnumScreen/getEnumAudio/getEnumSpeaker) 写进 JSON 的设备名由 ANSI 改为 UTF-8;新增StringUtil::AnsiToUTF8/UTF8ToAnsi(基于MultiByteToWideChar/WideCharToMultiByte,不依赖 setlocale) srtc.h若干形参改名(message_size→messageSize、track_key→trackKey、key→channelId等), 包含onJoinChannel等回调的形参 —— 仅改名,签名与语义不变
srtc.h 本次只有形参改名,纯虚接口(IRTCEngine / IRTCEngineEvent /
IRTCChannel / IRTCChannelEvent 等)的 vtable 未变,srtc.lib 的导出符号也未变,
只替换 dll 不需要重新编译。新增的 srtcNet 是独立程序集,不影响现有 C++ 使用方。
已知限制
srtcNet需要 .NET Framework 4.7.2 及以上,且位数必须与原生包一致(x86 程序配 x86 包), 否则运行期抛BadImageFormatException- 设备名对外统一为 UTF-8:若使用方此前按 ANSI 解析设备枚举 JSON 里的
name字段,需改为 UTF-8
[11] - 2026.10.08
版本号:0.2.1-alpha.13 添加srtc_def.h的StatusCode新增UserCancelled = 100013(操作被取消)- 内部模块
srtc/SRTCStatus.h新增from_rtc():把底层 RTC 库的错误码映射为 srtc 自己的错误码 RTCEngine_GetStatusMsg()补齐OK、SyncDeal、UserCancelled、MoudelNotSupport、BeforeSetting、NotFindStreamTrack、ExceedingSpecifiedQuantity的中英文案(此前落到 “not msg”)
- srtc 公开接口(
join、getMember、getMemberByLinkId、update_self_stream_info、Decrypt、init、enableIm等)返回的底层 RTC 错误码改经from_rtc()映射;onDisconnected/onImDisconnected回调上报的错误码同样先映射再交给上层 - 映射覆盖底层 RTC 的
OK、SdkTokenInvalid、Conflict、NetError、Timeout、ProtocolParsingError、MediaNetError、NotInitialized、SystemError、UserCancelled、InvalidArgs、NotFound;没有对应项的码(含后端直接透传的>= 1000业务码)保持原值
- 修复错误码「串号」:底层 RTC 用的是紧凑错误码(
4/5/6/24/26…),而 srtc 对外暴露的是100001+表。此前公开接口直接把 RTC 码强转成StatusCode返回,数值对不上,RTCEngine_GetStatusMsg()与RTCEngine_GetLastErrorMessage()拿到后落到兜底文案 (形如!!!!!!!!!!code:6!!!!!!!!! not msg)。现在返回的是 srtc 自己的错误码
srtc_def.h仅新增枚举值UserCancelled = 100013,既有值不变;srtc.h未改动,IRTCEngine/IRTCEngineEvent的 vtable 未变,只替换 dll 不需要重新编译- 但错误码数值语义有变化:同一失败场景下公开接口返回的
StatusCode数值会与旧版不同 (旧版是底层 RTC 的紧凑码,新版是 srtc 的100001+码)。使用方若直接按数字比较错误码, 请改用StatusCode枚举名判断,并同步更新srtc_def.h
- 底层 RTC 的
UserCancelled映射到 srtc 的100013,与其它端UserCancelled = 100012的编号不同, 跨端对齐错误码时需注意;SyncDeal在 srtc 里仍占100012 - 没有 srtc 对应项的底层码原样返回,可能落在 srtc 错误码表的空隙里,
RTCEngine_GetStatusMsg()对这类码仍返回兜底文案
[10] - 2026.10.08
版本号:0.2.1-alpha.12 添加- 新增
RTCEngine_SetLanguage(const char* lang):设置 SDK 语言(BCP 47,如zh-CN、en)。 srtc 自己的错误文案按它切换,并转发给底层RTC_SetLanguage(后续后端请求会带Accept-Language)。 进程级、随时可调;不调用或传nullptr/ 非zh*时为英文 - 新增
RTCEngine_GetLastErrorMessage(char* msg):把上一次 srtc 接口返回的错误码对应的文案写入调用方缓冲区 (UTF-8,语言同上)。该错误码由 srtc 自己维护、不取自底层库,在任一接口返回非OK时更新, 建议在同步调用失败后立即读取;无错误时为空 - 新增内部模块
srtc/SRTCStatus.h:进程级记录最后一次错误码,并提供按当前语言取文案的status_msg()
RTCEngine_GetStatusMsg()的文案改为中英双语,且默认英文(旧版本固定返回中文)—— 这是本次唯一的行为变化- srtc 所有公开接口的返回值统一经内部
pass()写出,供RTCEngine_GetLastErrorMessage()读取;返回值本身不变
srtc.h 只新增两个导出函数(RTCEngine_SetLanguage、RTCEngine_GetLastErrorMessage),
IRTCEngine / IRTCEngineEvent 等纯虚接口的 vtable 未变,srtc_def.h 也未改。
只替换 dll 不需要重编;但要用这两个新函数,需要同时更新 srtc.h 与 srtc.lib。
已知限制
RTCEngine_GetStatusMsg()在 0.2.1-alpha.12 之前固定返回中文。升级后若未先调用RTCEngine_SetLanguage("zh-CN"),它返回的是英文 —— 依赖中文文案做展示的调用方请注意。RTCEngine_GetLastErrorMessage()读的是进程内最后一次错误码,多线程下可能被其它线程的调用覆盖, 应在关心的调用返回后就近读取。
[9] - 2026.09.29
版本号:0.2.1-alpha.11 添加- 新增 D3D11 视频渲染:
srtcLive增加D3D11VideoRender及底层 D3D11 渲染模块 (设备与交换链、YUV 纹理、着色器、全屏四边形、文字与水印叠加等) utils新增D3d11Support()探测;视频渲染创建时在支持 D3D11 的机器上优先使用 D3D11 (SRTC_RENDER_MODEL_VIDEO_D3D11),不支持时回退到原有的 D3D 渲染
srtc/srtcLive工程补充 d3d11 等相关依赖库,并启用 C++17 标准RenderModel新增SRTC_RENDER_MODEL_VIDEO_D3D11(编译宏SRTC_USEING_LIB_D3D控制)
srtc.h / srtc_def.h 本次没有任何改动,vtable 未变,只替换 dll 即可,不需要重新编译。
[8] - 2026.09.24
版本号:0.2.1-alpha.10 添加-
新增 x64(64 位)包,交付改为 x86 + x64 双包:
rtc-win-sdk-2.1.zip(x86,32 位)—— 包名与之前完全一致rtc-win-sdk-x64-2.1.zip(x64,64 位)—— 新增,包名是在版本号前面多一段-x64
rtc_dll/),但srtc.dll、srtcLive.dll、srtc.lib的位数不同,不能混用、也不要解压到同一个目录,请按工程的目标平台选对应的包。 下载地址见集成。 -
依赖库按架构拆分为
lib/<库>/lib/win32与lib/<库>/lib/win64两套
srtcLive的 x64 工程配置修正:输出类型从Application改为DynamicLibrary, 补上 x64 自己的包含目录与库目录(指向lib/*/lib/win64),产物输出到Release_x64- 升级第三方依赖:libfaac 换用新版编码器接口(
faac_encoder_open/faac_encoder_get_info/faac_encoder_encode)、libswresample 换用swr_alloc_set_opts2、openh264 头文件路径由wels/改为svc/; 移除已不再使用的 x264、webrtc_aec3、rtpsdk、pthread 依赖 utils::getPathFile改用std::filesystem枚举目录- 日志流
SDebug的operator<<(size_t)改为operator<<(unsigned int): 64 位下size_t就是unsigned __int64,会与uint64_t重载冲突, 改后 32 位无符号值命中本重载、64 位值命中uint64_t,两种架构行为一致 - custom/rtp 流相关代码加
RTC_ENABLE_RTP_STREAM编译开关
- 修复 64 位编译报错:虚拟机探测
IsInsideVPC/IsInsideVMWare依赖 x86 内联汇编和 x86 专有的CONTEXT字段(Ebx/Eip),MSVC 的 x64 不支持内联汇编 —— 64 位构建下这两个探测直接返回 false FAACEncode:关闭句柄改用faac_encoder_close(&hEncoder);编码改为按返回的状态码 与写出的字节数判断,避免新版接口返回值语义变化导致的误判
srtc.h / srtc_def.h 本次没有任何改动,vtable 未变,只替换 dll 即可,不需要重新编译。
[7] - 2026.09.22
版本号:0.2.1-alpha.9 修改- webrtc2 重连与线程安全重构:
web_pccontrol2加锁保护peer/_recv/_pc_stat, 统计与订阅状态改为值拷贝快照,跨线程读写的状态(_use/_status等)改为原子变量 - 重连后按订阅快照恢复推流与订阅,并清理收发包统计基线(避免重连后速率/丢包率算出负值)
SetRemoteDescription失败结果上抛,避免握手失败却标记为已连接- 统一源码文件默认编码(修复 UTF-8 中文注释在 GBK 环境下的 C4819 警告与乱码隐患)
- 整理流初始化对象(
SRTCChannel)
- 修复 CreateOffer / CreateAnswer 无限死等 SDP 回调,导致退会时 pubsub 线程与
CloseRoom死锁卡住的问题:改为带超时等待
srtc.h / srtc_def.h 本次没有任何改动,vtable 未变,只替换 dll 即可,不需要重新编译。
[6] - 2026.08.21
版本号:0.2.1-alpha.7 修改join()成功后对opt的解析改为按流媒体类型(stream_vendor)分别处理:link_id、session_key、upload.address、upload.port只在stream_vendor为ook时才要求, 频道信息里的link_id(房间号)同样只在 ook 下才要求- 整理
UploadLog::appendLog2Map的代码缩进(无功能变化)
- 修复使用 webrtc 流媒体(
stream_vendor非ook)时,因opt中没有link_id/session_key而在onJoinSucceed里直接 return、导致进入频道后不建流的问题
srtc.h / srtc_def.h 本次没有任何改动,vtable 未变,只替换 dll 即可,不需要重新编译。
[5] - 2026.08.20
版本号:0.2.1-alpha.6 添加- 新增
IRTCChannel:一个频道一个对象,频道级接口全部挂在它上面 - 新增
IRTCChannelEvent:频道级回调独立成接口,按频道注册 - 新增
IRTCEngine::createChannel(token, IRTCChannel**):只创建频道对象、不进入频道, 这样可以在join()之前设置好配置和事件回调(onJoinChannel在join()返回前就会触发) - 新增
IRTCChannel::join()/getChannelId()/getSetting()/setEventHandler() - 新增
RTCEngineOptions结构体,作为RTCEngine_Init的第二个参数,用于设置日志开关与日志目录
IRTCEngine只保留引擎级能力:创建/退出频道、设备枚举、网络测速、日志上传、IMIRTCEngineEvent只保留引擎级回调:设备变化、网络探测、IMIRTCSetting更名为IRTCChannelSetting,并从引擎移到频道(每个频道一份,den_model/limit_speed的修改会立即下发到本频道)- 流媒体对象(
IStreamBase/StreamControl/WebrtcControl/WebrtcControl2)由进程级单例 改为每个频道各new一份,频道销毁时释放;ook 的any_meeting仍是进程级单例 - 本地录制每个频道只有一个录制对象(key 为 channelId),
getLocalRecord的mid参数仅作接口兼容保留 - 调整文件编码格式
- 修复流媒体对象释放后,ook 回调(渲染、房间事件、音频、自定义帧)仍指向已释放对象的问题:
StreamControl析构时会反注册这些回调 - 修复
OpenRoom中途失败时线程未回收、对象却被销毁的问题:失败路径补上CloseRoom() - 修复
StreamControl线程标志未初始化,导致CloseRoom()在流信息线程从未启动时可能死等 - 修复
web_meeting与web_meeting2各自向共享的 libwebrtc factory 注册 AEC 前后处理、 互相覆盖且泄漏的问题:改由web_base统一持有一份 - 修复
WebrtcControl2的web_meeting2从未释放、WebrtcControl的设备流对象从未释放的泄漏
IRTCEngine / IRTCEngineEvent / IRTCChannel / IRTCChannelEvent / IRTCChannelSetting
都是纯虚接口,本次变更改动了 vtable;RTCEngine_Init 是导出函数,签名也变了。
只替换 dll 不重编会崩溃。
RTCEngine_Init(IRTCEngine** rtc)→RTCEngine_Init(IRTCEngine** rtc, RTCEngineOptions* opt)。opt传nullptr表示不写 SDK 日志IRTCEngine::joinChannel(token, char**, int*)删除,改用createChannel(token, IRTCChannel**)+IRTCChannel::join()IRTCEngine::getSetting()删除,改用IRTCChannel::getSetting()IRTCEngine上 24 个带channelId首参的频道级方法全部删除(未保留兼容转发), 改到IRTCChannel上,签名即去掉channelId:getMe、getChannel、getMembers、getMember、getMemberByLinkId、getLocalRecord、getCameraTrack、getScreenTrack、getAudioTrack、getRemoteAudioTrack、getRemoteVideoTrack、getMCUVideoTrack、getCustomVideoTrack、getCustomAudioTrack、setCustomRecvBack、subscribe、unsubscribe、publish、updatePublish、unpublishgetMCUVideoTrack变为无参IRTCEngineEvent的 21 个频道级回调全部移到IRTCChannelEvent,并且去掉了channelId首参:onJoinChannel、onChannelUpdate、onUserJoin、onUserUpdate、onUserLeave、onUserStreamAdd、onUserStreamUpdate、onUserStreamRemove、onCustomMessage2、onUpLevel、onDownLevel、onUpStat、onDownStat、onFrameTimeOut、onSpeakers、onDeviceStatusChange、onShareTargetNotFind、onDisconnected、onReconnected、onReconnecting、onRecordStatusChangeIRTCSetting→IRTCChannelSetting,并删除sdk_log_path/enable_stream_log(移到RTCEngineOptions)
IRTCChannelSetting里stream_model/simple/mcu_track/enable_audio_record在join()阶段读取,join()之后再改不生效IRTCChannel*在leaveChannel/leaveAllChannel之后即失效,调用方需自行置空; 没有引用计数保护,请勿在其它线程持有并跨leaveChannel使用
[4] - 2026.08.19
版本号:0.2.1-alpha.5 添加- 支持同时加入多个会议(频道),引擎内部按 channelId 管理多个频道
- 新增
leaveAllChannel(),一次退出所有已加入频道 - 新增
getChannelIds(),获取当前已加入的 channelId 列表 - 添加 cmake 编译工程,调整目录结构
- 分离 channel 和 client,每个频道各自持有一份独立的 session / roomno / stream_host / user_id 配置
- 整理共享屏幕声音同步问题;整理录制屏幕画面;整理 updateSenderPublish 同步推送
- 调整消息回调到录制任务
- webrtc 本地录制支持音频数据写文件
- 删除乱码的注释
- 修正录制时的音柱
- 修复 seastart 结束共享 + 声音时的崩溃
IRTCEngine / IRTCEngineEvent 是纯虚接口,本次变更修改了 vtable,只替换 dll 不重编会崩溃。
joinChannel改为joinChannel(const char* token, char** channelId, int* channelIdSize),通过出参返回 channelIdleaveChannel改为leaveChannel(const char* channelId)- 所有频道级接口新增
channelId首参:getMe、getChannel、getMembers、getMember、getMemberByLinkId、getLocalRecord、getCameraTrack、getScreenTrack、getAudioTrack、getRemoteAudioTrack、getRemoteVideoTrack、getMCUVideoTrack、getCustomVideoTrack、getCustomAudioTrack、subscribe、unsubscribe、publish、updatePublish、unpublish - 所有频道级回调新增
channelId首参:onJoinChannel、onCustomMessage2、onUpLevel、onDownLevel、onUpStat、onDownStat、onFrameTimeOut、onSpeakers、onDeviceStatusChange、onShareTargetNotFind、onDisconnected、onReconnecting、onRecordStatusChange onJoinChannel第一个参数改为纯频道 id,原来的频道信息 JSON 顺延到第二个参数onReconnected第一个参数由channel更名为channelId,含义不变- 两个
publish重载去掉默认参数(原先publish(tk)本身是二义调用、无法编译),调用时必须显式传opt - 设备变化(
onDeviceChange、onDefDeviceChange)、网络探测(onProbeResult)、IM 系列回调为引擎级,签名不变 channelId传nullptr或空串时,若只加入了一个频道则自动使用该频道,便于旧代码迁移
[3] - 2026.03.9
添加- 添加本地录制
- 添加cdn-webrtc收流
- 添加自研webrtc收流
- 添加带宽限制
[2] - 2025.01.8
添加- 添加日志到日志系统
- 设置opus默认编码
- 添加获取合成流
- 修改随机数生成
[1] - 2022.05.30
添加- 系统播放采集音量检测
- 合并流媒体成功事件和进入房间事件
- 修改部分函数名称和返回值内容
- 共享屏幕支持对窗口的共享和窗口信息枚举
[0] - 2022.05.15
添加- rtc2.0 初始版本