Skip to main content

森投屏接收端 (CastReceiver)

一台「虚拟投屏设备」软件:让手机上 爱奇艺 / 腾讯视频 / 优酷 / 哔哩哔哩 等 App 自带的「投屏 / TV」按钮 能扫到这台电脑,把视频推流到电脑上播放。本质是 DLNA/UPnP MediaRenderer 接收端—— 手机推的是视频 URL,电脑直接拉流播放,所以 画质 = 片源画质、延迟远低于屏幕镜像。

支持情况

来源 协议 状态
爱奇艺 / 腾讯视频 / 优酷 / 芒果 / B站 等 DLNA/UPnP [OK] 主通道,完整支持
华为手机 App 内视频投屏(华为视频 / 腾讯视频 / B站 华为版等) DLNA/UPnP [OK] 同上,走标准 DLNA,已兼容
iPhone / 部分小众投屏 App AirPlay (mDNS 被发现 + 视频投屏) [OK] 视频投屏可用(legacy RSA 配对 + /play 拉流);[实验] 最新 iOS 的 method1 配对待补
华为「无线投屏 / 多屏协同」与 Windows 无线显示 Miracast -> 直接调起系统「无线显示」(投影到此电脑),本软件不重复实现

关于「华为私有协议」:华为手机在视频 App 内部点投屏按钮,底层就是标准 DLNA(和爱优腾一样), 本软件已完整兼容;华为的屏幕镜像(下拉菜单「无线投屏 / 多屏协同」)走的是系统级 Miracast / 华为 Cast+, 由 Windows 自带「无线显示」接收,本软件一键帮你打开设置入口。华为 Cast+ 的加密视频直传通道需华为私有密钥与加密协商, 属于封闭协议,无法在第三方软件里重新实现——这与 AirPlay FairPlay 同理。

特殊软件适配

爱优腾/B站这类主流 App 都是标准 DLNA,开箱即用。但小众 / 冷门 App 常有私有实现, 典型症状:扫不到设备、连上了不出画面、手机端不能暂停/拖进度、进度不回传、画质或音效不对。 这类问题基本都得拿到它的安装包针对性逆向才能改。

需要适配就把安装包发给 QQ:1218563952 直接发 .apk 即可,附一句现象(扫不到 / 不出画面 / 不能暂停 / 进度不回传 / 画质或音效不对)。 适配好了会通过 QQ 回复你,并放进后续版本。 求助前可以先自己试:换「系统解码」快捷方式启动、点「一键修复网络」后重启、手机 App 里手动切清晰度。

安装

依赖:Python 3.10+,PyQt6(含 QtMultimedia / QtMultimediaWidgets)、numpy(画质增强,可选)。

方式 A:exe(最省事) 去 Releases 下载 森投屏接收端.exe,双击即用,无需装 Python。

方式 B:pip

pip install senai-cast-receiver

装完跑一次 senai-cast-receiver(或 python -m main),桌面会自动多出一个图标, 以后直接双击那个图标就进 GUI,不用再敲命令。桌面图标没出现就再跑一次,或手动 senai-cast-shortcut。

方式 C:源码

git clone https://github.com/sunzhiya/senai-cast-receiver.git
cd senai-cast-receiver
pip install -r requirements.txt
python main.py          # 跑完桌面也会有图标

自己打包 exe:pip install pyinstaller 后 python build_exe.py,产物在 dist/。

早期版本用 PyQt6-WebEngine 内嵌 Chromium 播放,但其自带 Chromium 未编译 H.264/AAC, 投 mp4 会直接解码失败。现已改为 Qt6 Multimedia(QMediaPlayer + QVideoWidget), 不再依赖 WebEngine。

使用步骤

  1. 电脑与手机连到 同一个 Wi-Fi(路由器需关闭「AP 隔离 / 客户端隔离」)。
  2. 首次运行若弹 Windows 防火墙提示,选 允许(专用网络)。若未弹窗或之后搜不到设备,请点击界面「一键修复网络(扫不到时点)」,在 UAC 弹窗点“是”,然后重启软件——它会自动添加 pythonw 的入站规则并停止系统 SSDP 服务。
  3. 软件启动后,顶栏显示设备名、端口与「本机IP」下拉框,以及绿色的「自动选网」标签(显示当前选中的真实网卡名)。默认会自动排除 VPN / 虚拟网卡,选用真实 Wi-Fi/以太网网卡 IP(如 192.168.1.23)。若自动选错(极少数情况),可在「本机IP」下拉选对 IP,再点「应用并切换IP」重启服务。软件在运行时持续监控网络变化——你中途开关 VPN、切换 Wi-Fi、插拔网线导致真实网卡 IP 变动时,会自动热切换投屏服务(无需手动干预)。
  4. 手机打开视频 App 点右上角「TV / 投屏」 选择 「森投屏接收端」 视频即在电脑播放。
  5. 可改设备名(回车生效)、调音量、暂停/继续/停止,或点「自测」按钮验证播放器。

