Files
airdisplay/README.md
yuqianhe 982584e470 docs: 更新 README 完整文档,覆盖五项改造详情
- Android 6-14 兼容说明
- 可配置设备名 + UIBC 触摸回传
- 分辨率/帧率设置 + SPS 自动检测
- 三级延迟模式配置表
- 完整技术栈说明、设置项使用指南、常见问题
2026-05-29 15:42:49 +00:00

11 KiB
Raw Permalink Blame History

AirDisplay — Android TV 无线显示器

将 Android TV 变成支持 Microsoft 无线显示适配器Miracast/Wi-Fi Display的无线显示器。

功能概述

  • Wi-Fi Direct P2PAndroid TV 作为 Group OwnerWindows 直接发现并连接
  • Miracast 协议:完整实现 RTSP M1-M8 握手TCP 7236
  • 硬件解码:基于 Android MediaCodec 的 H.264/H.265 硬件加速解码
  • TS 解复用MPEG2-TS 流实时解析与音视频分离
  • 低延迟渲染SurfaceView 输出 + AudioTrack 音频播放
  • UIBC 触摸回传:支持触控/鼠标/键盘事件从 Android TV 回传至 Windows 端
  • 可配置设备名自定义设备名称未配置时自动使用系统设备名Build.MODEL
  • 分辨率/帧率选择:支持手动选择预设 + 自动从 SPS 检测源端分辨率
  • 三级延迟模式:低延迟(游戏)/ 平衡(推荐)/ 兼容(弱网络)
  • Android TV UILeanback 主题,遥控器友好设置界面

系统要求

项目 要求
Android TV Android 6.0 (API 23) 或更高
硬件 支持 Wi-Fi Direct 的 Wi-Fi 芯片
Windows Windows 10/11 内置"无线显示器"功能
网络 无需路由器Wi-Fi Direct 直连

工作原理

┌─ Windows (Source) ─────────────────────────────────┐
│  Win + K → 连接到无线显示器                          │
│        ↓ Wi-Fi Direct                               │
│        ↓ TCP 7236 (RTSP M1-M8 握手)                 │
│        ↓ UDP RTP/MPEG2-TS (音视频流)                │
│        ↑ TCP 7237 (UIBC 触控/鼠标/键盘回传)          │
└─────────────────────────────────────────────────────┘
              │
              ▼
┌─ Android TV (Sink) ────────────────────────────────┐
│  DeviceNameManager — 设备名管理                     │
│  ResolutionManager — 分辨率/帧率管理                │
│  LatencyManager — 三级延迟模式控制                  │
│  WiFiDirectManager — Wi-Fi Direct P2P Group Owner  │
│  → RtspServer (7236 M1-M8 握手 + 能力协商)         │
│  → RtpReceiver (UDP 接收 + 可调缓冲水位)            │
│  → TsDemuxer (188B TS 解析 + SPS 自动分辨率检测)    │
│  → MediaCodec (H.264/H.265 解码 + 低延迟模式)       │
│  → SurfaceView + AudioTrack                        │
│  → UibcServer (7237 触控/鼠标/键盘事件注入)          │
└─────────────────────────────────────────────────────┘

完成改造一览

Android 614 兼容性改造V2

项目 方案
minSdk=23 (Android 6.0) 全项目最低 API 要求
targetSdk=34 适配 Android 14 目标 API
foregroundServiceType tools:targetApi=34 条件声明
FOREGROUND_SERVICE_MEDIA_PLAYBACK maxSdkVersion=34
KEY_LOW_LATENCY API 29+Android Q+)守卫
通知渠道 API 26+Android O+)守卫

可配置设备名V2

  • DeviceNameManagerSharedPreferences 持久化,未配置时回退 Build.MODEL
  • SettingsActivity + activity_settings.xmlLeanback 风格设置界面32 字符限制
  • RTSP 握手M1 响应 Server: 头注入设备名
  • 通知栏:前台服务通知标题使用设备名
  • Wi-Fi Direct:反射尝试设置 P2P 设备名

