本文档概述了scrcpy系统架构,解释了其高层客户端-服务器设计以及不同组件如何交互。有关详细使用说明,请参阅使用指南,有关安装详情,请参阅安装与设置。
Scrcpy采用客户端-服务器架构,通过电脑显示和控制Android设备
这种分离使得系统能够高效地处理来自设备的视频和音频流,同时保持计算机的响应式控制。
来源:app/src/scrcpy.c47-92 server/src/main/java/com/genymobile/scrcpy/Server.java34-43
客户端和服务器之间的连接过程涉及几个步骤
来源:app/src/server.c57-70 app/src/server.c204-464 app/src/scrcpy.c468-547
客户端负责
来源:app/src/scrcpy.c47-92 app/src/scrcpy.c368-1056
| 组件 | 目的 | 关键文件 |
|---|---|---|
sc_server | 管理服务器连接和ADB交互 | server.c, server.h |
sc_screen | 处理显示窗口和渲染 | screen.c, screen.h |
sc_demuxer | 接收和处理视频/音频流 | demuxer.c, demuxer.h |
sc_decoder | 解码视频/音频帧 | decoder.c, decoder.h |
sc_controller | 处理和发送控制消息 | controller.c, controller.h |
sc_recorder | 将设备屏幕录制到文件 | recorder.c, recorder.h |
sc_file_pusher | 将文件发送到设备 | file_pusher.c, file_pusher.h |
客户端围绕一个事件循环运行,该循环处理
来源:app/src/scrcpy.c167-207 app/src/scrcpy.c368-1056
服务器运行在Android设备上,负责
来源:server/src/main/java/com/genymobile/scrcpy/Server.java34-201
| 组件 | 目的 | 关键类 |
|---|---|---|
服务器 | 控制整体流程的主服务器类 | Server.java |
选项 | 从客户端传递的配置设置 | Options.java |
SurfaceCapture | 屏幕/摄像头捕获的基类 | SurfaceCapture.java |
ScreenCapture | 捕获设备屏幕内容 | ScreenCapture.java |
CameraCapture | 捕获设备摄像头馈送 | CameraCapture.java |
SurfaceEncoder | 使用MediaCodec编码视频 | SurfaceEncoder.java |
AudioCapture | 捕获设备音频 | AudioCapture.java |
AudioEncoder | 使用MediaCodec编码音频 | AudioEncoder.java |
控制器 | 处理控制消息 | Controller.java |
DesktopConnection | 管理客户端连接 | DesktopConnection.java |
来源:server/src/main/java/com/genymobile/scrcpy/Server.java34-262
服务器使用在独立线程中运行的异步处理器进行操作
来源:server/src/main/java/com/genymobile/scrcpy/Server.java76-202
系统运行有三个主要数据流
来源:app/src/scrcpy.c564-590 server/src/main/java/com/genymobile/scrcpy/Server.java145-161
来源:app/src/scrcpy.c591-595 server/src/main/java/com/genymobile/scrcpy/Server.java125-141
来源:app/src/scrcpy.c623-641 server/src/main/java/com/genymobile/scrcpy/Server.java117-123
Scrcpy可以通过命令行选项进行高度配置。这些选项会影响客户端和服务器的行为。
来源:app/src/cli.c19-116 app/src/server.c204-464 server/src/main/java/com/genymobile/scrcpy/Options.java291-526
| 类别 | 选项 | 目的 |
|---|---|---|
| 显示 | max-size, display-id, fullscreen, video-source | 控制设备显示方式 |
| 视频 | video-codec, video-bit-rate, video-encoder | 配置视频编码 |
| 音频 | audio-codec, audio-bit-rate, audio-source | 配置音频编码 |
| 输入 | keyboard, mouse, gamepad | 配置输入方法 |
| 连接 | port, tunnel-host, tcpip | 配置连接参数 |
| 特性 | record, show-touches, stay-awake | 启用附加功能 |
来源:app/src/options.h230-330 server/src/main/java/com/genymobile/scrcpy/Options.java23-289
Scrcpy的架构围绕清晰的客户端-服务器模型设计,实现了高效的屏幕镜像和设备控制。
客户端(在计算机上)负责
服务器(在Android上)负责
通信通过以下方式进行
这种关注点分离允许高效的资源利用,并支持广泛的功能,同时在不同平台上保持良好的性能。
来源:app/src/scrcpy.c47-92 server/src/main/java/com/genymobile/scrcpy/Server.java34-43