【Android视频监控系统技术总结】
Android视频监控系统技术总结一、系统概述这是一款基于 Android 平台的实时视频监控应用采用C/S 架构由两个独立 APK 组成security_camera摄像机端部署在采集设备上负责视频采集、编码、本地存储与网络推流security_monitor监视器端部署在观看设备上负责视频流接收、解码与实时显示系统基于 Android 原生MediaCodec实现硬件编解码通过WebSocket进行实时视频流传输整体延迟低、资源占用少支持 H.264/H.265 两种编码格式自适应。二、整体架构2.1 架构分层系统采用清晰的分层设计从下到上依次为层级摄像机端监视器端职责采集/输出层CameraX ImageAnalysisSurfaceView原始帧采集 / 最终画面渲染编解码层VideoEncoderMediaCodecStreamDecoderMediaCodec视频硬编码 / 硬解码传输层StreamWebSocketServerWebSocket 服务端StreamClientWebSocket 客户端视频帧网络传输业务层StreamManager / MyCameraManagerStreamViewModel生命周期管理、状态协调表现层Jetpack ComposeMainSurface/SettingsSurfaceJetpack ComposeMainScreen用户交互界面2.2 数据流全景摄像机端 CameraX 预览 → ImageAnalysis(YUV_420_888) → 水印叠加WatermarkOverlay → VideoEncoder 硬编码H.264/H.265 ├→ MediaMuxer → MP4 文件本地录像 └→ OnEncodedDataListener → StreamManager → WebSocket Server → 网络 监视器端 网络 → WebSocket ClientOkHttp → StreamClient 协议解析 ├→ 配置消息JSON→ StreamDecoder.configure() └→ 帧数据二进制→ StreamDecoder.feedData() → MediaCodec 解码 → Surface 渲染三、摄像机端核心实现3.1 相机采集CameraX ImageAnalysis相机子系统以MyCameraManager为核心管理器基于 CameraX 库实现预览用例Preview绑定 PreviewView 实现实时取景支持 PERFORMANCE 模式图像分析用例ImageAnalysis以 YUV_420_888 格式输出每一帧供编码和水印处理使用分辨率策略支持 SD640×480、HD1280×720、FHD1920×1080三档通过 ResolutionSelector 配置背压策略采用STRATEGY_KEEP_ONLY_LATEST确保编码线程始终处理最新帧避免帧堆积帧率控制方面低帧率模式下通过时间戳对比主动跳帧确保编码帧率稳定在设定值。3.2 视频编码双输出解耦设计VideoEncoder是编码层的核心其最大特点是编码器核心与输出目标解耦MediaCodec编码器核心 ├→ 输出 1MediaMuxer → MP4 文件本地录像 └→ 输出 2OnEncodedDataListener → 网络流StreamManager关键设计点双路独立启停文件录制和网络流传输可分别启动/停止互不影响。编码器根据输出目标活跃度自动启停——只要有一路输出活跃编码器就保持运行全部停止时编码器自动释放。编码格式自适应初始化时检测设备 HEVC 支持能力优先使用 H.265 编码不支持则回退到 H.264Baseline Profile。动态 Muxer 初始化MediaMuxer 不在编码器创建时初始化而是在开始录制时才创建支持随时启停录像而不中断编码流。输出格式缓存编码器输出格式变化含 SPS/PPS时缓存格式信息后续启动文件输出或新客户端连接时可直接使用。3.3 水印叠加YUV 层面处理WatermarkOverlay在编码前的 YUV 数据上直接叠加时间戳水印工作在 YUV 色彩空间避免 YUV→RGB→YUV 的多次格式转换开销支持动态分辨率适配根据实际帧尺寸更新水印位置叠加操作在 ImageAnalysis 的分析线程中完成与编码流水线串行3.4 网络推流WebSocket 服务端传输层由StreamManager单例和StreamWebSocketServer组成协议设计文本帧JSON传输编码器配置信息包括 mime 类型、分辨率、csd-0/csd-1Base64 编码的 SPS/PPS二进制帧传输实际编码数据帧结构为[1字节帧类型][8字节时间戳(大端)][NAL数据]帧类型定义0x01Config帧、0x02关键帧、0x03P帧关键机制Config 帧缓存服务器缓存编码器的配置帧SPS/PPS新客户端连接时立即推送确保客户端无需等待下一个关键帧即可开始解码。多客户端广播支持多个监视器同时连接观看编码数据通过 WebSocket 广播给所有已连接客户端。前台服务保活VideoStreamService 以前台服务形式运行显示常驻通知防止系统在后台杀死推流进程。3.5 本地录像与存储管理分段录制视频按固定时长分段保存每段结束后自动启动下一段保证长时间连续录制循环覆盖存储空间不足时自动删除最旧的视频文件实现滚动存储文件命名SECURITY_ 时间戳 .mp4按文件名即可判断录制时间3.6 息屏模式系统支持息屏监控模式降低屏幕亮度至最低减少功耗保持 CameraX 和编码器正常运行通过 WakeLock 保持 CPU 唤醒启动前台服务防止进程被杀适用于长时间无人值守监控场景四、监视器端核心实现4.1 流客户端OkHttp WebSocketStreamClient基于 OkHttp 的 WebSocket 实现客户端连接自动心跳配置 pingInterval30秒保持长连接活跃消息分发区分文本消息和二进制消息分别走配置解析和帧数据处理路径连接状态回调通过 onConnectionChanged / onError 回调通知上层连接状态变化4.2 视频解码异步输出轮询StreamDecoder基于 MediaCodec 实现硬件解码采用独立线程轮询输出的模式解码流程收到配置消息 → 创建 MediaFormat设置 csd-0/csd-1→ configure start收到帧数据 → dequeueInputBuffer → 写入数据 → queueInputBuffer独立线程 drainOutputLoop → dequeueOutputBuffer → releaseOutputBuffer(rendertrue) → Surface 渲染关键设计点Surface 延迟就绪处理考虑到 SurfaceView 创建可能晚于配置消息到达解码器缓存所有配置参数mime、宽高、csd-0/1、旋转角度Surface 就绪后自动重新配置解码器。独立解码线程输出缓冲区的读取在独立线程中循环进行不阻塞网络接收线程避免帧延迟累积。旋转角度支持通过 MediaFormat.KEY_ROTATION 设置视频旋转角度适配摄像机端不同的安装方向。4.3 MVVM 架构监视器端采用 Jetpack Compose ViewModel 的 MVVM 架构StreamViewModel管理连接状态、视频参数、帧计数等 UI 状态MainScreenCompose 实现的主界面包含地址输入、连接按钮、视频显示区域状态驱动 UI数据流向清晰五、传输协议详解5.1 握手阶段客户端连接后服务端立即发送两条消息配置 JSON文本帧{type:config,mime:video/avc,width:640,height:480,csd0:J0K0HkCqQ...,// Base64 编码的 SPScsd1:A4A8sA// Base64 编码的 PPS}Codec Config 二进制帧携带完整的 csd-0/csd-1 二进制数据帧类型 0x015.2 数据阶段后续以二进制帧持续发送编码数据偏移长度字段说明01 字节frame_type0x02关键帧0x03P帧18 字节ptspresentationTimeUs大端序高位字节在前9N 字节nal_dataNAL 单元数据六、技术亮点纯硬件编解码全程使用 MediaCodec 硬编硬解CPU 占用低支持高清实时传输编码器双输出解耦一份编码数据同时供给本地录像和网络推流两路独立启停Config 帧缓存机制新客户端秒开无需等待下一个关键帧Surface 就绪适配优雅处理 Surface 晚于配置到达的时序问题低延迟设计ImageAnalysis 直连编码器WebSocket 二进制帧传输解码线程独立轮询后台保活方案前台服务 WakeLock 双重保障息屏模式下持续运行H.265 自适应根据设备能力自动选择最优编码格式七、模块依赖依赖库用途CameraX相机预览与帧采集Android MediaCodec硬件编解码Java-WebSocketorg.java-websocketWebSocket 服务端OkHttpWebSocket 客户端Jetpack ComposeUI 界面AndroidX Lifecycle / ViewModel生命周期与状态管理SharedPreferences配置持久化八、用户界面源码链接