菜单

架构

相关源文件

本文档概述了scrcpy系统架构,解释了其高层客户端-服务器设计以及不同组件如何交互。有关详细使用说明,请参阅使用指南,有关安装详情,请参阅安装与设置

概述

Scrcpy采用客户端-服务器架构,通过电脑显示和控制Android设备

  1. 客户端运行在您的计算机上(Linux、Windows或macOS)
  2. 服务器运行在Android设备上
  3. 通信主要通过套接字进行,初始设置使用ADB(Android Debug Bridge)

这种分离使得系统能够高效地处理来自设备的视频和音频流,同时保持计算机的响应式控制。

高级架构图

来源:app/src/scrcpy.c47-92 server/src/main/java/com/genymobile/scrcpy/Server.java34-43

连接建立

客户端和服务器之间的连接过程涉及几个步骤

  1. 服务器准备:客户端通过ADB将服务器JAR推送到Android设备
  2. 服务器启动:客户端使用ADB shell命令执行服务器
  3. 套接字连接:服务器为视频、音频和控制创建套接字
  4. 协议握手:客户端和服务器建立通信通道

连接序列图

来源: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.c47-92

客户端主处理循环

客户端围绕一个事件循环运行,该循环处理

  • SDL事件(键盘/鼠标输入、窗口事件)
  • 内部事件(连接状态、错误)
  • 用于显示和录制的帧处理

来源: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

数据流

系统运行有三个主要数据流

  1. 视频流:设备屏幕/摄像头 → 编码 → 客户端 → 解码 → 显示
  2. 音频流:设备音频 → 编码 → 客户端 → 解码 → 播放
  3. 控制消息:客户端输入 → 设备操作

视频处理管道

来源: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的架构围绕清晰的客户端-服务器模型设计,实现了高效的屏幕镜像和设备控制。

  1. 客户端(在计算机上)负责

    • 用户界面和输入捕获
    • 视频/音频解码和播放
    • 录制和其他功能
  2. 服务器(在Android上)负责

    • 屏幕/摄像头捕获
    • 音频捕获
    • 视频/音频编码
    • 处理控制消息
  3. 通信通过以下方式进行

    • 视频流套接字
    • 音频流套接字
    • 控制消息套接字

这种关注点分离允许高效的资源利用,并支持广泛的功能,同时在不同平台上保持良好的性能。

来源:app/src/scrcpy.c47-92 server/src/main/java/com/genymobile/scrcpy/Server.java34-43