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

257 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AirDisplay — Android TV 无线显示器
将 Android TV 变成支持 **Microsoft 无线显示适配器**Miracast/Wi-Fi Display的无线显示器。
## 功能概述
- **Wi-Fi Direct P2P**Android 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 UI**Leanback 主题,遥控器友好设置界面
## 系统要求
| 项目 | 要求 |
|------|------|
| 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
- **DeviceNameManager**SharedPreferences 持久化,未配置时回退 `Build.MODEL`
- **SettingsActivity** + **activity_settings.xml**Leanback 风格设置界面32 字符限制
- **RTSP 握手**M1 响应 `Server:` 头注入设备名
- **通知栏**:前台服务通知标题使用设备名
- **Wi-Fi Direct**:反射尝试设置 P2P 设备名
### ✅ UIBC 触摸回传V2
- **UibcServer**TCP 7237 接收 Windows 端 Generic Input PDU
- 触控事件Generic Input PDU type 4 + 5
- 鼠标移动/左键/右键type 4
- 键盘输入type 2
- InputManager 注入Android 10+ 新增触摸序列 API
- 回调模式Android 69 兼容)
- **WfdParser**`buildUibcCapability` / `parseUibcCapability` 编码解码
- **RTSP M3 握手**:协商 UIBC 能力,端口 7237
### ✅ 分辨率/帧率设置+自动模式V3
- **ResolutionManager**SharedPreferences 持久化
- 7 个预设640×480@60 ~ 1920×1080@60
- 自动模式 / 手动模式切换
- 自动模式从 SPS 解析实际分辨率
- **动态 WFD 参数**`WfdParser.buildVideoFormats(width, height, fps)` 根据设置动态编码
- **设置 UI**ResolutionSelector (RadioGroup) + 预设 Spinner
- **SPS 自动检测**TsDemuxer 完整 H.264 SPS 解析(宽/高 + frame_cropping`onResolutionDetected` 回调
### ✅ 延迟优化V3
- **LatencyManager**:三级模式配置持久化
| 参数 | 低延迟(游戏) | 平衡(推荐) | 兼容(弱网络) |
|------|:-:|:-:|:-:|
| RTP 缓冲水位 | 3 包 | 8 包 | 20 包 |
| 队列上限 | 30 帧 | 60 帧 | 120 帧 |
| 低延迟解码 (KEY_LOW_LATENCY) | ✅ | ✅ | ❌ |
| 丢帧阈值 | 15 帧 | 30 帧 | 60 帧 |
| 每次丢帧比例 | 50% | 30% | 10% |
| 解码超时 | 3ms | 10ms | 20ms |
- **MediaRenderer**`updateLatencyConfig()` 动态调参,`configureVideoCodec` 条件启用低延迟
- **RtpReceiver**:可配置 `bufferWatermark` 字段
## 构建说明
### 前置条件
1. **Android Studio** (Hedgehog 2023.1.1 或更新版本)
2. **JDK 17**
3. **Android SDK 34**
### 构建步骤
```bash
# 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
```
### 直接安装
```bash
# 通过 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 信息,此时回退至手动模式设置的分辨率。
## 技术参考
- [Miracast Specification (Wi-Fi Alliance)](https://www.wi-fi.org/discover-wi-fi/wi-fi-certified-miracast)
- [Android Wi-Fi Direct API](https://developer.android.com/guide/topics/connectivity/wifip2p)
- [Android MediaCodec](https://developer.android.com/reference/android/media/MediaCodec)
- [ITU-T H.264 Specification](https://www.itu.int/rec/T-REC-H.264)
- [UIBC Generic Input PDU Format](https://source.android.com/docs/core/connect/wifi-display)
## License
MIT