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 2023 年 2 月 5 日

#30多媒体

Download history 4/week @ 2024-04-07 20/week @ 2024-04-14 3/week @ 2024-04-21 5/week @ 2024-04-28 5/week @ 2024-05-05 19/week @ 2024-05-12 35/week @ 2024-05-19 16/week @ 2024-05-26 16/week @ 2024-06-02 3/week @ 2024-06-09 7/week @ 2024-06-16 23/week @ 2024-06-23 20/week @ 2024-06-30 20/week @ 2024-07-07 15/week @ 2024-07-14 18/week @ 2024-07-21

每月 75 次下载
用于 snapper-rs

MIT/Apache

270KB
4K SLoC

Rust 3.5K SLoC // 0.0% comments C++ 415 SLoC // 0.0% comments

libcamera-rs

Rust Latest version Documentation License

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 构建。

运行示例

使用仅 libcameralibcamera-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层还要冗余。
  • 类似列表的结构(CameraConfigurationControlList)是不可索引的
    • 无法为这些结构实现IndexIndexMut特质,因为特质只能返回结构内部现有数据的引用。大多数libcamera包装器返回新的类型变体,这使得它们与索引不兼容。

许可

根据您的选择,许可协议为以下之一

依赖

~0.5–3MB
~62K SLoC