一、项目概述
悦居智能科技自主研发的TV MediaPlayer是一款面向 Android TV 设备的全屏循环媒体播放器,专为商业展示、数字标牌、企业宣传等场景设计。系统采用双通道管理架构:局域网内嵌 HTTP 服务(端口 9999)提供高速本地管理,云端 WebSocket 中继实现远程设备控制与媒体分发,两者互为保底,确保设备在任何网络条件下均可正常工作。
客户端基于 Kotlin + ExoPlayer Media3 开发,支持视频(MP4/MKV/AVI/MOV/WebM)、图片(JPG/PNG/GIF/WebP)、幻灯片(PPT 自动转 PNG 序列)三种媒体格式循环播放。服务端以 Node.js + WebSocket 构建云中继服务,部署于华为云 ECS,通过 Nginx 反向代理提供统一入口,搭配 PM2 进程守护保障 7×24 小时稳定运行。
二、系统整体架构
系统由三大模块组成:Android TV 客户端(App)、云中继服务器(Cloud Relay)、管理员浏览器端(Dashboard)。TV 设备通过 WebSocket 长连接实时上报状态并接收远程控制指令;管理员通过浏览器面板统一管理所有在线设备;局域网内则通过 TV 内嵌 HTTP 服务直接管理,无需依赖互联网。
☁️ Internet
│
┌────────────────┼────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 📺 TV-136 │ │ 📺 TV-137 │ │ 📺 TV-138 │
│ Android │ │ Android │ │ Android │
│ WS 双向 │ │ WS 双向 │ │ WS 双向 │
│ LAN:9999 │ │ LAN:9999 │ │ LAN:9999 │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└───────────────┼───────────────┘
│ WebSocket (双向, Auth: ANDROID_ID)
▼
┌───────────────────────────────────┐
│ 🌐 Cloud Relay Server │
│ api.youth-community.com │
│ 140.143.122.42 │
│ ┌─ WebSocket Hub (内 :4000) │
│ ├─ HTTP API (Nginx → :4000) │
│ ├─ File Storage (files/) │
│ ├─ LibreOffice PPT → PNG 转换 │
│ └─ PM2: tv-relay │
└──────────┬────────────────────────┘
│ HTTP/HTTPS (Nginx :80)
▼
┌───────────────────────────────────┐
│ 🖥️ Admin Browser │
│ api.youth-community.com/tv/ │
└───────────────────────────────────┘
══════════════ 局域网保底方案 ══════════════
🖥️ 浏览器 ──HTTP :9999──▶ 📺 TV 内嵌 MediaServer
架构亮点:即使互联网断开,管理员仍可在局域网内通过浏览器访问 TV 设备的 9999 端口完成所有管理操作,实现零依赖外网的本地自治能力。
三、核心组件详解
1. PlaybackEngine(播放引擎)
媒体播放调度核心,统一管理视频、图片、幻灯片三种媒体类型的切换逻辑。视频播放基于 ExoPlayer Media3 1.4.1,使用 TextureView 渲染,无控制器 UI 干扰;图片展示基于 Glide 4.16.0,定时器自动切换;幻灯片支持 PPT/PPTX 经 LibreOffice 转换后的 PNG 序列逐张播放。播放结束自动前进到下一个媒体项。
2. PlaylistManager(播放列表管理器)
负责扫描 filesDir/media/ 目录,自动识别视频(MP4/MKV/AVI/MOV/WebM/TS/M2TS)、图片(JPG/PNG/GIF/BMP/WebP)、幻灯片(slide_*.png 子目录)。支持三种播放模式:顺序播放、随机播放、单曲循环。图片默认展示时长为 300 秒(5 分钟),可远程配置。
3. MediaServer(内嵌 HTTP 服务)
基于纯 java.net.ServerSocket 实现,零外部依赖,约 727 行代码完成完整的 Web 管理功能。端口 9999,512KB 接收 / 256KB 发送缓冲区,TCP_NODELAY 优化。支持文件上传(流式 Multipart)、删除、播放控制、设置配置、全选管理、临时文件清理等完整 REST API。
4. CloudRelayClient(云端中继客户端)
基于 OkHttp 4.12.0 WebSocket 连接到云端中继服务器。使用 Android ANDROID_ID 作为设备唯一标识进行认证。每 10 秒上报设备状态(存储使用率、内存、当前播放状态、播放列表)。采用指数退避重连策略(5s → 10s → 20s → 40s → 80s → 120s),最多重试 5 次,确保设备始终在线。
5. Cloud Relay Server(云中继服务器)
Node.js + ws 库实现的 WebSocket Hub,部署于华为云 ECS(140.143.122.42),PM2 进程守护。负责设备连接管理、心跳监控、指令转发、文件存储与中转。集成 LibreOffice --headless 实现 PPT/PPTX 到 PNG 序列的自动转换,支持 6 种演示文稿格式。30 秒超时检测设备离线状态。
四、技术栈总览
| 层级 | 技术 | 版本 | 用途 |
|---|---|---|---|
| TV App | Kotlin | 1.9.24 | Android 原生开发语言 |
| ExoPlayer Media3 | 1.4.1 | 视频解码播放 | |
| Glide | 4.16.0 | 图片加载与缓存 | |
| OkHttp | 4.12.0 | WebSocket + HTTP 文件下载 | |
| Coroutines | 1.7.3 | 异步任务调度 | |
| Cloud | Node.js + ws | ^8.16.0 | WebSocket 中继服务器 |
| LibreOffice | — | PPT → PNG 幻灯片转换 | |
| Infra | Nginx + PM2 | — | 反向代理 + 进程守护 |
五、核心数据流
📤 局域网文件上传
☁️ 云端远程上传
📊 设备心跳上报(每 10 秒)
CloudRelayClient 定时通过 WebSocket 发送 heartbeat 消息,包含设备存储使用率、内存状态、当前播放项、播放列表长度。服务端更新内存状态并持久化到 devices.json,Dashboard 每 3 秒轮询一次展示最新数据。
🎮 云端远程控制
管理员在 Dashboard 点击播放/暂停/下一首等按钮 → POST /api/command → WebSocket 推送到目标 TV 设备 → CloudRelayClient 解析指令 → MainActivity 执行操作。支持的控制指令:play / pause / next / prev / stop / refresh / upload。
六、API 端点清单
TV 内嵌 MediaServer(局域网端口 9999)
| 方法 | 路径 | 功能 |
|---|---|---|
| GET | / | Web 管理页面 |
| GET | /api/files | 获取媒体文件列表 |
| POST | /api/upload | Multipart 文件上传 |
| DEL | /api/delete | 删除指定文件 |
| POST | /api/config | 图片展示时长配置 |
Cloud Relay 服务端(Nginx → :4000)
| 方法 | 路径 | 功能 |
|---|---|---|
| GET | /tv-relay/api/devices | 获取所有设备状态 |
| POST | /tv-relay/api/command | 发送控制指令到设备 |
| WS | /tv-relay/ws | WebSocket 设备连接 |
七、部署配置
📱 TV App 安装:目标设备 TCL MT5879 CN(Android 11, 1920×1080),通过 ADB 或 U 盘安装 APK(app/build/outputs/apk/debug/app-debug.apk)。支持 BOOT_COMPLETED 广播自动启动,设备通电即进入播放状态。
🖥️ 服务端部署:华为云轻量应用服务器(140.143.122.42),PM2 进程管理(pm2 start server.js --name tv-relay),Nginx 反向代理 /tv-relay/ → localhost:4000,静态面板部署于 /var/www/tv-relay/dashboard.html。管理入口:api.youth-community.com/tv/
八、架构设计要点
- 🔄 双通道管理:局域网直连(高速,~2 MB/s)与云端中继(远程控制)并存。互联网断开时局域网仍可独立工作,零依赖外网。
- 🔌 零依赖 HTTP Server:纯 java.net.ServerSocket 实现,约 727 行代码完成完整 Web 管理功能。无第三方 HTTP 库依赖,极致轻量。
- 📺 TV + Phone 双适配:同时支持 D-Pad 遥控器导航和触摸屏操作,LEANBACK_LAUNCHER + LAUNCHER 双入口。
- 🖼️ 多格式幻灯片:服务端 LibreOffice 自动将 PPT/PPTX 转为 PNG 序列,逐张流式下发到 TV,支持 6 种演示文稿格式。
- 🔐 设备认证:Android ANDROID_ID 作为设备唯一标识,WebSocket 连接时自动注册认证,无需额外配置。
- 🪫 断线容错:WebSocket 指数退避重连(5s → 120s),最多 5 次尝试。开机自动启动(BootReceiver),确保设备始终在线。
📢 原创声明
本文为北京悦居智能科技中心原创技术文章,版权归本公司所有。
未经书面授权,禁止任何形式的转载、转发、摘编或复制。
如需授权合作,请联系:halley62373@126.com