播放中的控制(双向同步)

你要的效果 怎么做
暂停 / 继续 电脑上点工具栏「暂停」「继续」,或手机上点暂停——双向同步:手机点了电脑真的停,电脑点了手机界面也会显示已暂停
全屏 点「全屏」按钮 / 双击画面 / 按 F11;按 Esc 退出(全屏时自动隐藏工具栏与日志)
拖进度条 手机上拖动进度条 SOAP Seek 电脑端真的跳转;电脑端实时把播放进度回传(手机进度条会走)
看当前画质 工具栏右侧「码流」实时显示真实分辨率/帧率/码率,如 1920x1080 · 1080P · 25 fps · 3200 kbps
画面增强 「画质」下拉:原画 / 生动 / 影院 / 锐利 / 柔和——逐帧处理(numpy:亮度·对比度·饱和度·非锐化掩蔽锐化)
音效 「音效」下拉:原声 / 杜比风格·宽阔 / 影院氛围 / 人声清晰 / 夜间·轻柔——真实作用于音量映射的增益 + 等响度补偿
争取更高码率 工具栏「清晰度策略」选「电视模式(争取1080P/4K)」:把设备型号声明为 4K 智能电视 + 在 GetProtocolInfo 声明 HD/4K 解码能力 + 立即重新宣告,诱导部分 App 推高码率

关于「调 1080P / 4K」的说明:DLNA 投屏的清晰度由手机端 App 选择的片源决定, 接收端无法凭空把 720P 变成 4K。你能做的是:① 用电视模式争取更高码率;② 在手机 App 内 手动切清晰度(投屏后 App 里通常仍有清晰度按钮);③ 用画质增强与系统解码链提升还原度。

关于杜比:Dolby Atmos / Dolby Vision 是授权技术,第三方播放器无法凭空实现其解码。 本软件提供「杜比/高清检测」按钮,如实告诉你系统装了哪些组件(HEVC / AV1 / VP9 / Dolby Access), 并给出一键启用路径。可用的方式是:系统装了 Dolby Access,在「设置 → 系统 → 声音 → 空间音效」 选 Dolby Atmos,用 系统解码 快捷方式(走 Media Foundation 原生管道)启动本软件, 系统级解码与音效增强会自动作用于播放。

自定义背景与开屏动画

工具栏「外观」里设置,配置存到 %APPDATA%/SenAICast/settings.json。

  • 开屏动画默认关闭,想用就自己开:可指定背景图(gif 会当动图播,不填则用蓝紫渐变)、 标题、副标题、停留时长,还能先「预览开屏动画」看效果。
  • 播放器背景:没播视频时显示,可选图片铺满或纯色(默认黑)。
  • 想跳过开屏启动:python main.py --no-splash。

两种方式,效果一样:

  • 软件内一键生成:界面工具栏点「创建桌面快捷方式」,会生成两个 .lnk:
    • 森投屏接收端.lnk —— 默认引擎(ffmpeg),格式覆盖广,支持 m3u8/HLS。
    • 森投屏接收端 (系统解码·杜比).lnk —— --backend windows,走系统 Media Foundation 原生管道,可调用系统 HEVC/AV1/VP9 扩展与硬件解码,系统装了 Dolby 组件时音效也自动生效。
  • 命令行生成:senai-cast-shortcut(pip 装完自带),或 python -m receiver.shortcut。

华为手机怎么投

  • App 内视频投屏(推荐,画质=源画质、延迟低):华为视频 / 腾讯视频 / B站 等 App 里点「TV/投屏」 选「森投屏接收端」,走 DLNA,已兼容。
  • 屏幕镜像(把整个手机画面投到电脑):点界面「打开无线显示(华为镜像/Miracast)」 在设置页安装“无线显示”可选功能、设为“随处可用”, 再打开“无线显示”应用等待连接 华为手机下拉菜单点「无线投屏 / 多屏协同」选本机即可(系统级 Miracast)。

自测 / 验证

  • 点界面「自测」:用一段公开测试视频验证本地解码与播放正常。
  • 用安卓 UPnP Browser 等工具扫描局域网,应能看到本设备(MediaRenderer)。
  • 本仓库附 5 套回归测试,可在无界面环境下验证:
脚本 验证内容
test_headless.py DLNA 内核:device.xml、SOAP 控制、播放回调
test_upnp_compat.py 按真实视频 App 流程模拟(拉 SCPD / GetProtocolInfo / SetAVTransportURIPlay)
test_upnp2_compat.py 针对 Dart/upnp2 系控制点的状态机(三态、RelTime、GENA <TransportState>,含非 Dart 对照)
test_doublebind.py 双绑监听对照实验(证明"先关旧栈再建新栈"修复有效)
test_airplay.py AirPlay /server-info、/info、/play、/stop
python test_control.py

