【视频投屏】最小可用(MVP)局域网投屏”开源项目架构

一、MVP 的功能边界(先定清楚)

本项目 要做

  • 局域网自动发现电视

  • 两种投屏模式:

    1. 媒体投送(视频/音频)
    2. 屏幕镜像(实时)
  • 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"并不复杂

难点不是技术,而是 克制功能、明确边界、先做调度再做投屏


相关推荐
ting94520001 小时前
Dograh 深度技术解析:开源自托管语音智能体平台架构、流水线与工程实践
人工智能·架构
阿里云云原生2 小时前
阿里云亮相开源 AI 三大顶会!我们上海见
开源
Htr_2 小时前
Dif.Sh 使用指南:以 Markdown 文件为载体的开源特性开关
开源
hhzz2 小时前
【OpenCV 入门到精通 01】认识 OpenCV 与计算机视觉:从零建立全局认知
人工智能·python·opencv·计算机视觉·开源
m4Rk_2 小时前
【论文阅读】Agent 记忆机制(62):DCM-Agent——用双簇记忆化解优化问题的多范式冲突
论文阅读·人工智能·学习·开源·github
行百里er3 小时前
HandlerInterceptor 和 WebFilter:两套 HTTP 请求拦截
后端·架构·监控
广州硅基技术官方4 小时前
AIGK外贸工厂社媒引流实战教程:海外自媒体短视频AI矩阵获客玩法解析
人工智能·音视频·媒体
努力进修4 小时前
兼顾吞吐与一致性:KFS 并行解析‑多通道入库同步架构解析
架构
R²AIN SUITE5 小时前
2026企业级AI Agent开发平台怎么选?RAG知识库到工作流编排的四层架构拆解
人工智能·架构
风123456789~5 小时前
【架构专栏】第6章 数据库设计基础知识 1/4
数据库·架构