4 个版本
0.2.3 | 2023 年 11 月 8 日 |
---|---|
0.2.2 | 2023 年 8 月 3 日 |
0.2.1 | 2023 年 2 月 18 日 |
0.2.0 | 2023 年 2 月 18 日 |
0.1.0 |
|
#30 在 多媒体
每月 75 次下载
用于 snapper-rs
270KB
4K SLoC
libcamera-rs
libcamera 的实验性 Rust 绑定。
项目结构
- libcamera-sys - 到 libcamera 的低级不安全绑定。还包含使与 C++ 代码接口更容易的 libcamera C API 模拟器。
- libcamera-meta - 从 libcamera 控制、属性和格式 YAML 生成 C 和 Rust 代码的脚本。主要用于 regenerate.sh 脚本。
- libcamera - 基于
libcamera-sys
的安全 libcamera Rust 接口。
main 的未发布文档:[这里](https://lit-robotics.github.io/libcamera-rs/libcamera/index.html)
构建
libcamera-sys
需要 libcamera 已安装并可由 pkg-config 访问。请查看官方 入门指南 了解如何构建 libcamera。请注意,我们尚未与 libcamera 绑定发布计划,因此可能存在破坏性更改。这也意味着任何二进制发行版(例如在 Ubuntu 22.04 上)可能太旧。此 crate 已知可以与 libcamera v0.1.0
构建。
不需要其他特殊依赖。所有 Crates 都可以从根工作空间目录使用 cargo build
构建。
运行示例
使用仅 libcamera
的 libcamera-sys
打印 libcamera
版本([代码](https://github.com/lit-robotics/libcamera-rs/blob/6157ede69c76e42cefec3250e2a4b69786f9224b/libcamera/libcamera-sys/examples/version.rs))
osboxes@osboxes:~/libcamera-rs$ cargo run --example version
Finished dev [unoptimized + debuginfo] target(s) in 0.04s
Running `target/debug/examples/version`
libcamera: v0.0.1+50-aa7b3740
列出摄像头(《代码》)
osboxes@osboxes:~/libcamera-rs$ cargo run --example list_cameras
Finished dev [unoptimized + debuginfo] target(s) in 0.03s
Running `target/debug/examples/list_cameras`
[4:16:17.777208430] [25773] INFO Camera camera_manager.cpp:293 libcamera v0.0.1+50-aa7b3740
Camera 0
ID: \_SB_.PCI0-2:1.0-0c45:2690
Properties: Immutable(
{
PixelArrayActiveAreas: PixelArrayActiveAreas(
[
Rectangle {
x: 0,
y: 0,
width: 1920,
height: 1080,
},
],
),
PixelArraySize: PixelArraySize(
Size {
width: 1920,
height: 1080,
},
),
Location: CameraExternal,
Model: Model(
"AUKEY PCW1: AUKEY PCW1",
),
},
)
Available formats: {
MJPEG: [
Size {
width: 320,
height: 240,
},
...
Size {
width: 1920,
height: 1080,
},
],
YUYV: [
Size {
width: 320,
height: 240,
},
...
Size {
width: 1920,
height: 1080,
},
],
}
将JPEG图像捕获到文件(《代码》)
osboxes@osboxes:~/libcamera-rs$ cargo run --example jpeg_capture target/image.jpg
Finished dev [unoptimized + debuginfo] target(s) in 0.04s
Running `target/debug/examples/jpeg_capture target/image.jpg`
[4:18:00.104950400] [25950] INFO Camera camera_manager.cpp:293 libcamera v0.0.1+50-aa7b3740
Using camera: AUKEY PCW1: AUKEY PCW1
Generated config: [
StreamConfigurationRef {
pixel_format: MJPEG,
size: Size {
width: 1920,
height: 1080,
},
stride: 0,
frame_size: 4147789,
buffer_count: 4,
},
]
[4:18:00.159095868] [25950] INFO Camera camera.cpp:1026 configuring streams: (0) 1920x1080-MJPEG
Allocated 4 buffers
Waiting for camera request execution
Camera request Request { seq: 0, status: Complete, cookie: 0 } completed!
Metadata: Immutable(
{
SensorTimestamp: SensorTimestamp(
15480581860000,
),
},
)
FrameBuffer metadata: Immutable(
FrameMetadataRef {
status: Success,
sequence: 0,
timestamp: 15480581860000,
planes: [
libcamera_frame_metadata_plane {
bytes_used: 442672,
},
],
},
)
Written 4147789 bytes to target/image.jpg
安全注意事项
libcamera-rs
旨在成为一个完全内存安全的包装器,然而,由于libcamera
的复杂性和对象之间众多的交叉引用,确保完全的安全性相当困难,因此很可能存在错误。欢迎提交问题和拉取请求。
常见问题解答(FAQ)
- 为什么不直接包装C++ API,而不是使用中间的C层?
- 在Rust中编写C++包装器相当困难,因为许多特性无法很好地转换为Rust:多态、函数重载、模板等。虽然有一些生成C++绑定的工具,但它们通常在更复杂的场景下会失效,或者生成的代码比额外的C层还要冗余。
- 类似列表的结构(
CameraConfiguration
、ControlList
)是不可索引的- 无法为这些结构实现
Index
和IndexMut
特质,因为特质只能返回结构内部现有数据的引用。大多数libcamera包装器返回新的类型变体,这使得它们与索引不兼容。
- 无法为这些结构实现
许可
根据您的选择,许可协议为以下之一
- Apache License,版本2.0(《LICENSE-APACHE》或https://www.apache.org/licenses/LICENSE-2.0)
- MIT许可(《LICENSE-MIT》或https://opensource.org/licenses/MIT)
。
依赖
~0.5–3MB
~62K SLoC