核心应用程序是scrcpy的中心组件,负责初始化、协调和管理所有实现设备屏幕镜像和控制的子系统。它作为应用程序的主要入口点,处理scrcpy会话从启动到关闭的整个生命周期。
本页涵盖了scrcpy应用程序的主要结构、初始化过程和事件处理。有关屏幕渲染等独立组件的详细信息,请参阅屏幕和输入管理;有关视频/音频处理的详细信息,请参阅视频和音频处理。
核心应用程序将scrcpy的所有组件绑定在一起,管理它们的生命周期并促进它们之间的通信。它主要在scrcpy.c中实现,其中包含主入口点函数scrcpy()和核心数据结构struct scrcpy。
来源:app/src/main.c26-103 app/src/scrcpy.c48-91 app/src/scrcpy.c369-1057
的struct scrcpy包含了构成应用程序的所有组件
核心应用程序中的初始化过程负责设置屏幕镜像和设备控制所需的所有组件。
来源:app/src/scrcpy.c369-916 app/src/server.c518-570
核心应用程序的入口点是scrcpy()函数,它接受一个struct scrcpy_options参数,该参数包含所有用户指定的选项。该函数返回一个退出代码,指示成功或失败类型。
初始化过程包括
来源:app/src/scrcpy.c369-936 app/src/scrcpy.h19-20
服务器组件(struct sc_server)处理与安卓设备的通信
关键服务器函数
sc_server_init: 初始化服务器结构sc_server_start: 在设备上启动服务器进程sc_server_connect_to: 连接到服务器套接字sc_server_stop: 停止服务器进程来源:app/src/server.c518-742 app/src/server.h76-98
视频和音频处理涉及多个组件
这些组件之间的关系在初始化期间配置
Server -> Demuxers -> Decoders -> [Delay Buffers] -> Frame Sinks (Screen, Recorder, V4L2)
来源:app/src/scrcpy.c566-621 app/src/scrcpy.c823-860
输入处理通过以下方式管理
应用程序支持多种输入模式
屏幕组件(struct sc_screen)处理
在初始化期间,屏幕组件作为帧接收器连接到视频解码器
video_decoder.frame_source -> [video_buffer (optional)] -> screen.frame_sink
核心应用程序处理两种类型的事件
自定义事件以SC_EVENT_*前缀定义,并被推送到SDL事件队列。
来源:app/src/scrcpy.c167-207 app/src/events.h
核心应用程序设置了多个回调以处理异步事件
| 回调 | 目的 |
|---|---|
sc_server_on_connection_failed | 当连接到服务器失败时调用 |
sc_server_on_connected | 当连接到服务器成功时调用 |
sc_server_on_disconnected | 当服务器断开连接时调用 |
sc_recorder_on_ended | 当录制结束时调用 |
sc_video_demuxer_on_ended | 当视频流结束时调用 |
sc_audio_demuxer_on_ended | 当音频流结束时调用 |
sc_controller_on_ended | 当控制器结束时调用 |
sc_timeout_on_timeout | 达到时间限制时调用 |
这些回调通常将相应的事件推送到SDL事件队列,由主事件循环处理。
来源:app/src/scrcpy.c251-343 app/src/scrcpy.c468-472
当应用程序终止时(无论是由于用户请求、错误还是达到时间限制),它将执行以下操作:
清理顺序经过精心安排,以确保正确关闭
核心应用程序可以返回三种可能的退出代码
| 退出码 | 值 | 含义 |
|---|---|---|
SCRCPY_EXIT_SUCCESS | 0 | 程序正常终止 |
SCRCPY_EXIT_FAILURE | 1 | 未能建立连接 |
SCRCPY_EXIT_DISCONNECTED | 2 | 运行期间设备断开连接 |
核心应用程序支持多种命令行选项,这些选项在cli.c中处理,并作为struct scrcpy_options传递给scrcpy()函数。这些选项控制应用程序行为的所有方面,包括