3.21. sample_lvgl_camera 使用说明
3.21.1. 功能概述
sample_lvgl_camera 是
该
实时
预览 :Camera Sensor 经VIN → ISP → VSE输出 NV12,经 DRM 视频 plane 全屏显示。 触摸 UI:LVGL 绘制
半透明 控件,经 DRM ARGB overlay plane 叠 在 预览 之上;触摸 走 linux evdev(不 依赖 LVGL 内置 LV_USE_EVDEV)。拍照:异步 JPEG 抓拍,带
时间 戳 水印 与 快门 反馈。 录像:硬件 H.264 编码,封装
为 MP4;相册 列表 可 浏览 / 删除。 相册
回放 :静图默认 JPEG 硬解 后 在 UI 层 全屏 显示;视频 点开 后 由 FFmpeg 解 封装,再 经 VPU 硬解 H.264 到 视频 层 播放。 状态
显示 :照片余量、可用 存储空间;空间 不足 时 显示 FULL并拒绝 保存 / 可 自动 停录。
注意:本
3.21.1.1. 软件架构说明
整体

从上到下
应用 UI 层:
ui_camera/ui_gallery,负责相机 主 界面、状态 条、快门 / REC / 相册 控件。 LVGL 框架
层:LVGL 9.x 控件、定时器 与 事件 循环;通过 port 层 完成 flush 与 输入。 显示 / 输入 port:
lvgl_display(ARGB8888 → DRM overlay)、lvgl_input(evdev 触摸)。相机
业务 层: camera_pipeline负责预览 线程、JPEG 抓拍、H.264 录像 与 remux、静图 / 视频 回放。 多媒体
与 显示:VIN / ISP / VSE、编码器、 vp_display视频 plane、drm_ui_planeUI overlay。系统
状态: sys_status读取电量 (/sys/class/power_supply,有 则 显示,无则 不 显示)与 可用 存储空间,供 状态 条 与 存储保护 逻辑 使用。
显示
| 图层 | 典型 Plane | 格式 | 内容 |
|---|---|---|---|
| 视频 |
33 | NV12 | 相机 |
| UI 层 | 运行 |
ARGB8888 | LVGL 取景 UI(奶油色 |
3.21.1.2. 代码位置及目录结构
代码
位置: app/samples/platform_samples/sample_lvgl_camera目录
结构:
sample_lvgl_camera/
├── Makefile
├── README.md
├── setup_lvgl.sh # 下载 LVGL 9.5.0 → third_party/lvgl
├── config/
│ └── lv_conf.h # LVGL 编译期配置(色深、裁剪功能等)
├── src/
│ ├── main.c # 入口、参数、主循环
│ ├── camera/
│ │ ├── camera_pipeline.c/.h # VIN→ISP→VSE 预览 + 抓拍/录像
│ │ ├── media_still.c/.h # JPEG / 水印 / sidecar
│ │ ├── media_player.c/.h # 相册 MP4 硬解播放
│ │ └── rec_mux.c/.h # annex-B H.264 → MP4
│ ├── drm/
│ │ ├── drm_ui_plane.c/.h # UI ARGB overlay
│ │ ├── vp_display.c/.h # 视频 DRM plane(含 overlay)
│ │ └── uthash.h # vp_display 用
│ ├── lvgl_port/
│ │ ├── lvgl_display.c/.h # LVGL → DRM ARGB flush
│ │ └── lvgl_input.c/.h # linux evdev + 板级校准
│ ├── system/
│ │ └── sys_status.c/.h # 轮询电量、温度、存储;UI 显示空间(FULL/xxMB/xxGB),有 capacity 时附带电量%
│ └── ui/
│ ├── ui_camera.c/.h # 相机界面 + 快门反馈
│ └── ui_gallery.c/.h # 相册
└── third_party/lvgl/ # LVGL 源码(setup_lvgl.sh 后生成)
编译
platform_samples/utils/*.cplatform_samples/vp_sensors/**(Sensor 配置表)
3.21.1.3. API 流程说明

典型
apply_product_env_defaults():应用默认 的 环境变量(旋转、边框、触摸 偏移 等)。 解析
命令行 -s/-c/-i。camera_pipeline_init():创建 Sensor 通路、启动 VSE 取流线 程、初始化 MIPI DRM 视频 层。 drm_ui_plane_init()+lvgl_display_init():创建 UI overlay 与 LVGL display。lvgl_input_init():打开触摸 设备 并 注册 pointer indev(失败 仅 告警,仍 可 无 触摸 运行)。 ui_camera_create():创建相机 界面 并 绑定 抓拍 / 录像 / 相册 回调。 camera_pipeline_start_preview():视频层 与 UI 联动 提交。 主
循环: lv_timer_handler()+ DRM UI flip;收到SIGINT/SIGTERM后停录 并 释放 资源。
3.21.2. 环境准备
SC230AI模组,正确
接到 MIPI CSI MIPI LCD(产品
默认 按 720×1280 竖屏 调校) 触摸屏
驱动 已 加载,存在 /dev/input/event*(产品使用 的 gt9xx, 如 加载 驱动 modprobe gt9xx_core)DRM 显示
通路 可用(存在 /dev/dri相关节点)
3.21.3. 编译部署
3.21.3.1. 编译
该out/deploy/system 等
编译
整体
编译:
# 在 SDK 根目录,整体编译
./bd.sh
# 或在 SDK 根目录,编译 platform_samples(包含 sample_lvgl_camera)
./bd.sh app
仅
编译 本 目录:
cd app/samples/platform_samples/sample_lvgl_camera
make
# 产物:./lvgl_camera
3.21.3.2. 程序部署
完成
/app/platform_samples/sample_lvgl_camera/lvgl_camera
也lvgl_camera 手动/userdata),赋予
chmod +x lvgl_camera
3.21.4. 运行
3.21.4.1. 程序运行方法
板端
cd /app/platform_samples/sample_lvgl_camera
./lvgl_camera
3.21.4.2. 界面操作说明
图 1 预览

奶油色
图 2 相

按
| 控件 | 功能 | 输出 |
|---|---|---|
| 快门(底栏 |
JPEG 抓拍(时间 |
/userdata/lvgl_camera/capture_*.jpg |
| REC (快 |
开始 / 停止 |
/userdata/lvgl_camera/record_*.mp4 及 |
| 相册 | 列表 |
— |
录像
| 文件 | 用途 |
|---|---|
.mp4 |
视频 |
.poster.jpg |
录像 |
.a565 |
列表 |
.vdur |
时 |
相册.poster.jpg 不会
3.21.4.3. 运行效果
成功
MIPI 屏双
图层 显示——底层 实时 预览,上层 奶油色 边框/底栏 UI,底栏 含 相册 / 拍照 快门 / 录制 REC。 点击 Capture 生成 JPEG;点击 REC 开始
录像,再次 点击 停止 并 生成 MP4。 进入
相册 可 浏览 最近 媒体;点 视频 可硬解 回放(无 声音)。 串口
可见 类似 日志: Camera pipeline ready (1920x1080 -> MIPI plane 33)、sample_lvgl_camera running、lvgl_input: touch ready ...。
正常Ctrl+C,程序