UIBC 触摸回传V2

  • UibcServerTCP 7237 接收 Windows 端 Generic Input PDU
    • 触控事件Generic Input PDU type 4 + 5
    • 鼠标移动/左键/右键type 4
    • 键盘输入type 2
    • InputManager 注入Android 10+ 新增触摸序列 API
    • 回调模式Android 69 兼容)
  • WfdParserbuildUibcCapability / parseUibcCapability 编码解码
  • RTSP M3 握手:协商 UIBC 能力,端口 7237

分辨率/帧率设置+自动模式V3

  • ResolutionManagerSharedPreferences 持久化
    • 7 个预设640×480@60 ~ 1920×1080@60
    • 自动模式 / 手动模式切换
    • 自动模式从 SPS 解析实际分辨率
  • 动态 WFD 参数WfdParser.buildVideoFormats(width, height, fps) 根据设置动态编码
  • 设置 UIResolutionSelector (RadioGroup) + 预设 Spinner
  • SPS 自动检测TsDemuxer 完整 H.264 SPS 解析(宽/高 + frame_croppingonResolutionDetected 回调

延迟优化V3

  • LatencyManager:三级模式配置持久化
    参数 低延迟(游戏) 平衡(推荐) 兼容(弱网络)
    RTP 缓冲水位 3 包 8 包 20 包
    队列上限 30 帧 60 帧 120 帧
    低延迟解码 (KEY_LOW_LATENCY)
    丢帧阈值 15 帧 30 帧 60 帧
    每次丢帧比例 50% 30% 10%
    解码超时 3ms 10ms 20ms
  • MediaRendererupdateLatencyConfig() 动态调参,configureVideoCodec 条件启用低延迟
  • RtpReceiver:可配置 bufferWatermark 字段

构建说明

前置条件

  1. Android Studio (Hedgehog 2023.1.1 或更新版本)
  2. JDK 17
  3. Android SDK 34

构建步骤

# 1. 克隆项目
git clone https://git.privserv.eu.org/yuqianhe/airdisplay.git
cd airdisplay

# 2. 生成调试 APK
./gradlew assembleDebug

# 3. 生成的 APK 位置
# app/build/outputs/apk/debug/app-debug.apk

直接安装

# 通过 ADB 安装到 Android TV
adb install -r app/build/outputs/apk/debug/app-debug.apk

使用说明

Android TV 端

  1. 安装后打开 AirDisplay 应用
  2. 等待屏幕显示"等待连接"和设备名称
  3. 应用会自动启动 Wi-Fi Direct 和 RTSP 服务

设置项

按遥控器菜单键或方向键导航至「设置」入口:

  • 设备名称:自定义设备名,未配置时使用系统默认名
  • 分辨率/帧率
    • 手动模式从预设列表选择640×480~1920×1080 @ 24/30/60fps
    • 自动模式:从 Windows 端视频流 SPS 自动检测实际分辨率
  • 延迟模式
    • 低延迟(游戏):最小缓冲,激进的丢帧策略
    • 平衡(推荐):日常使用兼顾画质与延迟
    • 兼容(弱网络):大缓冲抗网络抖动

Windows 端

  1. Win + K 打开"投屏"面板
  2. 在设备列表中查找 Android TV 设备名
  3. 点击连接
  4. 等待握手完成,电视屏幕将显示 Windows 桌面

UIBC 触摸回传

连接后Android TV 遥控器/触摸板可控制 Windows

  • 触控滑动:模拟鼠标移动
  • 点击:鼠标左键
  • 菜单键:鼠标右键
  • 键盘输入:通过 USB/蓝牙键盘输入

注意事项

  • 确保 Android TV 和 Windows PC 的 Wi-Fi 都已开启
  • Wi-Fi Direct 不需要连接同一路由器
  • 首次连接可能需要 5-15 秒
  • 如果找不到设备,可尝试重启应用
  • 部分 Android TV 设备可能需要在设置中开启 Wi-Fi Direct 权限
  • 延迟模式切换后需要重新连接才能生效(解码器低延迟参数)

项目结构

airdisplay/
├── app/
│   ├── build.gradle.kts              # App 构建配置 (compileSdk=34, minSdk=23)
│   └── src/main/
│       ├── AndroidManifest.xml        # 权限、组件声明
│       ├── res/                       # 资源文件
│       └── java/com/qwenpaw/miracast/
│           ├── MiracastService.kt     # ☰ 核心服务(全生命周期管理)
│           ├── DeviceNameManager.kt   # 设备名管理(持久化 + 默认回退)
│           ├── ResolutionManager.kt   # 分辨率/帧率管理(预设 + 自动检测)
│           ├── LatencyManager.kt      # 三级延迟模式控制
│           ├── wifidirect/
│           │   ├── WiFiDirectManager.kt           # Wi-Fi Direct P2P 管理
│           │   └── WiFiDirectBroadcastReceiver.kt  # P2P 广播接收
│           ├── rtsp/
│           │   ├── RtspServer.kt      # TCP 7236 服务器
│           │   ├── RtspSession.kt     # M1-M8 握手状态机(含 UIBC 协商)
│           │   └── WfdParser.kt       # WFD 参数编解码(动态分辨率)
│           ├── media/
│           │   ├── RtpReceiver.kt     # UDP RTP 接收(可调缓冲水位)
│           │   ├── TsDemuxer.kt       # MPEG2-TS 解复用SPS 自动分辨率检测)
│           │   └── MediaRenderer.kt   # MediaCodec 解码渲染(低延迟模式)
│           ├── uibc/
│           │   └── UibcServer.kt      # UIBC 触控/鼠标/键盘回传TCP 7237
│           └── ui/
│               ├── MainActivity.kt     # Android TV 主界面
│               ├── SettingsActivity.kt # 设备名 + 分辨率设置界面
│               └── activity_settings.xml
├── build.gradle.kts                   # 项目构建配置
├── settings.gradle.kts                # 项目设置
└── gradle.properties                  # Gradle 属性

协议栈

层级 协议/技术 端口 功能
发现/连接 Wi-Fi Direct (P2P) - 设备发现与连接
控制 RTSP (Miracast M1-M8) TCP 7236 握手、能力协商(分辨率/UIBC
传输 RTP/AVP UDP 19000+ 媒体数据传输
封装 MPEG2-TS - 音视频复用
编码 H.264/H.265 - 视频压缩
编码 AAC/AC3 - 音频压缩
回传 UIBC (Generic Input PDU) TCP 7237 触控/鼠标/键盘事件回传

常见问题

Q: Windows 搜索不到设备? A: 确认 Android TV 支持 Wi-Fi Direct。首次启动需等待 5-10s 完成 Wi-Fi Direct 初始化。可在设置中自定义设备名以方便识别。

Q: 连接后黑屏? A: 检查 Android TV 是否开启了"允许覆盖其他应用"的权限。部分设备需要手动授权。尝试切换延迟模式为"兼容"。

Q: 声音没有输出? A: 检查 Android TV 的音量设置。部分 AAC 编码需要额外的解码器支持。

Q: 延迟高? A: 默认使用"平衡"模式,延迟约 100-200ms。切换至"低延迟(游戏)"模式可降至 50-100ms牺牲抗抖动能力。确保 Wi-Fi 信号强度良好。

Q: UIBC 触摸不生效? A: Android TV 遥控器触控板作为触摸输入源。部分 Android TV 系统可能需要开启"辅助功能"权限才能使用 InputManager 注入。

Q: 分辨率自动模式不准确? A: 自动模式从 H.264 SPS 中解析视频宽高。极少数编码器可能不包含完整 SPS 信息,此时回退至手动模式设置的分辨率。

技术参考

License

MIT