Android 音视频通话核心 —— 通话管理解析

4 阅读5分钟

 在小程序与 Android 设备的 P2P 音视频通话场景中,多路来电冲突、异常误挂断、通话状态错乱、资源释放不完全、串线 Crash 是最常见、最难定位的线上问题。

本文所解析的 BaseTweCallManager整套音视频通话的顶层调度核心,承担 SDK 初始化、信令分发、媒体流启停、相机 / 音频 / 播放器管控、通话状态机、多访客隔离、资源回收等全部核心能力。

该代码经过多次线上问题迭代优化,重点解决了多路呼叫并发冲突、非活跃访客误挂断、音频链路不同步、底层 HAL 释放时序问题,是一套工业级稳定的 Android 跨端 P2P 通话管理层方案。本文将从整体架构、初始化流程、信令交互、媒体流调度、多路来电隔离机制、资源安全释放、疑难问题修复点全方位拆解。

一、整体架构

该类是整个音视频通话的中枢调度器,承担五大核心职责:

  1. SDK 全链路初始化(sys/dm/avt 三层原生 SDK 初始化)
  2. 信令解析与分发(接听、挂断、取消、超时、设备状态上报)
  3. 媒体流调度(音频 / 视频流接收、解码、播放)
  4. 硬件管理层(相机、麦克风、扬声器、录音、预览)
  5. 稳定性容错层(多访客隔离、防串线、防误挂断、资源时序修复)

核心架构设计:

  • 单协程作用域统一管理通话生命周期
  • 双监听体系:小程序通话监听 + 设备通话监听
  • 活跃访客隔离机制:解决多路呼叫并发冲突
  • 状态机驱动:杜绝无序启停
  • 分层资源释放:解决底层 Native HAL 卡顿、残留、崩溃

二、代码模块

1. 核心成员变量设计思路

代码中所有变量都是为解决线上稳定性问题迭代后的结果

  • activeVisitor / rejectedVisitors:核心亮点,多路来电隔离,只允许当前一个有效通话,其他来电直接静默拒绝
  • isReleasing / isHangUpPosted:防重入、防多次挂断
  • 双线程安全锁:lock 画面渲染锁、visitorLock 访客隔离锁
  • 独立协程域:统一销毁,杜绝内存泄漏
  • 多层状态变量:区分等待、接听、挂断、音频 / 视频通话状态

2. 初始化流程 initTweCall(核心启动链路)

流程顺序严格且分层:

  1. 初始化播放器、屏幕、音频、扬声器管理器
  2. 初始化 Native 底层系统服务 sys
  3. 初始化设备管理 dm
  4. 初始化音视频传输 avt(带拥塞控制水位)
  5. 注册全局 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 根源:

释放顺序严格固定:

  1. 标记正在释放,拦截所有新任务
  2. 停止相机录制 & 静音
  3. 关闭相机预览
  4. 停止播放器(释放 MediaCodec、AudioTrack)
  5. 延时 300ms(适配海思 HAL 底层异步释放)
  6. 关闭协程任务
  7. 清空所有状态变量
  8. 释放 SurfaceTexture

解决 90% 的底层释放时序错乱、Native 崩溃、卡死问题

6. 设备能力封装

统一封装:

  • 扬声器开关
  • 麦克风开关
  • 相机开关 / 切换 / 镜像
  • 等待铃声播放

业务层无需关心底层状态,统一收口管理。

五、技术亮点

  1. 独创多路访客隔离机制 单设备只允许一路有效通话,并发来电自动静默拒绝,彻底杜绝串线、抢占、误挂断。
  2. 精准通话状态机管控 区分空闲、等待、音频接通、视频接通、挂断状态,所有信令严格依赖状态执行。
  3. 底层 SDK 分层初始化 & 容错 sys/dm/avt 三层独立初始化校验,任一失败立即终止流程。
  4. 媒体资源释放时序优化 针对嵌入式设备 HAL 异步释放特性,增加延时保序,彻底解决原生崩溃。
  5. 防重入、防并发、防多次挂断 通过标记位 + 锁 + 集合拦截三重保证线程安全。
  6. 音频 Session 互通适配 解决录音、发声链路冲突、声音忽大忽小、无声问题。