菜单

客户端组件

相关源文件

本页面介绍了 scrcpy 客户端组件,这些组件运行在主机(Windows、macOS 或 Linux)上。这些组件负责连接到 Android 设备,接收并显示设备的视频和音频,处理用户输入,并将控制命令发送回设备。有关运行在 Android 设备上的服务器端组件的信息,请参阅服务器组件

客户端架构概览

从宏观角度看,scrcpy 客户端包含几个关键组件,它们协同工作以提供屏幕镜像和设备控制功能。客户端应用程序遵循模块化架构,不同的组件负责特定的职责。

客户端组件架构

来源:app/src/scrcpy.c48-92 app/src/main.c24-103 app/src/server.c92-124

组件数据流

来源:app/src/scrcpy.c565-621 app/src/scrcpy.c795-833

核心组件

主应用程序 (scrcpy.c)

客户端应用程序的核心是 scrcpy.c,其中包含用于协调整个客户端操作的 scrcpy 主函数。该函数

  1. 初始化 SDL 和所有子系统
  2. 在 Android 设备上启动服务器
  3. 建立视频、音频和控制连接
  4. 创建并配置所有客户端组件
  5. 管理事件循环
  6. 处理退出时的清理工作

scrcpy.c 中定义的主结构体是 struct scrcpy,它包含指向所有主要客户端组件的引用。

struct scrcpy {
    struct sc_server server;
    struct sc_screen screen;
    struct sc_audio_player audio_player;
    struct sc_demuxer video_demuxer;
    struct sc_demuxer audio_demuxer;
    struct sc_decoder video_decoder;
    struct sc_decoder audio_decoder;
    struct sc_recorder recorder;
    struct sc_delay_buffer video_buffer;
    struct sc_controller controller;
    struct sc_file_pusher file_pusher;
    // ... other components
};

来源:app/src/scrcpy.c48-92 app/src/scrcpy.c369-1057

服务器连接管理 (server.c)

server.c 组件负责

  1. 将服务器二进制文件推送到 Android 设备
  2. 在设备上启动服务器进程
  3. 管理视频、音频和控制连接
  4. 处理设备连接和断开事件

该组件使用 ADB(Android Debug Bridge)连接设备,推送服务器二进制文件,并建立用于通信的转发端口。

结构体 struct sc_server 包含有关服务器连接的信息,包括用于视频、音频和控制数据的套接字。

来源:app/src/server.c18-22 app/src/server.c518-742 app/src/server.h76-98

屏幕管理 (screen.c)

屏幕组件负责

  1. 使用 SDL 创建和管理显示窗口
  2. 渲染从设备接收的视频帧
  3. 处理与窗口相关的事件(调整大小、全屏等)
  4. 与输入管理器协调以实现用户交互

屏幕组件实现了 sc_frame_sink 接口,以接收来自视频解码器的帧,确保设备屏幕的正确显示。

来源:app/src/scrcpy.c794-833

输入管理 (input_manager.c)

输入管理器处理用户输入事件,并将其转换为设备控制命令。它处理

  1. 鼠标事件(点击、移动、滚轮)
  2. 键盘事件
  3. 游戏手柄/控制器事件
  4. 触摸事件模拟

输入管理器与屏幕组件(接收输入事件)和控制器组件(发送命令到设备)紧密协作。

来源:app/src/scrcpy.c792-801

设备控制 (controller.c)

控制器组件与 Android 设备上的服务器通信,用于

  1. 发送输入事件(触摸、按键等)
  2. 控制设备功能(屏幕开关、剪贴板等)
  3. 注入文本
  4. 管理剪贴板同步

控制器通过与设备建立的控制套接字进行操作。

来源:app/src/scrcpy.c629-784

媒体处理

视频处理链

视频处理链包括

  1. 视频解复用器:接收来自设备的编码视频数据
  2. 视频解码器:将 H.264/H.265/AV1 编码视频解码为帧
  3. 视频缓冲区(可选):缓冲视频帧以减少抖动
  4. 屏幕:显示解码后的帧

