【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配置持久化八、用户界面源码链接

相关新闻

用云手机做账号矩阵,平台合规风险到底怎么管?

用云手机做账号矩阵,平台合规风险到底怎么管?

越来越多企业用云手机跑账号矩阵,但随之而来的问题也越来越真实:账号被关联封禁、设备指纹被平台识别、批量操作触发风控、数据合规出现漏洞。这些风险不是云手机本身带来的,而是"用了云手机、但没有用对"的结果。本文从平台合规风…

2026/10/16 19:51:01 阅读更多 →
AI从黑客变成了保安——AI开始“分专业“了

AI从黑客变成了保安——AI开始“分专业“了

作者:梅雅达编程笔记 专栏:AI Agent 实战 关键词:AI Agent、网络安全、GPT-5.6-Cyber、Daybreak、垂直化 前几天聊了 Astra 触发关键安全阈值的事(没看的可以先去翻翻上一篇),今天 OpenAI 又扔了个重磅消息…

2026/10/15 17:13:26 阅读更多 →
内部办公Agent节省HR部门30%工时,从需求到上线的完整路径

内部办公Agent节省HR部门30%工时,从需求到上线的完整路径

摘要:本文基于奇点智能技术大会"大模型技术:从Agentic Scaling到自进化"主题,以HR部门落地内部办公Agent为实例,完整拆解从需求分析到上线的实践路径。重点呈现混合决策型Agent架构设计——BERT意图分类预判结合动态工具…

2026/10/12 17:34:23 阅读更多 →

最新新闻

基于YOLO与ByteTrack的车辆识别计数系统实战:从检测到统计的完整落地

基于YOLO与ByteTrack的车辆识别计数系统实战:从检测到统计的完整落地

我在一个车流统计的测试现场遇到过很有意思的情况:模型跑出来的mAP50有0.87,检测框画得也确实准,但路口统计到的车流量和人工数出来的差了将近两成。问题不在“识别”上,而在“计数”上。这也是我想写这篇文章的原因——基于YOLO系…

2026/10/17 11:02:14 阅读更多 →
智能体辅助会议纪要高效生成:从录音到成稿的完整工作流指南

智能体辅助会议纪要高效生成:从录音到成稿的完整工作流指南

1. 智能体整理会议纪要:先想清楚它到底帮你扛下多少活 这段时间“智能体”这个词在办公圈刷屏的频率有点高,很多行政岗位的同事跑来问我:这东西真能帮我写会议纪要吗?我的回答是:能,但你先得搞清楚它擅长什…

2026/10/17 11:02:14 阅读更多 →
DCPcrypt2加密控件实战:Delphi老项目AES与SHA256避坑指南

DCPcrypt2加密控件实战:Delphi老项目AES与SHA256避坑指南

简介:DCPcrypt v2.0 是一套面向 Delphi 开发者的开源加密算法控件集合,由 David Barton 编写并采用 MIT 许可发布,适合需要在 Pascal 项目中集成密码学能力的初中级工程师与安全方向学习者。它把多种对称加密、分组密码与哈希算法封装成可直接…

2026/10/17 11:02:14 阅读更多 →
Android原生仿微信UI设计:Fragment+RecyclerView实现多页面交互

Android原生仿微信UI设计:Fragment+RecyclerView实现多页面交互

简介:面向Android初学者的仿微信界面实战资源,基于Android Studio从零搭建聊天列表、底部导航栏、个人信息页等核心模块。内容涵盖项目创建与SDK配置、ConstraintLayout/LinearLayout布局设计、Material Design组件运用、自定义聊天气泡视图、RecyclerVi…

2026/10/17 11:02:14 阅读更多 →
遗传算法优化LSTM:Python超参数自动调优与时间序列预测实战

遗传算法优化LSTM:Python超参数自动调优与时间序列预测实战

简介:这是一套面向时间序列预测与深度学习调参场景的 GA-LSTM 实现,将遗传算法的全局寻优能力与长短时记忆网络的序列建模能力结合,用进化搜索替代人工试错,适合已有 Python 和循环神经网络基础、希望优化预测模型参数的开发者参考…

2026/10/17 11:02:14 阅读更多 →
Paperclip多智能体协作实践:从角色编排到任务调度全解析

Paperclip多智能体协作实践:从角色编排到任务调度全解析

Paperclip这个项目名字取得很妙,像回形针把一叠纸质文档别在一起——它要做的事情,正是把多个AI智能体像公司员工一样组织起来、协同运转。我花了大半个月时间从零折腾这套机制,从搭骨架到在真实任务上跑通,最大的感受是&#xff…

2026/10/17 11:01:14 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →