Skip to content

Releases: weekdayjast/MiracastReceiver

v1.2.9 — 手动旋转画面

Choose a tag to compare

@weekdayjast weekdayjast released this 28 Oct 14:31

版本概述

新增手动旋转画面:每按一次画面顺时针转 90°,手机、电视、盒子都可以用。适合可旋转的显示器、竖屏视频,以及画面方向不对的投屏(#20)。

新功能

  • 旋转画面:AirPlay 镜像、Windows 投屏(Miracast)、DLNA 视频和图片都支持。每按一次画面顺时针转 90°,转满一圈回到原样。旋转后画面按新方向等比缩放,完整显示。
    • 触屏设备:点一下屏幕,右下角会出现旋转按钮。
    • 遥控器:镜像和图片模式下按 OK 键或上下键呼出旋转按钮,再按 OK 旋转。DLNA 视频的控制条上也有旋转按钮。
    • 每次新的投屏都从不旋转开始。

改进

  • "更多"菜单:原来的"屏幕方向"(横竖屏来回切换)改为"旋转画面",和旋转按钮效果一致。
  • 首页:去掉了没有实际作用的"连接码"卡片。

注意

  • 不旋转时,画面和以前一样走硬件视频层,性能不受影响。旋转后画面改由 GPU 合成,在性能较弱的设备上投 4K 镜像时可能略有卡顿。

下载

文件 适用设备
miracast-receiver-v1.2.9-armeabi-v7a.apk 32 位系统(大多数电视/盒子)
miracast-receiver-v1.2.9-arm64-v8a.apk 64 位系统
miracast-receiver-v1.2.9-universal.apk 不确定时选这个

从 v1.2.x 可直接覆盖安装;如提示签名冲突,请先卸载旧版本。

v1.2.8 — 多语言界面与应用内语言切换

Choose a tag to compare

@weekdayjast weekdayjast released this 25 Oct 07:13

版本概述

接收端界面支持多语言,并可在应用内切换语言。默认跟随系统语言,系统语言不在支持列表中时显示英文。

新功能

  • 10 种界面语言:English、简体中文、繁體中文、日本語、한국어、Русский、Français、Español、ไทย、हिन्दी。首页、播放页、"更多"菜单、视频信息面板、权限提示和通知栏都已翻译。
  • 应用内切换语言:首页新增"语言"设置项,可以选择"跟随系统"或指定一种语言,切换后立即生效,重启后保留。Android 13 及以上也可以在系统设置的"应用语言"里修改。

改进

  • 连接码显示:首页的连接码卡片不再重复显示"连接码"字样,只显示连接码本身。
  • 视频信息面板对齐:标签较长的语言(如英文、俄文)下,数值列仍保持对齐。
  • 安装包变小:移除了未使用的 WebRTC 组件,各安装包体积减小约 3–6 MB。

注意

  • 切换语言后,通知栏的文字要等接收服务重启(例如重启电视)后才会更新。

下载

文件 适用设备
miracast-receiver-v1.2.8-armeabi-v7a.apk 32 位系统(大多数电视/盒子)
miracast-receiver-v1.2.8-arm64-v8a.apk 64 位系统
miracast-receiver-v1.2.8-universal.apk 不确定时选这个

从 v1.2.x 可直接覆盖安装;如提示签名冲突,请先卸载旧版本。

v1.2.7 — 修复浏览器全屏视频黑屏

Choose a tag to compare

@weekdayjast weekdayjast released this 18 Oct 15:40

版本概述

修复 iPhone 屏幕镜像时,在 Chrome / Safari 等浏览器里把视频切到全屏后黑屏的问题(#14)。现在全屏视频会交给电视独立播放,手机显示"正在电视上播放此视频"。

问题修复

  • 浏览器全屏视频黑屏:iPhone 镜像中网页视频全屏时会切换为 AirPlay 视频投送,此前接收端在这一步的多个环节都没有处理好,导致手机和电视同时黑屏或断开。现在支持完整的切换流程,电视直接拉取视频地址播放,画质不受镜像编码影响;视频播完后自动回到镜像(例如片头广告结束后,正片会再次投送到电视)。
  • 投送画面尺寸:视频投送时按视频本身比例铺满屏幕,不再被缩成手机竖屏大小。
  • 第二次镜像起画面被拉伸:同一次运行中再次镜像时,画面不再被拉伸铺满。
  • 首次授权后服务重复启动:首次安装授予 Wi-Fi Direct 权限后,不再重复创建接收器。

注意

  • 如果 iPhone 之前在本设备上全屏投送失败过,可能会记住失败而不再尝试;请彻底关闭浏览器后重开页面。仍不行时,清除本应用数据(或重装)后再试。

下载

文件 适用设备
miracast-receiver-v1.2.7-armeabi-v7a.apk 32 位系统(大多数电视/盒子)
miracast-receiver-v1.2.7-arm64-v8a.apk 64 位系统
miracast-receiver-v1.2.7-universal.apk 不确定时选这个

从 v1.2.x 可直接覆盖安装;如提示签名冲突,请先卸载旧版本。

v1.2.6

Choose a tag to compare

@weekdayjast weekdayjast released this 15 Oct 02:34

版本概述

修复部分 Android 电视上 iPhone/Mac 搜不到 AirPlay 设备的问题(#16)。

问题修复

  • AirPlay 在部分机型不显示:自定义发送端使用的 _miracast-receiver._tcp 服务此前与 _airplay._tcp 使用相同的 mDNS 实例名。未更新 Connectivity 模块的系统(如国行 Sony XR-65A95L / Android 14)不允许同名不同类型的服务共存,导致 AirPlay 注册失败。现 _miracast-receiver._tcp 改用独立实例名 <设备名> MR,真实设备名仍通过 TXT 记录的 name 字段提供。

感谢 @sjlabt 提供详细的定位与验证。

下载

文件 适用设备
miracast-receiver-v1.2.6-armeabi-v7a.apk 32 位系统(大多数电视/盒子)
miracast-receiver-v1.2.6-arm64-v8a.apk 64 位系统
miracast-receiver-v1.2.6-universal.apk 不确定时选这个

从 v1.2.x 可直接覆盖安装;如提示签名冲突,请先卸载旧版本。

v1.2.5 — Android 7 启动崩溃修复

Choose a tag to compare

@weekdayjast weekdayjast released this 10 Oct 07:17

版本概述

修复 Android 7.x(API 24/25)设备上启动后崩溃、服务反复重启的问题(#13)。

问题修复

  • Android 7 启动崩溃:前台通知的小图标此前引用 mipmap/ic_launcher,该资源只存在于 mipmap-anydpi-v26(仅 Android 8.0+ 可用),Android 7 上通知创建失败并抛出 RemoteServiceException: Bad notification posted,导致投屏服务循环崩溃。现改为使用专用的单色通知图标 drawable/ic_stat_miracast。
  • 低版本启动图标兜底:新增 mipmap/ic_launcher,Android 8.0 以下设备也能正常显示应用图标。

构建改进

  • 修正 ndk.abiFilters 与 ABI splits 的冲突,单架构构建(-PbuildArm64 / -PbuildArm32)不再报错。

感谢 @WuLongMiTaoLaiYiDa 提供详细的崩溃日志与修复补丁。

下载

文件 适用设备
miracast-receiver-v1.2.5-armeabi-v7a.apk 32 位系统(大多数电视/盒子)
miracast-receiver-v1.2.5-arm64-v8a.apk 64 位系统
miracast-receiver-v1.2.5-universal.apk 不确定时选这个

从 v1.2.x 可直接覆盖安装;如提示签名冲突,请先卸载旧版本。

v1.2.4 — Miracast 声音修复

Choose a tag to compare

@weekdayjast weekdayjast released this 24 Sep 15:31

Miracast Receiver v1.2.4 升级说明

版本概览

v1.2.4 修复 Miracast 投屏有画面无声音(issue #8、issue #12),以及投屏中途进入屏保、应用未打开时投屏没有反应等问题。

问题修复

Miracast 投屏有声音了

安卓手机「投屏」和 Windows Win+K 无线显示器走的是同一条 Miracast 链路,此前只解码了视频轨,两者都没有声音。现在会同时解出 TS 流里的 AAC / LPCM 音轨播放,与画面一样「收到即播」,积压时自动丢弃旧数据,避免声音越来越滞后。

投屏中途不再进入屏保

Miracast 投屏期间保持屏幕常亮,会话结束后恢复。

应用未打开时投屏没有反应

Android 10 起系统禁止后台弹出界面。开机自启后、或退回桌面后投屏,播放页会被系统拦截。现在应用需要 「显示在其他应用上层」 权限:首次打开应用时会弹窗引导到系统设置页开启,请务必开启。电视没有该设置页时可用 adb 开启:

adb shell appops set com.weekd.miracastreceiver SYSTEM_ALERT_WINDOW allow

其他改进

  • AirPlay / DLNA 显示的名称改为电视「设置 → 关于 → 设备名称」里的名字
  • 文档更正:系统自带「屏幕镜像」的电视(如 Sony BRAVIA)使用 Miracast 无需 root,连接时电视弹出的确认框点允许即可

已知限制

  • 安卓手机投屏和 Win+K 列表里显示的名称是系统默认的 Android_xxxx:Android 11 起修改 Wi-Fi Direct 设备名需要系统权限,应用无法修改

下载

文件 适用设备
miracast-receiver-v1.2.4-armeabi-v7a.apk 32 位系统(多数电视)
miracast-receiver-v1.2.4-arm64-v8a.apk 64 位系统
miracast-receiver-v1.2.4-universal.apk 不确定时选这个

从 v1.2.x 可直接覆盖安装;若提示签名不一致,请先卸载旧版本。

v1.2.3 — 开机自动启动接收服务

Choose a tag to compare

@weekdayjast weekdayjast released this 21 Sep 01:39

Miracast Receiver v1.2.3 升级说明

版本概览

v1.2.3 新增开机自动启动接收服务(issue #11):电视开机后接收服务自动在后台运行,不弹出界面,手机无需先手动打开一次应用即可发现设备。投屏功能本身与 v1.2.2 一致。

新增功能

开机自动启动

电视启动完成后,BootReceiver 会把投屏接收服务拉起来,不会打开主界面。除标准的 BOOT_COMPLETED 外,也监听部分国产电视/盒子快速开机使用的 QUICKBOOT_POWERON,以及应用升级后的 MY_PACKAGE_REPLACED(升级后自动恢复服务)。

主界面新增开关「开机自动启动接收服务」,可用遥控器 D-pad 选中切换,默认开启。

两处容易踩坑的地方

1. Android 15 的前台服务限制

Android 15(API 35)起禁止从 BOOT_COMPLETED 启动 mediaPlayback 类型的前台服务,直接启动会抛 ForegroundServiceStartNotAllowedException。因此开机路径改用 connectedDevice 类型(语义上也更贴切:接收局域网设备投屏),从界面启动时仍用 mediaPlayback。

2. 开机时网络尚未就绪

刚开机时 Wi-Fi 还在连接,拿不到局域网 IP,此时启动 SSDP/mDNS 会绑到错误地址 —— 表现为服务在跑,但手机怎么都搜不到电视。现在服务先挂起通知保住前台状态,各路接收器(AirPlay / DLNA / Miracast)的初始化推迟到取得局域网 IP 之后,每 5 秒检查一次,最长等待 5 分钟。

待机唤醒后服务被系统回收的情况,由原有的 START_STICKY 覆盖,系统会自动重建服务。

注意事项

部分电视厂商(小米、海信等)有自己的自启动管理,若重启后仍未自动运行,需要在系统设置 → 应用管理中允许本应用自启动。此外应用需要至少手动打开过一次,Android 才会向其投递开机广播。

安装包说明

  • miracast-receiver-v1.2.3-arm64-v8a.apk:64 位设备,推荐优先使用。
  • miracast-receiver-v1.2.3-armeabi-v7a.apk:32 位设备(多数 2016 年前后的电视属于此类)。
  • miracast-receiver-v1.2.3-universal.apk:不确定设备架构时用这个,两种架构都含。

v1.2.2 — 修复老设备启动闪退

Choose a tag to compare

@weekdayjast weekdayjast released this 06 Aug 12:07

Miracast Receiver v1.2.2 升级说明

版本概览

v1.2.2 修复了在 Android 5.0 – 7.1 老设备上一启动就闪退的问题(issue #2),并补上了 Android 12+ 的定位权限申请缺陷。功能与 v1.2.1 一致。

修复内容

老版本 Android 启动闪退

应用声明 minSdk = 21(Android 5.0),但代码里有多处调用了更高版本才有的 API,且都在启动路径上 —— 结果是装得上、一开就崩。

用 Lint 的 NewApi 静态检查逐个排出来:

问题 API 引入版本 影响范围
Context.registerReceiver(receiver, filter, flags) API 26 Android 5.0 – 7.1 全部
ConnectivityManager.activeNetwork API 23 Android 5.x
Display.getSupportedModes / getMode API 23 Android 5.x
AudioTrack.Builder、带标志的 write 重载 API 23 Android 5.x(AirPlay 音频)

其中 registerReceiver 那条覆盖面最广 —— 带 flags 的重载是 Android 8.0 才加的,而它在后台服务的 onCreate 里,老设备必然抛 NoSuchMethodError。2016 年前后的电视无论是 5.1 还是 6.0 都会中招。

现已全部改为版本判断 + 低版本回退路径(registerReceiver 走 ContextCompat,其余回退到对应的旧 API)。

Android 12+ 定位权限被系统驳回

Android 12 起,申请 ACCESS_FINE_LOCATION 时必须同时声明并申请 ACCESS_COARSE_LOCATION,否则系统直接驳回整个请求。清单里此前只有 FINE,导致 v1.2.0 加入的运行时权限申请在新设备上静默失效 —— 而 Wi-Fi Direct 依赖这个权限,Miracast 因此无法使用。

无 Wi-Fi Direct 的设备崩溃

WifiP2pManager 此前用非空强转获取。不少电视(尤其非 Android TV 认证的整机)根本没有 Wi-Fi Direct,getSystemService 返回 null 时应用直接崩溃。现在改为可空处理:没有 Wi-Fi Direct 就只是 Miracast 不可用,AirPlay 和 DLNA 照常工作。

同时给 Wi-Fi Direct 的相关调用补上了 SecurityException 捕获 —— 用户在运行中撤销定位权限时,异常会抛在广播接收器里,此前无人处理会导致崩溃。

安装包说明

  • miracast-receiver-v1.2.2-arm64-v8a.apk:64 位设备,推荐优先使用。
  • miracast-receiver-v1.2.2-armeabi-v7a.apk:32 位设备(多数 2016 年前后的电视属于此类)。
  • miracast-receiver-v1.2.2-universal.apk:不确定设备架构时用这个,两种架构都含。

均为正式签名包,可直接覆盖安装。仓库中另附 -unsigned.apk 版本供自行签名使用。

升级建议

  1. 直接覆盖安装,无需卸载。
  2. 启动后授予定位权限(Wi-Fi Direct 必需),拒绝则 Miracast 不可用,其余投屏方式不受影响。
  3. 使用 Windows 无线投屏时注意:应用的正式签名包与自行编译的 debug 包签名不同,部分 root 管理器(如 MIUI 安全中心)会当作两个不同应用,需要重新授予 root 权限。若 Windows 搜不到设备,先检查 root 授权是否被拒绝。

已知限制

与前一版本相同:

  • Windows 无线投屏需要 root,未 root 的设备请改用 DLNA 投屏。详见 Root 配置说明。
  • Miracast 暂无声音,目前只解码视频轨。
  • 投屏分辨率固定声明为 1080p30,不随设备屏幕调整,非 16:9 屏幕会有黑边。
  • 延迟约 60–130 ms,其中 30–60 ms 来自 Windows 侧编码,是 Miracast 协议的固有下限。

v1.2.1 — 修复 SPS 分辨率解析

Choose a tag to compare

@weekdayjast weekdayjast released this 05 Aug 14:20

Miracast Receiver v1.2.1 升级说明

版本概览

v1.2.1 是一个补丁版本,只修复了一处 H.264 SPS 解析的缺陷。功能与 v1.2.0 完全一致。

修复内容

SPS 分辨率解析越过起始码

解析器在读取 H.264 序列参数集(SPS)时只跳过 1 个字节就开始按位解析,但所有调用方传入的 SPS 都带着 Annex B 起始码(00 00 00 01 或 00 00 01)。结果指针停在起始码的第二个 0x00 上,之后读到的数据整体错位三到四个字节。

原先代码的注释把这归因于「某些发送端的 SPS 格式特殊」,实际上所有发送端都被误读:

  • AirPlay 一直没暴露,是因为 SDP 会提供画面尺寸作为兜底值
  • Miracast 没有这个兜底,把 1920×1080 解析成了 190×140 —— 这个值虽然离谱,却恰好通过了合法性检查,于是解码器按 190×140 的参数去解 1080p 的码流

投屏此前仍能正常显示,是因为硬件解码器会自己从 SPS 读出真实尺寸并通过 INFO_OUTPUT_FORMAT_CHANGED 上报纠正,但初始配置确实是错的。

修复方式是先识别并跳过两种形式的起始码,再跳过 NAL 头字节。合法性检查和兜底逻辑保留 —— 真正畸形的 SPS 仍可能解出垃圾值,用它配置解码器会导致解码器卡死。

安装包说明

  • miracast-receiver-v1.2.1-arm64-v8a.apk:适用于 64 位设备,推荐优先使用。
  • miracast-receiver-v1.2.1-armeabi-v7a.apk:适用于 32 位设备。
  • miracast-receiver-v1.2.1-universal.apk:通用包,不确定设备架构时使用。

均为正式签名包,可直接覆盖安装,无需卸载旧版本。仓库中另附 -unsigned.apk 版本供自行签名使用。

已知限制

与 v1.2.0 相同,未在本版本中改变:

  • Windows 无线投屏需要 root,未 root 的设备请改用 DLNA 投屏。详见 Root 配置说明。
  • Miracast 暂无声音,目前只解码视频轨。TS 流里已带 AAC 音频轨,需要解出音频 PID 并接到 AudioTrack,这是下个版本的首要任务。
  • 投屏分辨率是固定声明的(720p / 1080p),不会根据设备实际屏幕调整。16:10 平板等非 16:9 屏幕会出现黑边。
  • 延迟约 60–130 ms,其中 30–60 ms 来自 Windows 侧的屏幕捕获与编码,属于 Miracast 协议本身的下限。

v1.2.0 — Windows 无线显示器可用

Choose a tag to compare

@weekdayjast weekdayjast released this 05 Aug 13:21

Miracast Receiver v1.2.0 升级说明

版本概览

v1.2.0 的主角是 Windows 无线显示器(Miracast)。此前的文档把它标注为「受限支持」,认为普通应用无法被 Windows 发现 —— 这个结论在本版本被推翻了一半:限制确实存在,但在已 root 的设备上可以绕过,并且整条链路已经端到端跑通。

实测环境:小米 MIX 2S(MIUI V9 / Android 8.0,已 root)← Windows 11(MSMiracastSource/10.00.26100)。

主要改动

Windows 无线显示器可用了(需要 root)

按 Win + K 就能发现设备并投屏,可以当作 Windows 的无线第二屏幕使用,端到端延迟约 60–130 ms。

能做到这一点,是因为解决了四个问题:

  • 设备发现 —— Windows 靠 beacon 里的 WFD IE 发现无线显示器,而设置它需要 signature 级权限,普通应用必然失败。现在通过随包内置的 libwfdctl.so 用 root 直接注入 wpa_supplicant,绕开了 framework 的权限检查。

  • RTSP 连接方向搞反了 —— WFD 规范里 Source(Windows)才是监听方,Sink 必须主动连过去。此前双方都在等对方,互等约 60 秒后超时,Windows 显示「连接失败」。

  • 握手不完整 —— Sink 必须主动发起 M2 / M6 / M7 三条消息,并在 M3 响应里给出 wfd_client_rtp_ports,否则 Source 根本不知道往哪个端口发视频数据。

  • 视频封装判断错误 —— Miracast 的 H.264 是封装在 MPEG-2 TS 里的(RTP 负载类型 33),而不是裸 NAL 分片。原先的解包逻辑在解一堆无意义的数据。现在新增了 TS 解复用,解出的画面直接送进硬件解码器。

延迟优化

  • 解码送显改为专用输出线程。原先解好的帧要等下一帧到达才被送显,白白多出一个帧间隔(60fps 下 16 ms)。AirPlay 镜像同样受益。
  • 开启解码器低延迟模式(标准 key + 高通/联发科厂商 key),避免解码器为提高吞吐而缓存帧。
  • Miracast 协商目标提升到 1080p60,帧间隔从 33 ms 降到 16 ms。

问题修复

  • AirPlay 结束镜像后画面卡住 —— iPhone 停止镜像后,播放页不会关闭,一直停在最后一帧。Miracast 断开时也有同样问题,两处都已修复。
  • 首页文字重叠 —— 原布局按 4K 电视写死字号并把三块内容分别贴顶/居中/贴底,屏幕稍小就会互相遮挡。改为可滚动的纵向布局,手机、平板、电视都能正常显示。首页也不再强制横屏。
  • 未申请运行时权限 —— 应用从未申请过 ACCESS_FINE_LOCATION,导致全新安装时 Wi-Fi Direct 初始化失败、Miracast 直接不可用。现在会在启动时申请(Android 13+ 使用 NEARBY_WIFI_DEVICES)。
  • 播放画质被限制在标清 —— 轨道选择器默认设了 setMaxVideoSizeSd(),所有播放(含 DLNA)实际上都被压到标清,画质菜单里的「原画」从未真正生效。
  • 设备名称不统一 —— Windows 投屏列表里显示的是写死的 Miracast-TV,与 AirPlay / DLNA 显示的名称不一致,现已统一。
  • 退出时未断开连接 —— 划掉应用或服务停止时,会主动撤销 WFD 广播并移除 P2P 组。

安装包说明

本版本输出以下 APK:

  • miracast-receiver-v1.2.0-arm64-v8a.apk:适用于 64 位 Android TV / 手机 / 平板,推荐优先使用。
  • miracast-receiver-v1.2.0-armeabi-v7a.apk:适用于 32 位设备。
  • miracast-receiver-v1.2.0-universal.apk:通用包,不确定设备架构时使用。

以上均为正式签名包,可直接安装。仓库中另附对应的 -unsigned.apk 版本,供需要自行签名的场景使用。

关于设备架构:安装时若报 INSTALL_FAILED_NO_MATCHING_ABIS,说明架构不符,可用 adb shell getprop ro.product.cpu.abi 确认后换包,或直接用 universal 包。

升级建议

  1. 直接覆盖安装 v1.2.0,无需卸载旧版本。
  2. 启动后授予定位权限(Wi-Fi Direct 必需),否则 Miracast 不可用,AirPlay / DLNA 不受影响。
  3. 要使用 Windows 无线投屏,设备必须已 root,首次注入时会弹出 root 授权请求。
  4. 详细步骤和排错见 Windows 无线投屏 Root 配置说明。

已知限制

  • Windows 无线投屏需要 root,未 root 的设备无法使用此功能,请改用 DLNA 投屏。
  • Miracast 暂无声音 —— 目前只解码视频轨。TS 流里已经带着 AAC 音频轨,需要在解复用器里解出音频 PID 并接到 AudioTrack,这是下个版本的首要任务。
  • 延迟无法降到「无感」 —— 约 60–130 ms 中有 30–60 ms 来自 Windows 侧的屏幕捕获与编码,这是 Miracast 协议本身的下限。浏览网页、看文档完全够用,游戏或视频剪辑会明显难受。
  • 常驻占用 Wi-Fi Direct 接口 —— 服务启动即创建 P2P 组并一直保持,尚未实现按需建组。
  • 部分设备的 wpa_supplicant 可能未编译 Wi-Fi Display 支持,此时无法使用,检查方法见配置说明文档。