在小程序与 Android 设备的 P2P 音视频通话场景中,多路来电冲突、异常误挂断、通话状态错乱、资源释放不完全、串线 Crash 是最常见、最难定位的线上问题。
本文所解析的 BaseTweCallManager 是整套音视频通话的顶层调度核心,承担 SDK 初始化、信令分发、媒体流启停、相机 / 音频 / 播放器管控、通话状态机、多访客隔离、资源回收等全部核心能力。
该代码经过多次线上问题迭代优化,重点解决了多路呼叫并发冲突、非活跃访客误挂断、音频链路不同步、底层 HAL 释放时序问题,是一套工业级稳定的 Android 跨端 P2P 通话管理层方案。本文将从整体架构、初始化流程、信令交互、媒体流调度、多路来电隔离机制、资源安全释放、疑难问题修复点全方位拆解。
一、整体架构
该类是整个音视频通话的中枢调度器,承担五大核心职责:
- SDK 全链路初始化(sys/dm/avt 三层原生 SDK 初始化)
- 信令解析与分发(接听、挂断、取消、超时、设备状态上报)
- 媒体流调度(音频 / 视频流接收、解码、播放)
- 硬件管理层(相机、麦克风、扬声器、录音、预览)
- 稳定性容错层(多访客隔离、防串线、防误挂断、资源时序修复)
核心架构设计:
- 单协程作用域统一管理通话生命周期
- 双监听体系:小程序通话监听 + 设备通话监听
- 活跃访客隔离机制:解决多路呼叫并发冲突
- 状态机驱动:杜绝无序启停
- 分层资源释放:解决底层 Native HAL 卡顿、残留、崩溃
二、代码模块
1. 核心成员变量设计思路
代码中所有变量都是为解决线上稳定性问题迭代后的结果:
activeVisitor / rejectedVisitors:核心亮点,多路来电隔离,只允许当前一个有效通话,其他来电直接静默拒绝isReleasing / isHangUpPosted:防重入、防多次挂断- 双线程安全锁:
lock画面渲染锁、visitorLock访客隔离锁 - 独立协程域:统一销毁,杜绝内存泄漏
- 多层状态变量:区分等待、接听、挂断、音频 / 视频通话状态
2. 初始化流程 initTweCall(核心启动链路)
流程顺序严格且分层:
- 初始化播放器、屏幕、音频、扬声器管理器
- 初始化 Native 底层系统服务 sys
- 初始化设备管理 dm
- 初始化音视频传输 avt(带拥塞控制水位)
- 注册全局 AvtListener 监听所有媒体回调
重点优化点:
- 加入网络上下线监听,离线自动全部释放底层 SDK
- 初始化失败直接标记状态,避免后续无效调用
- 拥塞控制配置高低水位,解决弱网卡顿、丢包
3. 核心监听 AvtListener 全流程解析(重点)
这是整个通话最核心、最容易出 Bug的地方,所有音视频流、信令、状态都在这里回调。
3.1 访客拦截机制(重大优化)
所有回调第一行先判断:
- 是否被拒绝访客
- 是否非当前活跃访客
彻底解决:多设备同时呼叫导致串线、误抢占、乱挂断问题
3.2 媒体链路启动
onStartRealPlay:启动相机录制onStartRecvAudioStream:音频链路建立、扬声器开启、AudioSession 互通(解决声音异常关键修复)onStartRecvVideoStream:视频宽高帧率回调、启动视频检测、准备渲染画面
3.3 流数据回调 onRecvStream
统一分发音频 / 视频裸流,交给播放器解码渲染, 非活跃访客直接丢弃数据,防止无效帧堆积、CPU 飙升
3.4 停止链路防误挂断(重点 Bug 修复)
源码做了关键逻辑: 非活跃访客停止流 → 只清理自己资源,绝不挂断当前通话 彻底解决行业通病:
新呼叫进来、立刻取消,导致正在通话的正常通话被挂断
4. 信令指令解析 onRecvCommand
处理小程序下发所有指令:
- 音频呼叫发起
- 视频呼叫发起
- 取消呼叫
- 挂断呼叫
- 呼叫超时
- 设备状态查询
核心优化: 通话中拦截新来电,直接加入拒绝列表,不弹窗、不抢占
5. 资源释放 resetInitParam(工业级时序)
解决 Native Crash 根源:
释放顺序严格固定:
- 标记正在释放,拦截所有新任务
- 停止相机录制 & 静音
- 关闭相机预览
- 停止播放器(释放 MediaCodec、AudioTrack)
- 延时 300ms(适配海思 HAL 底层异步释放)
- 关闭协程任务
- 清空所有状态变量
- 释放 SurfaceTexture
解决 90% 的底层释放时序错乱、Native 崩溃、卡死问题
6. 设备能力封装
统一封装:
- 扬声器开关
- 麦克风开关
- 相机开关 / 切换 / 镜像
- 等待铃声播放
业务层无需关心底层状态,统一收口管理。
五、技术亮点
- 独创多路访客隔离机制 单设备只允许一路有效通话,并发来电自动静默拒绝,彻底杜绝串线、抢占、误挂断。
- 精准通话状态机管控 区分空闲、等待、音频接通、视频接通、挂断状态,所有信令严格依赖状态执行。
- 底层 SDK 分层初始化 & 容错 sys/dm/avt 三层独立初始化校验,任一失败立即终止流程。
- 媒体资源释放时序优化 针对嵌入式设备 HAL 异步释放特性,增加延时保序,彻底解决原生崩溃。
- 防重入、防并发、防多次挂断 通过标记位 + 锁 + 集合拦截三重保证线程安全。
- 音频 Session 互通适配 解决录音、发声链路冲突、声音忽大忽小、无声问题。