4.视频流高级配置
scrcpy 的默认设置已经能满足大部分日常需求,但当我们面对不同场景——比如低性能电脑、远程网络传输、专业录制或特殊设备时,视频流的配置就成了关键。这一章深入探讨如何精细调整视频参数,让画面在清晰度、流畅度和延迟之间找到最佳平衡点。
视频源与分辨率设置
默认情况下,scrcpy 会镜像 Android 设备的整个屏幕,并尽可能保持原始分辨率。一部 1920×1080 的手机,传输到电脑上的画面也是 1920×1080。这种一对一的映射在概念上很直接,但未必总是最优选择。
限制分辨率提升性能
高分辨率意味着更多的像素数据需要编码、传输和解码。如果电脑性能有限,或者网络带宽不足,直接传输原始分辨率会导致明显的卡顿和延迟。这时候,降低分辨率是最有效的优化手段。
scrcpy 提供了 --max-size 参数来限制视频的最大宽度和高度。设置这个参数后,scrcpy 会按比例缩放视频,确保最长边不超过指定值,同时保持设备的原始宽高比。
scrcpy --max-size=1024
scrcpy -m 1024 # 简短版本
执行这条命令后,1920×1080 的设备会被缩放到 1024×576。这个操作在设备端完成,传输到电脑的数据量大幅减少,解码压力也随之降低。对于配置较老的电脑,或者需要在同一台机器上同时运行多个 scrcpy 实例的场景,这个技巧尤其有用。
README 中明确提到,降低分辨率可能极大提升性能。在实际测试中,将分辨率从 1920 降到 1024,CPU 占用率下降 30% 到 50% 是常见现象。如果编码过程出错,scrcpy 会自动尝试更低的分辨率重试,除非显式禁用了这个行为。
摄像头作为视频源
除了屏幕,scrcpy 还能捕获设备摄像头画面。这在需要展示实物、进行视频会议或移动直播时非常方便。不过,摄像头配置的详细内容属于第 13 章的范畴,这里只需知道基本概念。
使用 --video-source=camera 可以切换源,配合 --camera-size 指定分辨率。对于摄像头, --max-size 的行为略有不同——它用于从设备支持的摄像头分辨率列表中选择最接近的选项,而不是缩放已捕获的画面。
帧率与码率优化
分辨率和帧率、码率共同决定了视频质量。三者之间需要权衡:降低任何一项都能减轻系统负担,但过度压缩会损害观感。
帧率控制
Android 屏幕内容的帧率是动态的。当屏幕静止时,不会生成新帧;当播放视频或游戏时,帧率会上升。scrcpy 默认会捕获所有变化,但我们可以通过 --max-fps 设置上限。
scrcpy --max-fps=15
这个参数限制的是捕获帧率,而非输出帧率。如果设备屏幕以 60fps 播放视频,但设置了 --max-fps=15,scrcpy 会每隔几帧捕获一次,最终输出约 15fps 的视频。对于演示文稿、文档编辑等低动态场景,15fps 完全够用,能显著降低资源消耗。
要实时监控实际帧率,可以启用打印功能:
scrcpy --print-fps
运行后,控制台会定期显示当前 FPS。这个开关也能在运行时通过快捷键 MOD+i 切换,方便观察不同操作下的帧率变化。
码率调整
视频码率决定了每秒传输的数据量,单位是比特。scrcpy 默认使用 8 Mbps,在大多数情况下这是个合理的默认值。但在低带宽环境或需要极致性能时,可以调整。
scrcpy --video-bit-rate=2M
scrcpy --video-bit-rate=2000000 # 等价的长格式
scrcpy -b 2M # 简短版本
将码率从 8M 降到 2M,视频文件体积会大幅缩小,网络传输更流畅,但画面细节会有所损失,特别是在快速运动的场景中会出现更多压缩 artifacts。2M 码率适合局域网无线投屏,而 8M 或更高则适合本地录制或高性能有线连接。
需要注意的是,码率和分辨率相互影响。1024×576 的画面用 2M 码率可能看起来不错,但 1920×1080 用同样码率就会明显模糊。因此,调整时建议同时考虑这两个参数。
编码器选择与性能调优
编码器是视频压缩的核心。不同的编码器在压缩效率、延迟和兼容性上有巨大差异。scrcpy 支持 H.264、H.265 和 AV1 三种主流编码格式。
编码器格式选择
默认使用 H.264,这是最通用的格式,几乎所有设备都支持,延迟也相对较低。H.265(也叫 HEVC)是新一代标准,同等画质下码率可以更低,但编码和解码需要更多计算资源,且部分老旧设备可能不支持。
scrcpy --video-codec=h264 # 默认
scrcpy --video-codec=h265 # 更高压缩率
scrcpy --video-codec=av1 # 实验性,支持设备少
README 中的使用示例展示了 H.265 的优势:在限制分辨率 1920、帧率 60fps 的情况下,H.265 能提供更好的画质。但官方文档也指出,H.264 通常延迟更低。对于游戏操控或实时交互,延迟比画质更重要,此时 H.264 是更安全的选择。AV1 目前支持度最低,除非明确知道设备兼容,否则不建议在生产环境使用。
指定具体编码器实现
同一编码格式可能有多个实现。比如 H.264 在骁龙设备上可能是 OMX.qcom.video.encoder.avc,在三星设备上是 OMX.Exynos.avc.enc。不同实现的性能和稳定性差异很大。
列出设备上所有可用的视频编码器:
scrcpy --list-encoders
输出会显示每个编码器支持的格式。如果默认编码器出现问题——比如崩溃、花屏或延迟异常——可以尝试手动指定另一个。
scrcpy --video-codec=h264 --video-encoder=OMX.qcom.video.encoder.avc
这个技巧在调试兼容性问题时非常有用。某些设备的默认软件编码器性能极差,切换到硬件编码器后帧率能提升数倍。
高级编码选项
对于专业用户,scrcpy 允许通过 --video-codec-options 传递任意参数给 Android 的 MediaFormat API。这可以微调编码器的底层行为,比如关键帧间隔、色彩空间等。具体参数取决于设备和编码器实现,需要查阅 Android 官方文档。
画面旋转与裁剪
屏幕方向处理是投屏中常见的痛点。scrcpy 提供了多层次的旋转控制,理解它们的区别是正确配置的前提。
三层旋转机制
scrcpy 的旋转发生在三个不同层面,按处理顺序依次是:
- 裁剪(Crop):在设备原始坐标系下截取屏幕区域
- 捕获方向(Capture Orientation):设备发送视频流前的旋转
- 客户端方向(Orientation):电脑显示时的旋转
这种分层设计提供了极大灵活性,但也增加了理解成本。
捕获方向控制
捕获方向影响设备编码前的画面方向,同时会写入录制文件。使用 --capture-orientation 可以强制指定方向:
scrcpy --capture-orientation=90 # 顺时针旋转 90 度
scrcpy --capture-orientation=180 # 旋转 180 度
scrcpy --capture-orientation=270 # 顺时针旋转 270 度
更复杂的是翻转组合:flip0 表示水平翻转,flip90 表示水平翻转后再顺时针旋转 90 度,以此类推。这在处理特殊设备(如 VR 眼镜)时有用。
如果希望方向固定,不受设备物理旋转影响,可以在值前加 @:
scrcpy --capture-orientation=@90 # 锁定为 90 度
这在录制教程时特别实用,避免因为不小心转动手机导致画面方向乱跳。
客户端方向控制
--orientation 参数控制的是电脑端的显示方向,不影响设备端编码和录制文件。它可以在运行时通过快捷键动态调整。
scrcpy --orientation=90
如果想分别控制显示和录制的方向,可以使用 --display-orientation 和 --record-orientation。录制时只允许 0、90、180、270 四个值,不支持翻转,因为 MP4/MKV 格式不支持写入翻转信息。
自定义旋转角度
除了 90 度的整数倍旋转,scrcpy 还支持任意角度旋转,通过 --angle 参数实现:
scrcpy --angle=23
旋转中心是画面中心。这个变换在裁剪和捕获方向之后应用,适合需要微调画面角度的场景,比如纠正投影仪的梯形失真。
画面裁剪
裁剪功能允许只捕获屏幕的一部分。参数格式是 宽度:高度:水平偏移:垂直偏移,坐标基于设备的自然方向(手机是竖屏,平板是横屏)。
scrcpy --crop=1224:1440:0:0 # 从左上角截取 1224x1440 区域
文档中提到的 Oculus Go 案例很有代表性:VR 设备的双眼画面并排显示,通过裁剪可以只捕获其中一只眼的画面。对于普通用户,裁剪可以用来隐藏状态栏、导航栏,或者聚焦某个应用的特定区域。
需要注意的是,对于屏幕镜像,--max-size 在裁剪后应用;对于摄像头,顺序相反,--max-size 先用于选择源分辨率,再进行裁剪。
显示模式与缓冲策略
这部分涉及 scrcpy 如何处理多显示器设备和网络抖动。
多显示器支持
现代 Android 设备可能连接多个物理或虚拟显示器。scrcpy 可以列出并选择特定显示器:
scrcpy --list-displays
输出会显示每个显示器的 ID 和分辨率。选择特定显示器:
scrcpy --display-id=1
Android 10 以下版本对副屏的控制有限,通常是只读模式。Android 10 及以上支持完整控制。
虚拟显示器是另一个强大功能,允许在设备上创建一个独立的显示空间,不影响主屏幕。这在自动化测试或多任务场景中有用,但详细配置属于第 12 章内容。
缓冲策略
默认情况下,scrcpy 不添加任何视频缓冲,追求最低延迟。每一帧从设备编码完成后立即传输并显示。这在理想网络环境下工作得很好,但无线连接或高负载时,网络抖动会导致画面卡顿。
为了平滑播放,可以添加缓冲。缓冲会延迟视频流,补偿网络抖动,代价是增加延迟。scrcpy 允许为不同输出独立配置缓冲:显示画面、V4L2 设备、音频播放。
虽然文档没有给出具体命令,但通常通过类似 --display-buffer=50 的参数实现,单位是毫秒。50ms 的缓冲能将大部分抖动平滑掉,而不会对交互感造成明显影响。对于观看视频,可以增加到 200ms 甚至更高;对于游戏,建议保持 0 或极低值。
缓冲策略的选择取决于场景:演示和教学可以容忍稍高延迟以换取流畅度;实时操控则必须优先保证低延迟。
总结
视频流配置是 scrcpy 性能调优的核心。记住几个关键原则:分辨率影响数据量,帧率影响流畅度,码率影响画质,编码器影响兼容性和效率。没有放之四海皆准的最佳配置,只有适合特定场景的平衡点。
本章聚焦在屏幕镜像的视频参数上。下一章将探讨音频处理,包括音源选择、编解码配置和音视频同步。音频和视频一样,有独立的编码器、缓冲区和延迟优化策略,两者结合才能构成完整的投屏体验。对于内容创作者,第 11 章的录制技术会进一步展示如何将这些配置转化为高质量的视频文件。