3.21. sample_lvgl_camera 使用说明

3.21.1. 功能概述

sample_lvgl_camera基于 LVGL相机界面示例程序,用于快速启动环境的 MIPI 屏上演示「实时预览 + 触摸交互 + 拍照 / 录制 + 相册回放(无音频)」的完整应用链路。

示例如下功能:

  • 实时预览: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拒绝保存 / 可自动停录。

注意:本示例面向特定产品形态 (720x1280 竖屏 MIPI LCD + 720x1280 触摸板 + SC230AI)。

3.21.1.1. 软件架构说明

整体软件分层如下:

software_architecture_diagram

从上到下主要包含以下几个层次:

  • 应用 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_plane UI overlay。

  • 系统状态:sys_status 读取电量 (/sys/class/power_supply,有显示,无则显示)与可用存储空间,供状态存储保护逻辑使用。

显示采用图层:

图层 典型 Plane 格式 内容
视频 33 NV12 相机预览、相册视频 / 静图
UI 层 运行扫描可用 ARGB overlay(常见如 40) 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/*.c

  • platform_samples/vp_sensors/**(Sensor 配置表)

3.21.1.3. API 流程说明

api_flow_diagram

典型启动流程:

  1. apply_product_env_defaults():应用默认环境变量(旋转、边框、触摸偏移等)。

  2. 解析命令行 -s / -c / -i

  3. camera_pipeline_init():创建 Sensor 通路、启动 VSE 取流线程、初始化 MIPI DRM 视频层。

  4. drm_ui_plane_init() + lvgl_display_init():创建 UI overlay 与 LVGL display。

  5. lvgl_input_init():打开触摸设备注册 pointer indev(失败告警,仍触摸运行)。

  6. ui_camera_create():创建相机界面绑定抓拍 / 录像 / 相册回调。

  7. camera_pipeline_start_preview():视频与 UI 联动提交。

  8. 循环: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. 编译

示例作为 SDK 工程一部分编译,需已生成 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 预览页(取景界面)

Preview

奶油色边框中央实时预览;底栏从左到右为:相册快门(大黑圆)、REC(小红圆); 点快门保存 JPEG,再点 REC 开始 / 停止录像。

图 2 相册页

Gallery

时间列出最近照片视频;点条目查看静图播放 MP4(无声音),右侧 Del 删除,Close 返回预览。

控件 功能 输出
快门(底栏中央大黑圆) JPEG 抓拍(时间水印)+ 快门反馈 /userdata/lvgl_camera/capture_*.jpg
REC (快门旁小红圆) 开始 / 停止录像 /userdata/lvgl_camera/record_*.mp4附属文件
相册 列表浏览、删除、静图查看、视频播放

录像同名附属文件:

文件 用途
.mp4 视频本体
.poster.jpg 录像首帧封面,列表 / 起播
.a565 列表循环动图缩略(约前 3 秒、5 fps、160×90 RGB565)
.vdur 长(秒)文本,供列表 / 进度显示

相册删除媒体时会同步删除上述附属文件,.poster.jpg 不会作为独立相册条目显示;照片列表缩略图默认实时解码 JPEG。

3.21.4.3. 运行效果

成功运行后:

  • MIPI 屏双图层显示——底层实时预览,上层奶油色边框/底栏 UI,底栏相册 / 拍照快门 / 录制 REC。

  • 点击 Capture 生成 JPEG;点击 REC 开始录像,再次点击停止生成 MP4。

  • 进入相册浏览最近媒体;点视频可硬解回放(无声音)。

  • 串口可见类似日志:Camera pipeline ready (1920x1080 -> MIPI plane 33)sample_lvgl_camera runninglvgl_input: touch ready ...

正常退出:在串口发送 Ctrl+C,程序停止录像释放 DRM / LVGL 资源。