本页面介绍了 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 主函数。该函数
在 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 组件负责
该组件使用 ADB(Android Debug Bridge)连接设备,推送服务器二进制文件,并建立用于通信的转发端口。
结构体 struct sc_server 包含有关服务器连接的信息,包括用于视频、音频和控制数据的套接字。
来源:app/src/server.c18-22 app/src/server.c518-742 app/src/server.h76-98
屏幕组件负责
屏幕组件实现了 sc_frame_sink 接口,以接收来自视频解码器的帧,确保设备屏幕的正确显示。
输入管理器处理用户输入事件,并将其转换为设备控制命令。它处理
输入管理器与屏幕组件(接收输入事件)和控制器组件(发送命令到设备)紧密协作。
控制器组件与 Android 设备上的服务器通信,用于
控制器通过与设备建立的控制套接字进行操作。
视频处理链包括
来源:app/src/scrcpy.c586-590 app/src/scrcpy.c823-832
音频处理链包括
来源:app/src/scrcpy.c591-595 app/src/scrcpy.c836-840
录制器组件允许将屏幕和音频录制到文件中。它支持
录制器利用解复用器的输出接收视频和音频数据包进行录制。
文件推送组件支持将文件拖放到设备上进行传输。它
客户端初始化遵循以下关键步骤
来源:app/src/main.c24-103 app/src/scrcpy.c369-936
事件循环是客户端应用程序的核心,它处理所有事件并协调组件的交互。它
事件循环将一直运行,直到应用程序因错误、设备断开连接或用户退出请求而终止。
客户端的行为可以通过命令行选项进行高度配置。这些选项在 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
客户端处理各种错误情况和断开连接事件
这确保了应用程序在出现问题时能够保持稳定,并能够进行恢复或干净地退出。
来源: app/src/scrcpy.c172-189 app/src/scrcpy.c947-1051
scrcpy的客户端组件构成了一个协同的系统,它处理设备连接、视频和音频处理、输入处理以及设备控制等复杂任务。通过其模块化设计,客户端应用程序可以适应不同的用户需求,同时保持高性能和响应速度。
每个组件都有明确定义的职责和接口,使它们能够高效地协同工作,同时保持关注点分离。这种架构不仅使代码更易于维护,还使得录制、文件传输和各种输入方法等功能可以作为可选组件实现,并与核心功能无缝集成。