来源:app/src/scrcpy.c586-590 app/src/scrcpy.c823-832

音频处理链

音频处理链包括

  1. 音频解复用器:接收来自设备的编码音频数据
  2. 音频解码器:将 Opus/AAC/FLAC 编码音频解码为帧
  3. 音频播放器:播放解码后的音频帧

来源:app/src/scrcpy.c591-595 app/src/scrcpy.c836-840

录制系统 (recorder.c)

录制器组件允许将屏幕和音频录制到文件中。它支持

  1. 不同的容器格式(MP4、MKV)
  2. 不同的音频格式(AAC、OPUS、FLAC)
  3. 录制视频的方向设置

录制器利用解复用器的输出接收视频和音频数据包进行录制。

来源:app/src/scrcpy.c597-622

文件传输 (file_pusher.c)

文件推送组件支持将文件拖放到设备上进行传输。它

  1. 监控 scrcpy 窗口上的拖放事件
  2. 使用 ADB 将文件推送到设备上指定的目录

来源:app/src/scrcpy.c554-563

客户端初始化和事件循环

初始化顺序

客户端初始化遵循以下关键步骤

  1. 初始化 SDL(用于事件、视频、音频等)
  2. 初始化并启动服务器连接
  3. 创建并配置所有客户端组件
  4. 连接组件(链接源和接收器)
  5. 启动所有组件
  6. 进入主事件循环

来源:app/src/main.c24-103 app/src/scrcpy.c369-936

事件循环

事件循环是客户端应用程序的核心,它处理所有事件并协调组件的交互。它

  1. 处理 SDL 事件(用户输入、窗口事件等)
  2. 处理自定义事件(设备断开连接、错误等)
  3. 处理视频和音频帧
  4. 将输入事件路由到正确的处理程序

事件循环将一直运行,直到应用程序因错误、设备断开连接或用户退出请求而终止。

来源:app/src/scrcpy.c167-207

命令行选项和配置

客户端的行为可以通过命令行选项进行高度配置。这些选项在 cli.c 中处理,并存储在传递给主 scrcpy 函数的 struct scrcpy_options 结构体中。

主要配置类别包括

类别描述示例选项
连接设备选择和连接选项--serial, --select-usb, --select-tcpip
显示视频显示设置--fullscreen, --max-size, --window-x/y/width/height
视频视频编码和处理--video-codec, --video-bit-rate, --max-fps
音频音频编码和播放--audio-codec, --audio-bit-rate, --audio-buffer
输入输入处理方法--keyboard, --mouse, --gamepad
录制屏幕录制选项--record, --record-format
控制设备控制选项--no-control, --stay-awake, --turn-screen-off
特殊功能附加功能--push-target, --v4l2-sink

来源: app/src/cli.c152-810 app/src/options.h230-330 app/data/bash-completion/scrcpy1-227 app/data/zsh-completion/_scrcpy1-114

错误处理和断开连接管理

客户端处理各种错误情况和断开连接事件

  1. 连接失败通过服务器回调报告
  2. 组件错误(解复用器、控制器、记录器)会触发特定事件
  3. 检测并妥善处理设备断开连接
  4. 退出时正确清理资源

这确保了应用程序在出现问题时能够保持稳定,并能够进行恢复或干净地退出。

来源: app/src/scrcpy.c172-189 app/src/scrcpy.c947-1051

总结

scrcpy的客户端组件构成了一个协同的系统,它处理设备连接、视频和音频处理、输入处理以及设备控制等复杂任务。通过其模块化设计,客户端应用程序可以适应不同的用户需求,同时保持高性能和响应速度。

每个组件都有明确定义的职责和接口,使它们能够高效地协同工作,同时保持关注点分离。这种架构不仅使代码更易于维护,还使得录制、文件传输和各种输入方法等功能可以作为可选组件实现,并与核心功能无缝集成。