| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 28 天前 | ||
| 28 天前 | ||
| 28 天前 | ||
| 20 天前 |
USB Camera NativeUI Sample
功能
本示例提供 USB Camera 的 NativeUI 页面,支持:
- USB Camera 预览启停
- 拍照和照片查看
- 录像、录像停止和 MJPEG 回放
- USB Host 驱动初始化入口
页面只负责 UI、状态管理和结果展示。Camera sample、Camera framework、HAL 以及 UVC Host 驱动负责实际采集和数据传输。
完整调用链和关键代码说明参见 USB Camera 开发指南。
代码入口与框架关系
src/UsbCameraPresenter.cpp:通过REGIST_MENU向 Native Launcher 注册USB Camera菜单。src/UsbCameraMainPage.cpp:通过REGIST_SLICE_PAGE注册页面,负责布局、按钮事件、 Camera sample 命令调用、照片显示和录像回放。src/UsbCameraMjpegPlayer.cpp:读取 MJPEG 文件,按 JPEG 起止标记拆帧,使用硬件 JPEG 解码并写入回放 Surface。include/usb_camera/:页面、Presenter 和播放器的接口。CMakeLists.txt:定义usb_camera_sample组件,并设置WHOLE_LINK true。
本示例使用与 Native Launcher 其它页面相同的 NativeUI 结构:
Native Launcher
-> REGIST_MENU
-> UsbCameraPresenter
-> UsbCameraMainPage
-> UIViewGroup、UILabelButton、UIImageView、UILiteSurfaceView
说明:本示例不是独立进程或独立可执行文件,必须随 Native Launcher 和 UIKit 一起编入最终固件。
编译前准备
1. 开启 Sample 和 HAL 层编译
在以下文件中找到 diting-community 目标:
src/build/config/target_config/3322/config.py
在该目标的 defines 列表中增加:
'CONFIG_ENABLE_USB_CAMERA',
2. 将 usb_camera_sample 加入最终组件列表
在同一个 diting-community 目标的 ram_component 列表中增加:
'usb_camera_sample',
3. 开启 USB Host 和 UVC 驱动
pack_diting_community 使用的配置文件为:
src/kernel/liteos/LiteOS/self_src/tools/build/config/3322_nandflash.config
建议开启以下配置:
LOSCFG_DRIVERS_USB=y
LOSCFG_DRIVERS_USB_HOST_DRIVER=y
LOSCFG_DRIVERS_USB_HOST_XHCI=y
LOSCFG_DRIVERS_USB_HOST_XHCI_IOSC_SIA=y
LOSCFG_DRIVERS_USB_HOST_PARAMS_CONFIG=y
LOSCFG_DRIVERS_USB_HOST_MAX_DEVICES=3
LOSCFG_DRIVERS_USB_HOST_CONFIG_LEN=8192
LOSCFG_DRIVERS_USB_HOST_IFACE_MAX=7
LOSCFG_DRIVERS_USB_HOST_MAX_EP_STREAMS=1
LOSCFG_DRIVERS_USB_XHCI_CONFIG=y
LOSCFG_USB_XHCI_MAX_TRANSFERS=4
LOSCFG_USB_XHCI_MAX_SCRATCHPADS=2
LOSCFG_USB_XHCI_MAX_EVENTS=64
LOSCFG_USB_XHCI_INTERRUPT_INTERVAL=8000
LOSCFG_DRIVERS_USB_HOST_STANDALONE_MEM_POOL=y
LOSCFG_DRIVERS_USB_FIFO=y
LOSCFG_DRIVERS_USB_DEVICE_CLASS_DRIVERS=y
LOSCFG_DRIVERS_USB_HOST_UVC_CLASS=y
4. 添加 USB Camera Sample 构建入口
文件:
samples/native_samples/CMakeLists.txt
在 CONFIG_ENABLE_USB_CAMERA 出现在 DEFINES 中时,加入 usb_camera 子目录:
if("CONFIG_ENABLE_USB_CAMERA" IN_LIST DEFINES)
add_subdirectory_if_exist(usb_camera)
endif()
该入口保证 usb_camera_sample 只在开启 CONFIG_ENABLE_USB_CAMERA 时参与
native_samples 构建;未开启宏时不会编译本示例。
5. 选择 USB Camera HAL 实现
文件:
src/middleware/services/media/hal/CMakeLists.txt
在 CHIP 为 brandy 或 3322 时,根据 CONFIG_ENABLE_USB_CAMERA 在两个
Camera Lite HAL 实现之间二选一:
if ("CONFIG_ENABLE_USB_CAMERA" IN_LIST DEFINES)
add_subdirectory_if_exist(usb_camera_lite)
else()
add_subdirectory_if_exist(camera_lite)
endif()
开启 USB Camera 后使用 usb_camera_lite,未开启时保留原有的 camera_lite。
两个目录提供相同的 HalCamera* 接口,不能同时加入构建。
6. 调整 USB 基础库链接位置
文件:
src/drivers/boards/3322_evb/linker/standard/acore/normal/acore.prelds
将 *libusb_base.a:*.o* 的链接规则从 .plt_ramtext 段移到.text 段。
/* Code and const data */
.text : ALIGN(8)
{
...
*libusb_base.a:*.o* (.text .text* .rodata .rodata* .srodata .srodata*)
...
} > FLASH_PROGRAM
7. 增加 Native Launcher 页面 ID
文件:
src/application/wearable/nativeapp/nativelauncher/include/AppViewIDs.h
在 AppViewId 枚举中增加:
VIEW_USB_CAMERA, // USB camera
该 ID 与 UsbCameraPresenter 的 REGIST_MENU 以及
UsbCameraMainPage 的页面注册配套,用于让 Native Launcher 识别和跳转到
USB Camera 页面。
8. 配置
运行前检查
- 摄像头:USB 摄像头符合 UVC 标准,并连接到 3322 的 USB Host 接口。
- USB 选择开关:开发板 USB 选择开关的第 2 位拨到
ON,切换为 USB Host 模式。 - 格式能力:摄像头支持当前 HAL 请求的格式、分辨率和帧率。当前 USB HAL 默认输出
为
640 x 480、30 fps、MJPEG。 - JPEG 解码:当前目标具备 JPEG 硬件解码能力。
App 使用方法
页面按钮
| 按钮 | 功能 | 备注 |
|---|---|---|
Preview |
启动预览 | 预览启动后 framework 层会覆盖页面,需要按电源键退出预览 |
Stop |
停止预览 | 暂时无法使用 |
Capture |
启动拍照 | 文件保存到 /user/cam_capture.jpg |
Photo |
显示已有的照片文件 | 依赖 /user/cam_capture.jpg |
Record |
开始录像 | 录像数据保存到 /user/cam_record.mjpg,开始时会初始化时长文件 |
StopRec |
停止录像 | 录制时长保存到 /user/cam_record.meta,供回放计算节奏 |
Play |
播放录像 | 依赖已生成的 MJPEG 录像文件和 JPEG 硬件解码能力 |
StopPlay |
停止播放录像 | --- |
USB Host |
启动 USB 口供电,初始化 Host UVC 驱动 | 需要在其它操作之前执行 |
Back |
退出照片或录像结果页 | 只有进入结果页后才显示 |
操作顺序
- 唤醒屏幕,在菜单中选择
USB Camera。 - 点击
USB Host,开启摄像头供电并初始化 Host UVC 驱动。 - 根据测试目的选择
Preview、Capture或Record。