基于 Rust 代码示例实现了一个简单的视频流服务,使用了 Actix-Web 框架。服务的核心功能包括注册视频、列出所有视频以及提供视频流。下面是对代码各部分的详细分析:
代码开始通过 use
关键字导入了必要的库和模块,用于构建 Web 应用和服务:
actix_web
:用于创建 Web 应用和处理 HTTP 请求。actix_files
:用于提供静态文件服务,这里用于视频流。std::path::PathBuf
:用于操作文件路径。uuid
: 生成唯一标识符(UUID)用于视频ID。std::collections::HashMap
:存储视频信息的哈希映射。std::sync::Mutex
:线程安全地访问共享数据(视频映射)。serde
: 序列化和反序列化 Rust 结构体到 JSON。
定义了一个表示视频信息的结构体,包含视频ID (id
)、路径 (path
) 和名称 (name
)。它实现了 Serialize
和 Deserialize
特征,以便与 JSON 数据互换。
定义应用状态结构体,持有一个线程安全的视频信息映射 (Mutex<HashMap<String, VideoInfo>>
)。
异步函数,处理 POST 请求到 /api/videos
,用于注册新视频。接收请求体中的视频路径和名称,生成一个新的 UUID 作为视频ID,并将视频信息保存到应用状态的视频映射中。返回新视频的详细信息作为 JSON 响应。
异步函数,处理 GET 请求到 /api/videos/{id}
,用于获取指定ID的视频流。根据ID从应用状态中查找视频信息,然后尝试打开并返回视频文件的流。如果找不到视频,则返回 404 错误。
异步函数,处理 GET 请求到 /api/videos
,列出所有已注册的视频信息。从应用状态中获取所有视频,转换成向量,并以 JSON 格式响应。
- 创建了一个共享的应用状态实例 (
AppState
),使用web::Data
包装以便在应用中跨线程安全地共享。 - 配置并启动 Actix-Web 服务器,监听所有网络接口的 8888 端口。
- 为
/api/videos
路由配置了 POST 方法处理函数register_video
用于注册视频。 - 同一路径还配置了 GET 方法处理函数
list_videos
用于列出所有视频。 - 为
/api/videos/{id}
路由配置了 GET 方法处理函数stream_video
用于视频流播放。
- 为