capturedsurfacecontrol 不适用于 html5 录屏,因其是 android 原生 sdk 类,无法在浏览器沙箱中调用;web 端需用 getdisplaymedia + canvas 缩放模拟静默缩放,或改用原生 android 方案。

HTML5 本身不提供 CapturedSurfaceControl 这个 API,它并非标准 Web API,而是 Android 平台(特别是 Android 12+)中用于媒体投影(MediaProjection)和屏幕捕获的原生系统类,属于 Java/Kotlin 层面的 Android SDK 组件,**无法直接在 HTML5 或浏览器环境中调用**。
为什么 CapturedSurfaceControl 不适用于 HTML5 录屏
CapturedSurfaceControl 是 Android 框架中用于精细控制捕获表面(如缩放、裁剪、旋转)的底层类,仅在拥有 MediaProjection 权限且运行于 Android 原生应用(非 WebView 或 PWA)时可用。浏览器环境受安全沙箱限制,无法访问此类系统级 Surface 控制能力。
Web 平台录屏依赖标准 Web API:
-
getDisplayMedia():获取屏幕/窗口媒体流(MediaStream) -
MediaRecorder:录制该流为视频文件 -
CanvasRenderingContext2D或OffscreenCanvas:若需前端处理(如缩放),只能通过绘制+重采样实现
在 Web 端实现“静默缩放”的可行方案
所谓“静默缩放”,通常指在不改变用户可见界面的前提下,对录屏内容进行裁剪或缩放输出。Web 中无法直接控制捕获源的物理 Surface,但可通过以下方式模拟效果:
-
使用 Canvas 绘制并缩放帧:将
getDisplayMedia获取的视频流绑定到<video></video>元素,再将其逐帧绘制到<canvas></canvas>上,按需缩放/裁剪,最后用captureStream()创建新流用于录制 -
设置 captureStream 的分辨率参数:部分浏览器支持在
canvas.captureStream(fps)后,通过MediaStreamTrack.getSettings()查看实际输出尺寸,但不能主动设定缩放——需靠 canvas 自身宽高控制输出比例 - 服务端转码(非实时):录制原始全屏视频后,在服务端用 FFmpeg 裁剪缩放,适合对实时性无要求的场景
关键注意事项
所有前端缩放操作都会带来性能开销和画质损失:
- Canvas 绘制 +
requestVideoFrameCallback(推荐)比setInterval更精准高效 - 缩放后分辨率下降可能导致文字/图标模糊,建议保持整数倍缩放(如 0.75x、0.5x)并启用
imageSmoothingEnabled = false防锯齿失真 - Android WebView 对
getDisplayMedia支持有限,需 Target SDK ≥ 30 且用户授权“屏幕录制”权限,仍无法访问CapturedSurfaceControl
替代建议:原生 Android 应用开发
若必须使用 CapturedSurfaceControl 实现硬件级静默缩放(如等比裁剪、动态 ROI 缩放),应放弃纯 Web 方案,改用:
- Android Jetpack Compose + MediaProjection +
CapturedSurfaceControl.setScalingBehavior() - 通过
CapturedSurfaceControl.setSourceRect()设置捕获区域,实现“静默裁剪” - 将处理后的 Surface 输出至
MediaCodec编码,绕过 Web 层限制
该路径完全脱离 HTML5,但能真正实现系统级静默控制。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