命令行参数

python main.py --name 我的电脑 --port 8200 --no-airplay --backend windows
  • --name 设备显示名
  • --port HTTP 控制端口(默认 8200)
  • --no-airplay 关闭 AirPlay 被发现
  • --backend 播放引擎:ffmpeg(默认,格式广含 m3u8/HLS)/ windows(Media Foundation 原生管道,可调用系统 HEVC / 杜比视界扩展与硬件解码)。必须在 QApplication 创建前设置, 已在 main.py 中于启动前写入环境变量。

目录结构

cast-receiver/
├── main.py                 # 入口
├── requirements.txt
├── receiver/
│   ├── config.py           # IP / 端口配置(自动排除 VPN/虚拟网卡选真实网卡)
│   ├── netwatch.py        # 运行时网络监控(自动检测 VPN/网卡变化并热切换 IP)
│   ├── firewall.py         # Windows 防火墙规则检测
│   ├── player.py           # DLNA 事件  GUI 信号桥接(含 seek 信号)
│   ├── player_widget.py    # Qt6 Multimedia 播放器(画质增强 / 音效 / 进度 / 全屏信号)
│   ├── dolby.py            # 系统杜比 / HEVC·AV1·VP9 扩展检测与启用引导
│   ├── gui.py              # PyQt6 主窗口(工具栏 / 全屏 / 状态同步 / 日志)
│   ├── shortcut.py         # 桌面 .lnk 生成(无 COM,支持 --backend windows 变体)
│   ├── dlna/
│   │   ├── device.py       # UPnP 设备描述 XML
│   │   ├── ssdp.py         # SSDP 发现(NOTIFY + 响应 M-SEARCH)
│   │   ├── services.py     # AVTransport/RenderingControl/ConnectionManager 状态机
│   │   └── server.py       # HTTP 控制服务 + DlnaStack 封装
│   └── airplay/
│       ├── mdns.py         # AirPlay mDNS 被发现
│       └── server.py       # AirPlay 视频控制 HTTP 服务 (/play 等)
└── assets/
    └── icon.ico            # 应用图标(多尺寸,快捷方式与窗口共用)

依赖的开源项目致谢

本软件构建在以下开源项目之上(许可证见各自仓库):

项目 用途 许可证
PyQt6 / Qt 6 GUI 框架 + Qt6 Multimedia 播放(QMediaPlayer + QVideoWidget,双后端 FFmpeg / Media Foundation) LGPL / GPL / 商业
FFmpeg Qt 媒体后端 ffmpegmediaplugin.dll,负责解码与 m3u8/HLS 拉流 LGPL/GPL
NumPy 帧级画质增强(锐化 / 对比度 / 去色偏) BSD-3
qrcode + Pillow 「手机连通性自检」页生成二维码 BSD / MIT
pylnk3 纯 Python 生成 Windows .lnk(桌面快捷方式,不走 COM) MIT
cryptography AirPlay legacy RSA 配对握手的加密原语 Apache-2.0
PyInstaller 打包为单文件 .exe GPL
Python 解释器与标准库 PSF

各库的完整许可证文本随包分发于你的 site-packages(或解压后的 dist 内),本仓库 LICENSE 为 MIT(仅约束本仓库自身代码)。若分发商业产品,请自行核对 Qt 的 LGPL/商业双许可与 PyInstaller 的 GPL 义务。

Metadata

Release files for senai-cast-receiver 1.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for senai-cast-receiver 1.1.1
File Size Uploaded
senai_cast_receiver-1.1.1.tar.gz 1.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for senai-cast-receiver 1.1.1
File Interpreter ABI Platform
senai_cast_receiver-1.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 2.6 MB

Release files / senai_cast_receiver-1.1.1.tar.gz

Download URL senai_cast_receiver-1.1.1.tar.gz
Size 1.3 MB
Tags Source
SHA-256 checksum
How to use checksums
4b9e93ac718ac742c47926830772b0640702fc05f55f0e24ae91ea47aa969aa4
BLAKE2b-256 checksum
How to use checksums
5160eda7056fe92eacb8f22d19472f9632fc12cf1985d92e6cc75cdc8e297bdf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / senai_cast_receiver-1.1.1-py3-none-any.whl

Download URL senai_cast_receiver-1.1.1-py3-none-any.whl
Size 1.3 MB
Tags Python 3
SHA-256 checksum
How to use checksums
be284afe53b952dcdb8062f82a2243f34da5061109ddc3fb89efe6a8c2a0bed8
BLAKE2b-256 checksum
How to use checksums
029b0e576a3f56de26c8d76c011b987c957d36f8516cd441282d3531ca767664
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

1.2.0

2 release files

This release

1.1.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page