escrcpy 视频参数完全指南:从尺寸码率到方向裁剪的 scrcpy 视频链路调优
【免费下载链接】escrcpy📱 Display and control your Android device graphically with scrcpy.项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy
导读:scrcpy 镜像链路的视频参数,直接决定了投屏的分辨率、流畅度、延迟与编码开销。本文以 escrcpy(基于 scrcpy 的 Android 图形化投屏工具)为背景,系统梳理 scrcpy 视频链路的全部核心参数——从视频源选择、
--max-size、码率、帧率、编解码器与编码器,到方向、角度、裁剪、多显示、缓冲与播放控制,并对照 escrcpy 的偏好模型源码与 scrcpy 中间件实现,讲清每个参数在命令行和图形界面中的落点。读完本文,你将能按场景(低延迟游戏、高画质录屏、摄像头采集、V4L2 虚拟摄像头输出)组合出正确的视频参数,并能在 escrcpy 的"视频"偏好面板中定位到对应设置项。
视频源(Source):屏幕镜像还是摄像头采集
默认情况下,scrcpy 镜像的是 Android 设备屏幕。视频链路的源头既可以是 display(屏幕),也可以是设备摄像头(camera)。
# 默认:镜像设备屏幕 scrcpy # 显式指定视频源为屏幕 scrcpy --video-source=display # 改用摄像头作为视频源 scrcpy --video-source=camera摄像头采集的完整能力(--camera-id、分辨率、fps、zoom 等)在专门的 camera 页面展开,本文聚焦屏幕镜像这条主链路。
在 escrcpy 中,视频源对应 video 偏好模型 中的videoSource字段,其选项就是display与camera。escrcpy 的摄像头录屏动作会通过 useRecordAction 自动追加--video-source=camera参数,因此摄像头采集在图形界面中体现为"摄像头录屏"这一独立入口。
尺寸(Size):用 --max-size 限制最大分辨率
默认情况下,scrcpy 尝试以 Android 设备的原始分辨率进行镜像。降低分辨率可以显著减轻编码与传输压力、提升流畅度,适合性能较弱的设备或带宽受限的网络:
scrcpy --max-size=1024 scrcpy -m 1024 # 短选项写法注意--max-size限制的是宽与高两个维度的最大值,另一个维度会按设备原始宽高比自动计算,因此 1920×1080 的设备以--max-size=1024镜像时会得到 1024×576。
两个值得注意的行为:
- 编码失败自动降级:如果当前分辨率下编码失败,scrcpy 会自动以更低分辨率重试,除非显式传入
--no-downsize-on-error禁用该行为。 - 摄像头模式下语义不同:对摄像头镜像而言,
--max-size不再是"缩放后的目标尺寸",而是在摄像头支持的可用分辨率中选择视频源尺寸。从 escrcpy 的 camera 解析器 可以看到,摄像头信息会解析出每个camera-id对应的分辨率与 fps 列表,--max-size正是在这些候选中做源尺寸选择。
码率(Bit rate):默认 8 Mbps
视频码率决定压缩质量与网络/存储开销之间的平衡。默认视频码率为8 Mbps,可通过--video-bit-rate修改:
scrcpy --video-bit-rate=2M scrcpy --video-bit-rate=2000000 # 与上一条等价 scrcpy -b 2M # 短选项写法在 escrcpy 中,该参数对应 video 偏好模型 的videoBitRate字段(--video-bit-rate,Input 输入框,单位为 bps)。码率值越大画面越清晰、但占用带宽越高;在局域网内追求画质可以调高,在公网或弱网环境则应适当下调。
帧率(Frame rate):限制与统计
可以通过--max-fps限制采集帧率,常用于降低编码开销或适配网络带宽:
scrcpy --max-fps=15- 实际采集帧率可以通过
scrcpy --print-fps打印到控制台; - 运行时也可以随时用快捷键MOD+i开关帧率显示(快捷键体系见 shortcuts);
- 帧率本质上是变量的:只有当屏幕内容发生变化时才会产生新帧。例如设备上播放 24fps 的全屏视频时,scrcpy 中不会出现超过每秒 24 帧的画面。
escrcpy 的 video 偏好模型 提供了maxFps字段(--max-fps,InputNumber,单位 fps),在"视频"偏好面板中可直接配置。
编解码器(Codec):h264 / h265 / av1
视频编码格式可通过--video-codec选择,可选值为h264(默认)、h265、av1:
scrcpy --video-codec=h264 # 默认 scrcpy --video-codec=h265 scrcpy --video-codec=av1选型建议:
- H265:同码率下画质更好,适合追求画质/码率比的场景;
- H264:延迟更低,硬件兼容性最好,是低延迟场景的默认选择;
- AV1:当前 Android 设备上编码器并不普及,选择需谨慎。
对于高级用法,可通过--video-codec-options向 Android 的 [MediaFormat] 传递任意参数,具体可查阅scrcpy --help或 manpage。
在 escrcpy 中,--video-codec被封装为"视频编码器组合"选择器(见 video 偏好模型 的videoCode字段),内置了h264 & OMX.qcom.video.encoder.avc、h264 & c2.android.avc.encoder、h265 & OMX.qcom.video.encoder.hevc等常用"编解码器 + 具体编码器"组合;用户选择后会同时拆分为--video-codec与--video-encoder两个参数写入偏好(见 select-video-codec)。
编码器(Encoder):列出并切换设备端编码器
Android 设备上可能同时存在多个可用的编码器,可以用--list-encoders列出:
scrcpy --list-encoders当默认编码器出现问题甚至崩溃时,可以显式指定其他编码器:
scrcpy --video-codec=h264 --video-encoder=OMX.qcom.video.encoder.avcescrcpy 的 scrcpy 中间件(desktop/electron/middleware/scrcpy/index.js)实现了getEncoders(),内部正是执行scrcpy --serial=<serial> --list-encoders,再用 parseScrcpyCodecList 解析输出中的--video-codec=xxx --video-encoder=xxx行,得到{ video: [...], audio: [...] }结构化列表。在偏好面板中选择"视频编码器"时,select-video-codec 会实时调用该接口拉取当前设备真实可用的编码器组合作为下拉选项——这就是图形界面中"编码器列表来自真机"的实现原理。
方向(Orientation):三级旋转体系
方向处理分三个层次,各管一段:
- 快捷键请求:MOD+r请求设备切换横竖屏(当前运行的 App 若不支持该方向,可能拒绝);
--capture-orientation:改变镜像方向,作用于设备端发送到电脑的视频流,因此会影响录屏;--orientation:在客户端应用,影响显示与录屏;显示方向可通过快捷键动态切换。
采集侧方向(--capture-orientation)
scrcpy --capture-orientation=0 scrcpy --capture-orientation=90 # 顺时针 90° scrcpy --capture-orientation=180 # 180° scrcpy --capture-orientation=270 # 顺时针 270° scrcpy --capture-orientation=flip0 # 水平翻转 scrcpy --capture-orientation=flip90 # 水平翻转 + 顺时针 90° scrcpy --capture-orientation=flip180 # 水平翻转 + 180° scrcpy --capture-orientation=flip270 # 水平翻转 + 顺时针 270°采集方向可以用@锁定,使物理设备的旋转不再改变采集视频的方向:
scrcpy --capture-orientation=@ # 锁定为初始方向 scrcpy --capture-orientation=@0 # 锁定为 0° scrcpy --capture-orientation=@90 # 锁定为顺时针 90° scrcpy --capture-orientation=@180 # 锁定为 180° scrcpy --capture-orientation=@270 # 锁定为顺时针 270° scrcpy --capture-orientation=@flip0 # 锁定为水平翻转 scrcpy --capture-orientation=@flip90 # 锁定为水平翻转 + 顺时针 90° scrcpy --capture-orientation=@flip180 # 锁定为水平翻转 + 180° scrcpy --capture-orientation=@flip270 # 锁定为水平翻转 + 顺时针 270°客户端方向(--orientation)
scrcpy --orientation=0 scrcpy --orientation=90 # 顺时针 90° scrcpy --orientation=180 # 180° scrcpy --orientation=270 # 顺时针 270° scrcpy --orientation=flip0 # 水平翻转 scrcpy --orientation=flip90 # 水平翻转 + 顺时针 90° scrcpy --orientation=flip180 # 垂直翻转(水平翻转 + 180°) scrcpy --orientation=flip270 # 水平翻转 + 顺时针 270°方向可以针对显示与录屏分别设置,即--display-orientation与--record-orientation:
# 显示保持原始方向,录屏旋转 90° scrcpy --display-orientation=0 --record-orientation=90需要特别注意的是:录屏文件的方向是通过向 MP4/MKV 目标文件写入显示变换信息(display transformation)实现的,而翻转(flip)操作不被容器支持,因此录制时只允许 4 个前值(0/90/180/270)。
在 escrcpy 中,显示方向对应 video 偏好模型 的displayOrientation字段(--display-orientation,Select,含 0°/90°/180°/270° 与 flip0~flip270);录屏方向则对应 record 偏好模型 的recordOrientation字段(--record-orientation,Select,仅 4 个非翻转值)——与"录制仅支持旋转、不支持翻转"的限制完全一致。
变换顺序
视频链路上的变换顺序为:--crop→--capture-orientation→--angle。
角度(Angle):任意角度旋转
除 90° 整倍数外,还可以用--angle按顺时针方向旋转任意角度:
scrcpy --angle=23旋转中心为可视区域的中心。该变换在--crop与--capture-orientation之后应用。escrcpy 的 video 偏好模型 提供了angle字段(--angle,InputNumber,单位 deg),可在偏好面板中直接填写任意角度。
裁剪(Crop):只镜像屏幕的一部分
--crop可以裁剪屏幕,只镜像其中一部分。典型场景如只镜像 Oculus Go 的单眼画面:
scrcpy --crop=1224:1440:0:0 # 1224x1440,起点偏移 (0,0)参数格式为宽:高:x偏移:y偏移,且以设备的自然方向为坐标基准(手机为竖屏方向,平板为横屏方向)。裁剪在--capture-orientation与--angle之前执行。
关于与--max-size的配合顺序:
- 屏幕镜像:
--max-size在裁剪之后应用(先裁后缩放); - 摄像头:
--max-size在裁剪之前生效(因为它是选择源尺寸,而非缩放内容)。
escrcpy 的 video 偏好模型 提供了crop字段(--crop,Input),可直接填写裁剪矩形。
多显示(Display):选择要镜像的显示器
如果 Android 设备存在多个显示输出,可以指定镜像哪一个:
scrcpy --display-id=1可用显示 ID 列表通过以下命令获取:
scrcpy --list-displays两个限制条件:
- 副屏控制需要 Android 10+:若设备系统低于 Android 10,副屏只能以只读方式镜像(无法交互控制);
- 也可以通过 virtual_display 创建虚拟显示。
escrcpy 通过 scrcpy 中间件的 getDisplayIds() 执行scrcpy --serial=<serial> --list-displays,并由 parseDisplayIds 用正则/--display-id=(\d+)/g提取并去重排序所有显示 ID;偏好模型中的displayId字段(video 偏好模型)即为--display-id,使用支持动态加载真机显示列表的DisplaySelect组件。
缓冲(Buffering):以延迟换平滑
默认情况下 scrcpy不进行视频缓冲,以追求最低延迟。缓冲的引入会延迟视频流,以补偿网络抖动(jitter),换取更平滑的播放体验。配置项对显示、V4L2 sink 与音频播放相互独立:
scrcpy --video-buffer=50 # 视频播放增加 50ms 缓冲 scrcpy --audio-buffer=200 # 音频播放设置 200ms 缓冲 scrcpy --v4l2-buffer=300 # v4l2 sink 增加 300ms 缓冲也可以同时应用多个缓冲:
scrcpy --video-buffer=50 --v4l2-buffer=300音频缓冲细节见 audio 文档的 Buffering 一节,V4L2 缓冲细节见 v4l2 文档。escrcpy 的 video 偏好模型 提供了videoBuffer(--video-buffer,单位 ms)与v4l2Buffer(--v4l2-buffer,单位 ms)两个字段,音频缓冲则由音频偏好模型管理。
无播放(No playback):只采集不播放
在只录屏或启用 V4L2 输出时,常常不需要在电脑上播放音视频:
scrcpy --v4l2-sink=/dev/video2 --no-playback scrcpy --record=file.mkv --no-playback # 用 Ctrl+C 中断也可以分别禁用视频与音频播放:
# 视频送 V4L2 sink 但不播放,同时保留音频播放 scrcpy --v4l2-sink=/dev/video2 --no-video-playback # 同时录制音视频,但只播放视频 scrcpy --record=file.mkv --no-audio-playbackescrcpy 的 record 偏好模型 提供了noVideoPlayback(--no-video-playback,Switch)与noAudioPlayback(--no-audio-playback,Switch)两个开关,对应录屏场景下的"只录不播"需求。
无视频(No video):仅转发音频
彻底关闭视频转发、只保留音频通道:
scrcpy --no-video典型用途包括:纯音频录屏(--no-video --record=file.opus)、辅助命令执行等。escrcpy 的 video 偏好模型 提供了noVideo字段(--no-video,Switch);值得注意的是,scrcpy 中间件的helper()方法(desktop/electron/middleware/scrcpy/index.js)在后台执行应用列表等辅助命令时会强制附带--no-window --no-video --no-audio,以完全静默地完成设备端查询。
Video4Linux:把视频导出为虚拟摄像头
如果需要把 Android 画面导出为 Linux 下的 V4L2 虚拟摄像头设备,请参阅专门的 Video4Linux 文档,其中包含--v4l2-sink与--v4l2-buffer的完整用法。
在 escrcpy 中管理这些参数:从界面到命令行
理解上述参数后,在 escrcpy 中管理视频配置遵循一条清晰的链路:
- 偏好模型即参数字典:desktop/src/models/preference/video/index.js 把每个参数声明为字段,
field就是 scrcpy 命令行参数本身(如--max-size、--video-bit-rate),type决定界面控件(InputNumber / Select / Switch / 自定义组件)。 - 全局与设备级作用域:偏好数据按
global与设备维度存储,读取时通过 mergePreferenceConfig 将设备级配置与全局配置合并,未设置的字段回退到全局默认值;scrcpyParameter 在生成命令行时过滤掉null/undefined/''/false等未设置值与开关关闭项。 - 进程实际执行:生成的参数字符串最终交给 createScrcpyProcess,以
scrcpy --serial="<serial>" --window-title="<title>" <args>的形式经 shell 启动镜像或录屏进程,并通过--record实现录屏、通过 readyPattern 等待 scrcpy 就绪。 - 追加自定义参数:偏好面板的"通用"分组中还有
scrcpyAppend字段(common 偏好模型),允许向每次生成的 scrcpy 命令尾部追加任意自定义参数(如--video-codec-options=...),用于覆盖模型尚未覆盖的高级选项。
总结
scrcpy 视频链路的核心调优点可以归纳为一张速查表:
| 目标 | 参数 | 典型值 |
|---|---|---|
| 降低分辨率提升性能 | --max-size/-m | 1024 |
| 控制码率 | --video-bit-rate/-b | 2M、8M |
| 限制采集帧率 | --max-fps | 15 |
| 切换编码格式 | --video-codec | h264/h265/av1 |
| 更换具体编码器 | --video-encoder | OMX.qcom.video.encoder.avc |
| 采集侧旋转/翻转 | --capture-orientation | 90、@90、flip0 |
| 客户端旋转/翻转 | --orientation | 180、flip90 |
| 任意角度旋转 | --angle | 23 |
| 裁剪局部画面 | --crop | 1224:1440:0:0 |
| 选择副屏镜像 | --display-id | 1 |
| 增加缓冲换取平滑 | --video-buffer/--audio-buffer/--v4l2-buffer | 50/200/300(ms) |
| 只采集不播放 | --no-playback/--no-video-playback/--no-audio-playback | — |
| 仅转发音频 | --no-video | — |
这些参数既可全部在命令行直接使用,也可以在 escrcpy 的偏好设置中以图形化方式配置,二者共用同一套参数语义。结合本文梳理的变换顺序(--crop→--capture-orientation→--angle)与"录制不支持翻转"等边界约束,即可按需搭建出低延迟、高画质或纯录制的视频链路方案。
【免费下载链接】escrcpy📱 Display and control your Android device graphically with scrcpy.项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考