【视频投屏】最小可用(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"并不复杂

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


相关推荐
HelloGitHub11 小时前
这个年轻的开源项目,想让每个人都能拥有自己的专业级 AI 智能体
开源·github·agent
Kagol1 天前
🎉OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用!
前端·开源·agent
冬奇Lab1 天前
OpenClaw 源码精读(2):Channel & Routing——一条消息如何找到它的 Agent?
人工智能·开源·源码阅读
冬奇Lab1 天前
一天一个开源项目(第38篇):Claude Code Telegram - 用 Telegram 远程用 Claude Code,随时随地聊项目
人工智能·开源·资讯
sunny8651 天前
Claude Code 跨会话上下文恢复:从 8 次纠正到 0 次的工程实践
人工智能·开源·github
louiX1 天前
深入理解 Android BLE GATT 回调机制:从“回调地狱”到高可靠 OTA 架构
架构
aircrushin1 天前
轻量化大模型架构演进
人工智能·架构
天蓝色的鱼鱼1 天前
你的项目真的需要SSR吗?还是只是你的简历需要?
前端·架构
文心快码BaiduComate1 天前
百度云与光本位签署战略合作:用AI Agent 重构芯片研发流程
前端·人工智能·架构
JavaTalks1 天前
高并发保护实战:限流、熔断、降级如何配合落地
后端·架构·设计