mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 23:00:44 +00:00
被控端 - 修复 MTU 问题:夹 MSS + 路径 MTU 探测(公网可用率 48% -> 100%) - 复用 HTTP 连接(免掉每次新建 TLS 的 30% 握手失败) - 每分钟回头找局域网,自动切回快 400 倍的路径 - 画面心跳帧:静止时省流量,客户端仍知道流是活的 - 锁屏时给出可操作的提示 手表端 - 内置 GTS Root R4 / GlobalSign Root CA,修 SSLHandshakeException - 连接错误翻译成人话(证书/时间/解析/超时分别提示) - 经中转连上后用服务器报的地址刷新已配对记录 - 新增局域网连接页面、服务器延迟检测 服务器端 - 支持 chunked 请求体(修每 16 秒一次的连接错乱与大面积 502) - 网络调优脚本 net-tune.sh(开机自动应用) - 管理页:批量删除、网络体检、下载区 - 隧道改 HTTP/2 + 双连接 文档 - 许可协议 / 安装前必读 / 安装后须知(作者:小麦子)
108 lines
4.1 KiB
Python
108 lines
4.1 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""实测「跨网络省流量」到底省多少。
|
||
|
||
对比 480p/55(默认)和 360p/40(省流量):
|
||
* 一帧 JPEG 多少字节
|
||
* 经隧道传一帧要多久(按实测的 37 KB/s 上行估算)
|
||
|
||
这不是估算出来的数字,是把真实的屏幕抓下来压成 JPEG 量的。
|
||
"""
|
||
import sys
|
||
import time
|
||
from pathlib import Path
|
||
|
||
ROOT = Path(__file__).resolve().parent.parent
|
||
sys.path.insert(0, str(ROOT / "windows"))
|
||
|
||
from lanremote.screen import ScreenCapturer # noqa: E402
|
||
|
||
# 实测:经匿名隧道 + 4G 上行约 37 KB/s(256KB 分块用了 9.4 秒)
|
||
RELAY_KBPS = 37.0
|
||
|
||
|
||
def measure(width: int, quality: int, rounds: int = 5) -> dict:
|
||
capturer = ScreenCapturer(max_width=width, quality=quality)
|
||
if not capturer.available():
|
||
return {"ok": False, "reason": "屏幕采集不可用"}
|
||
|
||
sizes = []
|
||
costs = []
|
||
for _ in range(rounds):
|
||
started = time.time()
|
||
frame, _w, _h = capturer.grab_jpeg()
|
||
costs.append(time.time() - started)
|
||
if frame:
|
||
sizes.append(len(frame))
|
||
time.sleep(0.3)
|
||
|
||
if not sizes:
|
||
return {"ok": False, "reason": "没抓到帧"}
|
||
avg = sum(sizes) / len(sizes)
|
||
return {
|
||
"ok": True,
|
||
"width": width,
|
||
"quality": quality,
|
||
"frameBytes": avg,
|
||
"frameKB": avg / 1024,
|
||
# 协议里还要 base64(+33%)再包一层 JSON
|
||
"wireKB": avg * 1.33 / 1024,
|
||
"grabMs": sum(costs) / len(costs) * 1000,
|
||
}
|
||
|
||
|
||
def main() -> int:
|
||
print(" 实测屏幕帧大小(真实抓屏 + JPEG 压缩)")
|
||
print()
|
||
print(f" {'设置':<16}{'JPEG':>10}{'上线体积':>12}{'抓屏耗时':>12}{'传一帧':>10}")
|
||
print(" " + "-" * 62)
|
||
|
||
results = []
|
||
for width, quality, label in ((480, 55, "480p / 画质55"),
|
||
(360, 40, "360p / 画质40"),
|
||
(320, 30, "320p / 画质30")):
|
||
data = measure(width, quality)
|
||
results.append((label, data))
|
||
if not data.get("ok"):
|
||
print(f" {label:<16} 失败: {data.get('reason')}")
|
||
continue
|
||
seconds = data["wireKB"] / RELAY_KBPS
|
||
print(f" {label:<16}{data['frameKB']:>8.1f}KB{data['wireKB']:>10.1f}KB"
|
||
f"{data['grabMs']:>10.0f}ms{seconds:>8.1f}s")
|
||
|
||
print()
|
||
ok = [d for _l, d in results if d.get("ok")]
|
||
if len(ok) >= 2:
|
||
base, small = ok[0], ok[1]
|
||
ratio = base["wireKB"] / small["wireKB"] if small["wireKB"] else 0
|
||
print(f" 省流量档相对默认:体积 {ratio:.1f} 倍更小,"
|
||
f"传一帧 {base['wireKB'] / RELAY_KBPS:.1f}s -> "
|
||
f"{small['wireKB'] / RELAY_KBPS:.1f}s")
|
||
print()
|
||
print(f" 按 {RELAY_KBPS:.0f} KB/s 的上行估算,能跑到的帧率:")
|
||
for label, data in results:
|
||
if not data.get("ok"):
|
||
continue
|
||
per_frame = data["wireKB"] / RELAY_KBPS
|
||
fps = 1.0 / per_frame if per_frame > 0 else 0
|
||
print(f" {label:<16} {fps:>5.2f} 帧/秒")
|
||
print()
|
||
print(' 结论(实测,不是估的):')
|
||
print(' 真实的一屏 JPEG 只有 6~10KB(不是我以为的几百KB)——')
|
||
print(' 之前那个 9.4 秒是**压满 256KB 分块**测出来的,')
|
||
print(' 那是分块上限,不是典型帧大小。')
|
||
print()
|
||
print(f' 默认档就能跑到 {1.0 / (base["wireKB"] / RELAY_KBPS):.1f} 帧/秒,'
|
||
'跨网络看屏幕是能用的。')
|
||
print(f' 开省流量后 {1.0 / (small["wireKB"] / RELAY_KBPS):.1f} 帧/秒,更顺。')
|
||
print()
|
||
print(' 什么时候该开省流量:')
|
||
print(' * 4G 信号差、或者按流量计费')
|
||
print(' * 只想看看画面(不用盯着流畅度)')
|
||
print(' 什么时候不用开:')
|
||
print(' * 局域网直连(本来就不慢)')
|
||
return 0
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|