一、MVP 的功能边界(先定清楚)
本项目 要做
-
局域网自动发现电视
-
两种投屏模式:
- 媒体投送(视频/音频)
- 屏幕镜像(实时)
-
Android 手机 → Android TV
-
UI 简单但可用
本项目 明确不做
- 商业 App(腾讯/爱奇艺等)投屏
- DRM 内容
- 跨网投屏
- 一键"万能投"
二、整体架构图(MVP 级)
┌────────────────────┐
│ Android Phone │
│────────────────────│
│ UI / 投屏入口 │
│ 投屏调度层 │
│ ├─ DLNA Controller │
│ └─ Screen Mirroring│
│ (WebRTC) │
│ │ │
└────────┼───────────┘
│ LAN
┌────────┼───────────┐
│ Android TV │
│────────────────────│
│ 设备发现服务 │
│ DLNA Receiver │
│ WebRTC Receiver │
│ ExoPlayer / Surface│
└────────────────────┘
三、模块拆解(直接按仓库结构设计)
1️⃣ 设备发现模块(必需)
作用
- 手机自动发现 Android TV
- 显示为"可投屏设备"
技术选型(开源)
- SSDP(UPnP)
- mDNS(可选)
MVP 实现
- Android TV 启动 SSDP 服务
- 手机端发送 M-SEARCH
- TV 响应设备信息(JSON)
模块建议
discovery/
├─ SsdpServer.kt (TV)
├─ SsdpClient.kt (Phone)
└─ DeviceInfo.kt
2️⃣ 投屏调度层(整个项目的核心)
核心逻辑(非常重要)
kotlin
when (contentType) {
MEDIA -> useDlna()
SCREEN -> useWebRtc()
}
内容判断策略(MVP)
- 本地视频文件 → MEDIA
- URL 视频 → MEDIA
- 其他 → SCREEN
模块建议
dispatcher/
├─ CastDispatcher.kt
├─ ContentAnalyzer.kt
└─ CastSession.kt
3️⃣ 媒体投送模块(DLNA)
原理
- 手机只发播放命令
- TV 自己拉流播放
开源组件
- 协议:UPnP AV
- 播放器:ExoPlayer
MVP 功能
- Play / Pause
- Seek
- Stop
模块建议
dlna/
├─ DlnaController.kt (Phone)
├─ DlnaReceiver.kt (TV)
├─ AvTransport.kt
└─ ExoPlayerWrapper.kt
4️⃣ 屏幕镜像模块(WebRTC)
原理
- MediaProjection 捕屏
- H.264 硬编码
- WebRTC 点对点传输
开源组件
- libwebrtc
- WebSocket(信令)
MVP 取舍
- 只支持 视频
- 音频可第二阶段再加
模块建议
screen/
├─ ScreenCapturer.kt
├─ WebRtcSender.kt (Phone)
├─ WebRtcReceiver.kt (TV)
├─ SignalingServer.kt
└─ PeerConnection.kt
5️⃣ TV 接收端(Android TV App)
TV 端职责
- 启动发现服务
- 提供 DLNA Receiver
- 接收 WebRTC 流
- 全屏显示
模块建议
tv/
├─ MainActivity.kt
├─ DeviceService.kt
├─ DlnaService.kt
├─ WebRtcService.kt
└─ PlayerView.kt
四、技术选型汇总表(MVP 级)
| 模块 | 技术 | 是否开源 |
|---|---|---|
| 发现 | SSDP | ✅ |
| 媒体投送 | DLNA | ✅ |
| 播放器 | ExoPlayer | ✅ |
| 捕屏 | MediaProjection | ✅ |
| 推流 | WebRTC | ✅ |
| 信令 | WebSocket | ✅ |
五、最小交付能力(你完成后能做到什么)
✔ 手机能看到电视
✔ 点击"投屏"
✔ 视频走 DLNA(流畅、低功耗)
✔ 界面走 WebRTC(实时)
✔ 完全局域网
✔ 完全开源
六、项目仓库结构示例(直接可用)
lan-cast/
├─ phone-app/
│ ├─ discovery/
│ ├─ dispatcher/
│ ├─ dlna/
│ └─ screen/
├─ tv-app/
│ ├─ discovery/
│ ├─ dlna/
│ ├─ webrtc/
│ └─ ui/
├─ common/
│ ├─ protocol/
│ └─ model/
└─ README.md
七、开发顺序建议(非常重要)
第 1 周
- SSDP 发现
- TV 端显示
第 2 周
- DLNA 播放本地视频
第 3 周
- WebRTC 屏幕镜像
第 4 周
- 投屏调度整合
- UI & 稳定性
八、一句话总结
一个可用的"局域网投屏 MVP"并不复杂
难点不是技术,而是 克制功能、明确边界、先做调度再做投屏。