此页面记录了 scrcpy 应用程序的服务器端组件。服务器是一个运行在 Android 设备上的 Java 应用程序,负责捕获屏幕内容、编码视频和音频流以及处理来自客户端的控制命令。有关运行在主机上的客户端组件的信息,请参阅 客户端组件。
服务器的主要职责包括:
服务器遵循模块化架构,拥有专门的组件来处理设备交互和媒体处理的不同方面。
服务器组件架构图
来源:server/src/main/java/com/genymobile/scrcpy/Server.java34-262
服务器应用程序的入口点是 Server 类,它负责初始化所有组件并管理它们的生命周期。
来源:server/src/main/java/com/genymobile/scrcpy/Server.java204-262 server/src/main/java/com/genymobile/scrcpy/Server.java77-202
初始化过程遵循以下步骤
DesktopConnection 类管理服务器和客户端之间的套接字连接。
来源:server/src/main/java/com/genymobile/scrcpy/Server.java107-115
服务器支持多种视频源,使用通用的 SurfaceCapture 接口。
| 视频源 | 实现 | 描述 |
|---|---|---|
| 显示 | ScreenCapture | 捕获主屏幕或特定显示器 |
| Virtual Display | NewDisplayCapture | 创建并捕获新的虚拟显示器 |
| Camera | CameraCapture | 从设备摄像头捕获视频 |
每个捕获源将帧馈送到 SurfaceEncoder,它使用配置的视频编解码器(H.264、H.265 或 AV1)对帧进行编码,然后将它们传递给 Streamer 进行传输。
来源:server/src/main/java/com/genymobile/scrcpy/Server.java148-165
与视频类似,音频捕获通过 AudioCapture 接口支持多种音频源。
| 音频源 | 实现 | 描述 |
|---|---|---|
| 输出 | AudioPlaybackCapture | 捕获系统音频输出 |
| 输入 | AudioDirectCapture | 捕获麦克风输入 |
音频处理遵循以下两种路径之一:
AudioCapture 实现捕获,由 AudioEncoder 使用配置的编解码器(Opus 或 AAC)进行编码,然后发送到客户端。AudioRawRecorder 直接将 PCM 样本发送到客户端。来源:server/src/main/java/com/genymobile/scrcpy/Server.java125-142
控制系统处理来自客户端的命令,以与 Android 设备进行交互。
来源:server/src/main/java/com/genymobile/scrcpy/Server.java117-123
Controller 类
ControlChannel 从客户端接收序列化消息。服务器组件异步运行以最大化性能。
来源:server/src/main/java/com/genymobile/scrcpy/Server.java44-71 server/src/main/java/com/genymobile/scrcpy/Server.java168-175
服务器使用完成跟踪机制来:
服务器可通过 Options 类解析的命令行选项进行高度配置。
| 类别 | 选项 | 描述 |
|---|---|---|
| 视频 | video_source, video_codec, video_bit_rate, max_size, max_fps | 控制视频捕获和编码 |
| 音频 | audio_source, audio_codec, audio_bit_rate, audio_dup | 控制音频捕获和编码 |
| 显示 | display_id, new_display, crop, orientation | 控制捕获哪个显示器以及如何捕获 |
| Camera | camera_id, camera_size, camera_facing | 控制摄像头捕获设置 |
| 控制 | control, show_touches, stay_awake | 控制设备交互功能 |
| 连接 | scid, tunnel_forward | 控制连接设置 |
来源:server/src/main/java/com/genymobile/scrcpy/Options.java23-650
服务器遵循以下生命周期:
初始化
处理方式
关机
来源:server/src/main/java/com/genymobile/scrcpy/Server.java77-202