菜单

服务器组件

相关源文件

概述

此页面记录了 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

初始化过程遵循以下步骤

  1. 解析命令行参数以配置服务器选项
  2. 根据指定的日志级别初始化日志记录
  3. 应用 Android 的变通方法以实现设备兼容性
  4. 建立与客户端的桌面连接
  5. 根据启用的功能初始化并启动组件
    • 视频组件(启用视频时)
    • 音频组件(启用音频时)
    • 控制组件(启用控制时)
  6. 设置异步处理器以实现并行操作

连接处理

DesktopConnection 类管理服务器和客户端之间的套接字连接。

来源:server/src/main/java/com/genymobile/scrcpy/Server.java107-115

视频捕获与编码

服务器支持多种视频源,使用通用的 SurfaceCapture 接口。

视频源实现描述
显示ScreenCapture捕获主屏幕或特定显示器
Virtual DisplayNewDisplayCapture创建并捕获新的虚拟显示器
CameraCameraCapture从设备摄像头捕获视频

每个捕获源将帧馈送到 SurfaceEncoder,它使用配置的视频编解码器(H.264、H.265 或 AV1)对帧进行编码,然后将它们传递给 Streamer 进行传输。

来源:server/src/main/java/com/genymobile/scrcpy/Server.java148-165

音频捕获与编码

与视频类似,音频捕获通过 AudioCapture 接口支持多种音频源。

音频源实现描述
输出AudioPlaybackCapture捕获系统音频输出
输入AudioDirectCapture捕获麦克风输入

音频处理遵循以下两种路径之一:

  1. 编码音频:音频样本由 AudioCapture 实现捕获,由 AudioEncoder 使用配置的编解码器(Opus 或 AAC)进行编码,然后发送到客户端。
  2. 原始音频:对于未压缩的音频,AudioRawRecorder 直接将 PCM 样本发送到客户端。

来源:server/src/main/java/com/genymobile/scrcpy/Server.java125-142

控制系统

控制系统处理来自客户端的命令,以与 Android 设备进行交互。

来源:server/src/main/java/com/genymobile/scrcpy/Server.java117-123

Controller

  1. 通过 ControlChannel 从客户端接收序列化消息。
  2. 解释并执行命令,包括:
    • 输入事件(触摸、按键、文本)
    • 设备设置(旋转、亮度)
    • 剪贴板操作
    • 屏幕录制控制

异步处理

服务器组件异步运行以最大化性能。

来源:server/src/main/java/com/genymobile/scrcpy/Server.java44-71 server/src/main/java/com/genymobile/scrcpy/Server.java168-175

服务器使用完成跟踪机制来:

  1. 启动多个异步处理器
  2. 监控它们的执行情况
  3. 处理致命错误
  4. 协调有序关机

配置选项

服务器可通过 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控制捕获哪个显示器以及如何捕获
Cameracamera_id, camera_size, camera_facing控制摄像头捕获设置
控制control, show_touches, stay_awake控制设备交互功能
连接scid, tunnel_forward控制连接设置

来源:server/src/main/java/com/genymobile/scrcpy/Options.java23-650

服务器生命周期

服务器遵循以下生命周期:

  1. 初始化

    • 解析选项
    • 打开桌面连接
    • 初始化组件
  2. 处理方式

    • 启动异步处理器
    • 处理视频/音频流
    • 处理控制消息
  3. 关机

    • 停止异步处理器
    • 释放资源
    • 关闭连接

来源:server/src/main/java/com/genymobile/scrcpy/Server.java77-202