跳转至

8 camera-摄像头控制

作者:陈取德 | 最后修改:2026-10-29

一、概述

camera 核心库是 LuatOS 的一个特色功能库,按照顺序调用就可以非常快捷的使用上摄像头外设,完成拍照,扫描任务,并将扫描结果和拍照文件存储。根据摄像头类型的不同分为三种使用逻辑:

  1. SPI 摄像头:

  2. 适用于 Air700 系列、Air780 系列、Air8000 系列产品;

  3. 目前合宙支持 gc0310、gc032a、bf30a2 三款摄像头,并且已经制作好了官方配置表,使用时只需要使用配置的函数初始化摄像头后,就可以调用 camera.capture()接口完成拍照或扫描的任务,再通过 camera.on()函数接收回调数据即可完成拍照或扫描业务;

  4. USB 摄像头:

  5. 适用于 Air8101 系列产品;

  6. 支持多路 USB 摄像头,但是同时只能使用一路摄像头,根据 USB 端口号选择对应的摄像头,调用对应的初始化和拍照接口即可完成拍照业务;

  7. DVP 摄像头:

  8. 适用于 Air8101 系列产品;

  9. 支持单路 DVP 摄像头,camera.init()初始化完成后执行 camera.capture()接口完成拍照或扫描任务即可完成拍照任务;

二、核心示例

1、核心示例是指:使用本库文件提供的核心 API,开发的基础业务逻辑的演示代码;

2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;

3、更加完整和详细的 demo,请参考 LuatOS 仓库 中各个产品目录下的 demo/camera

--[[
本核心示例的业务逻辑为:
1、创建并启动一个基础task,task名称为"camera_capture_func",在task的任务开始时阻塞等待拍照任务触发,触发后处理拍照业务的完整过程;
2、创建并启动一个基础task,task名称为"camera_press",在task的任务设定循环定时器,定时触发拍照任务;
]]

PROJECT = "camera_test"
VERSION = "001.000.000"

-- 导入gc032a摄像头驱动模块
require "gc032a"

-- 摄像头扫描模式设置:0表示拍照模式,1表示扫描模式
local scanmode = 0
-- 图像数据格式设置:0表示使用完整的YUV/RGB格式,1表示仅Y通道
local only_Y = 0

-- CAM_3V3: 控制摄像头3.3V电源的GPIO(引脚2),初始状态为关闭(0)
local CAM_3V3 = gpio.setup(2, 0)
-- CAM_PD: 控制摄像头电源使能的GPIO(引脚5),初始状态为使能(1),注意这里是高电平关闭摄像头
local CAM_PD = gpio.setup(5, 1)
-- LED: 控制补光灯的GPIO(GPIO25),初始状态为关闭(0)
local LED = gpio.setup(25, 0)

-- 摄像头事件处理函数
-- 当摄像头捕获到数据或状态变化时触发
-- 参数id: 摄像头ID
-- 参数str: 摄像头返回的数据或状态标志
local function camera_event(id, str)
    -- 如果返回字符串,表示扫码成功并获得结果
    if type(str) == 'string' then
        log.info("扫码结果", str)
    -- 如果返回false,表示摄像头没有有效数据
    elseif str == false then
        log.error("摄像头没有数据")
    -- 如果返回true或数字,表示成功捕获到图像文件大小
    elseif str == true or type(str) == 'number' then
        log.info("摄像头数据", str)
        -- 发布CAPTURE_DONE事件,通知其他任务拍照已完成
        sys.publish("CAPTURE_DONE", true)
    end
end

-- 摄像头拍照功能核心函数
local function camera_capture_func()
    -- 初始化SPI和I2C接口ID
    local cspiId, i2cId = 1, 1
    -- 摄像头ID变量,将在初始化时赋值
    local camera_id

    -- 无限循环,持续监听并响应拍照请求
    while true do
        log.debug("摄像头拍照")
        -- 等待ONCE_CAPTURE事件触发拍照流程
        sys.waitUntil("ONCE_CAPTURE")

        -- 删除上一次拍摄的照片,为新照片准备空间
        os.remove("/text.jpg")
        log.info("上一张照片已删除")

        -- 初始化I2C接口,使用快速模式(400kHz)
        i2c.setup(i2cId, i2c.FAST)

        -- 打开摄像头电源
        CAM_3V3(1)  -- 开启3.3V电源
        CAM_PD(0)   -- 关闭电源使能(低电平有效,此时摄像头开始工作)
        LED(1)      -- 点亮LED指示灯,表示摄像头开始工作

        -- 初始gc032A摄像头
        -- 参数依次为:SPI ID、I2C ID、时钟频率(24MHz)、扫描模式、数据格式标志
        camera_id = gc032aInit(cspiId, i2cId, 24000000, scanmode, only_Y)
        log.info("初始化状态", camera_id)

        -- 注册摄像头数据扫描事件回调函数
        camera.on(0, "scanned", camera_event)

        -- 拍摄照片并保存到指定路径
        -- 参数:摄像头ID、保存路径、照片质量(1为高质量)
        camera.capture(camera_id, "/text.jpg", 1)
        log.info("拍完了")

        -- 等待拍照完成事件,设置5秒超时
        local result, data = sys.waitUntil("CAPTURE_DONE", 5000)
        log.info("等待结果是", result)

        -- 清理资源,关闭外设
        camera.close(camera_id)  -- 关闭摄像头
        i2c.close(i2cId)         -- 关闭I2C接口
        LED(0)                   -- 关闭LED指示灯
        CAM_3V3(0)               -- 关闭3.3V电源
        CAM_PD(1)                -- 开启电源使能(高电平,关闭摄像头)
    end
end

-- 定时触发拍照的函数
local function camera_press()
    -- 等待网络连接就绪,超时时间为30秒
    -- 如果在30秒内没有获得网络连接,函数将继续执行
    sys.waitUntil("IP_READY", 30000)

    -- 设置定时器,每15秒触发一次拍照事件
    while true do 
        sys.publish("ONCE_CAPTURE")
        sys.wait(15 * 1000)  -- 发布拍照事件,触发拍照流程
    end

end

-- 启动两个任务:摄像头拍照任务和定时触发任务
-- 这两个任务将并行执行
-- 1. camera_capture_func:负责执行实际的拍照操作
-- 2. camera_press:负责定时触发拍照事件
sys.taskInit(camera_capture_func)
sys.taskInit(camera_press)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

三、常量详解

核心库常量,顾名思义是由合宙 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

3.1 camera.AUTO

常量含义:摄像头自动模式,即:摄像头拍照模式;
         因为当前摄像头的功能代码仅支持拍照模式和扫描模式,且摄像头在初始化时就必须指定使用模式
         所以在初始化时,拍照模式使用camera.AUTO,扫描模式使用camera.SCAN;
         注意!!!自动模式仅拍照功能,不会自动跳转扫描功能,如需扫描模式需要重新初始化!
数据类型:number;
适用产品:Air780E系列、Air700E系列、Air8000系列、Air8101系列、Air72X系列、Air820系列;
示例代码:--如下方所示,配置摄像头初始化中第九个参数为摄像头工作在自动模式;
         camera.init(1,25500000,1,1,2,1,0x00010101,0,camera.AUTO,640,480)

3.2 camera.SCAN

常量含义:摄像头扫描模式;
         因为当前摄像头的功能代码仅支持拍照模式和扫描模式,且摄像头在初始化时就必须指定使用模式
         所以在初始化时,拍照模式使用camera.AUTO,扫描模式使用camera.SCAN;
         注意!!!自动模式仅拍照功能,不会自动跳转扫描功能,如需切换模式需要重新初始化!
数据类型:number;
适用产品:Air780E系列、Air700E系列、Air8000系列;
示例代码:--如下方所示,配置摄像头初始化中第九个参数为摄像头工作在扫描模式;
         camera.init(1,25500000,1,1,2,1,0x00010101,0,camera.SCAN,640,480)

3.3 camera.USB

常量含义:摄像头接口类型为USB的摄像头;
数据类型:number;
适用产品:Air8101系列;
示例代码:--如下方所示,初始化一个USB摄像头;
         local usb_camera_table = {
               id = camera.USB,
               sensor_width = 1280,
               sensor_height = 720 }
         camera.init(usb_camera_table)

3.4 camera.DVP

常量含义:摄像头接口类型为DVP的摄像头;
数据类型:number;
适用产品:Air8101系列;
示例代码:--如下方所示,初始化一个DVP摄像头;
         local dvp_camera_table = {
               id = camera.DVP,
               sensor_width = 1280,     
               sensor_height = 720 }
         camera.init(dvp_camera_table)

3.5 camera.ROTATE_0

常量含义:摄像头预览,画面不旋转;
数据类型:number;
适用产品:Air8101系列;
示例代码:--如下方所示,第三个参数为配置摄像头的预览画面不旋转,默认不旋转,可不配置;
         camera.config(0, camera.CONF_PREVIEW_ROTATE, camera.ROTATE_0)

3.6 camera.ROTATE_90

常量含义:摄像头预览,画面顺时针旋转90度;
数据类型:number;
适用产品:Air8101系列;
示例代码:--如下方所示,第三个参数配置摄像头的预览画面顺时针旋转90度;
         camera.config(0, camera.CONF_PREVIEW_ROTATE, camera.ROTATE_90)

3.7 camera.ROTATE_270

常量含义:摄像头预览,画面顺时针旋转270度;
数据类型:number;
适用产品:Air8101系列;
示例代码:--如下方所示,第三个参数配置摄像头的预览画面顺时针旋转270度;
         camera.config(0, camera.CONF_PREVIEW_ROTATE, camera.ROTATE_270)

3.8 camera.ROTATE_180

常量含义:摄像头预览,画面顺时针旋转180度;
数据类型:number;
适用产品:Air8101系列;
示例代码:--如下方所示,第三个参数配置摄像头的预览画面顺时针旋转180度;
         camera.config(0, camera.CONF_PREVIEW_ROTATE, camera.ROTATE_180)

3.9 camera.CONF_PREVIEW_ENABLE

常量含义:摄像头预览功能,默认开启;
数据类型:number;
适用产品:Air8101系列;
示例代码:--如下方所示,第三个参数配置开启摄像头预览;
         camera.config(0, camera.CONF_PREVIEW_ENABLE, 1)

3.10 camera.CONF_PREVIEW_ROTATE

常量含义:摄像头预览画面的旋转角度;
数据类型:number;
适用产品:Air8101系列;
示例代码:--如下方所示,第二个参数为配置摄像头旋转角度功能,第三个参数则是实际的旋转角度参数;
         camera.config(0, camera.CONF_PREVIEW_ROTATE, camera.ROTATE_90)

3.11 camera.CONF_UVC_FPS

常量含义:设置USB摄像头的帧率;
数据类型:number;
示例代码:--如下方所示,第二个参数为配置USB摄像头的帧率功能,第三个参数则是帧率参数;
         camera.config(0, camera.CONF_UVC_FPS, 15)

3.12 camera.CONF_LOG_LEVEL

常量含义:设置摄像头日志级别;
          摄像头驱动内部的调试打印比较频繁,级别开高会明显拖慢出图速度,
          排查问题时临时调大,正常使用建议关掉;
数据类型:number;
示例代码:--如下方所示,第二个参数为配置摄像头日志级别功能,第三个参数为具体级别;
         camera.config(0, camera.CONF_LOG_LEVEL, 1)

3.13 camera.CONF_UVC_FORMAT

常量含义:USB摄像头数据流类型;
数据类型:number;
示例代码:--查询USB摄像头数据流有多少种类型
        camera.get_usb_config(id, camera.CONF_UVC_FORMAT)

3.14 camera.CONF_UVC_RESOLUTION

常量含义:USB摄像头的数据流中具体数据信息,包括图像大小和帧率;
数据类型:number;
示例代码:--查询USB摄像头某种数据流下某种图像类型的具体参数
        camera.get_usb_config(id, camera.CONF_UVC_RESOLUTION, 1, 3) 

3.15 camera.FORMAT_RAW

常量含义:USB摄像头数据流类型无压缩原始图像;
数据类型:number;
示例代码:--设置USB摄像头使用的数据流
        camera.set_usb_config(id, camera.FORMAT_RAW)

3.16 camera.FORMAT_MJPG

常量含义:USB摄像头的数据流类型mjpg;
数据类型:number;
示例代码:--设置USB摄像头使用的数据流和图像类型序号
        --配置USB摄像头使用数据流1下第6种图像类型
        camera.set_usb_config(id, camera.CONF_UVC_RESOLUTION, camera.FORMAT_MJPG, 5)

3.17 camera.FORMAT_H264

常量含义:USB摄像头的数据流类型H264;
数据类型:number;
示例代码:--设置USB摄像头使用的数据流类型,宽度,高度
        camera.set_usb_config(app_id, camera.CONF_UVC_RESOLUTION, camera.FORMAT_H264, SENSOR_W, SENSOR_H)

3.18 camera.CONF_H264_QP_INIT

常量含义:H264编码器初始化QP值;
数据类型:number;
示例代码:--设置H264编码器初始化QP值
        camera.config(0, camera.CONF_H264_QP_INIT, 40)

3.19 camera.CONF_H264_QP_I_MAX

常量含义:H264编码器I的最大QP值;
数据类型:number;
示例代码:--设置H264编码器I的最大QP值
        camera.config(0, camera.CONF_H264_QP_I_MAX, 40)

3.20 camera.CONF_H264_QP_P_MAX

常量含义:H264编码器P的最大QP值;
数据类型:number;
示例代码:--设置H264编码器P的最大QP值
        camera.config(0, camera.CONF_H264_QP_P_MAX, 25)

3.21 camera.CONF_H264_IMB_BITS

常量含义:H264编码器IMB_BITS值;
数据类型:number;
示例代码:--设置H264编码器IMB_BITS值
        camera.config(0, camera.CONF_H264_IMB_BITS, 8)

3.22 camera.CONF_H264_PMB_BITS

常量含义:H264编码器PMB_BITS值;
数据类型:number;
示例代码:--H264编码器PMB_BITS值
        camera.config(0, camera.CONF_H264_PMB_BITS, 4)

3.23 camera.CONF_H264_PFRAME_NUMS

常量含义:H264编码器P帧数量;
数据类型:number;
示例代码:--设置H264编码器P帧数量
        camera.config(0, camera.CONF_H264_PFRAME_NUMS, 29)

3.24 camera.CONF_H264_APPLY

常量含义:立即应用 H264 编码器的设置;
          QP / IMB_BITS / PMB_BITS / PFRAME_NUMS 这些参数改完之后只是写进了配置,
          必须再发一次本常量(值随便给个 1)编码器才会真正生效;
数据类型:number;
示例代码:--如下方所示,改完QP值后立即生效;
         camera.config(0, camera.CONF_H264_QP_INIT, 40)
         camera.config(0, camera.CONF_H264_APPLY, 1)

3.25 camera.SCAN_FMT_1D

常量含义:扫码格式——1D 条形码,包含 CODABAR、Code128、Code93、Code39、Code32、PZN、
          ITF、ITF-14、DATABAR、EAN_UPC、EAN13、EAN8、EAN5、EAN2、UPC、ISBN、BARCODE、
          TELEPEN、DX_FILM_EDGE;
数据类型:number;
适用产品:带硬件扫码能力的型号(Air8101 系列、Air1601/Air1602 等);
示例代码:--只解一维码,其它码制不参与,解码更快;
         camera.stream(camera.USB, app_id, 0, 1024, false, true, camera.SCAN_FMT_1D)

3.26 camera.SCAN_FMT_QR

常量含义:扫码格式——QR Code(二维码),消费领域最常用;
数据类型:number;
适用产品:带硬件扫码能力的型号(Air8101 系列、Air1601/Air1602 等);
示例代码:--只解二维码;
         camera.stream(camera.USB, app_id, 0, 1024, false, true, camera.SCAN_FMT_QR)

3.27 camera.SCAN_FMT_DM

常量含义:扫码格式——Data Matrix,常用于电子元件丝印、医疗器械、制造业零部件追踪;
数据类型:number;
适用产品:带硬件扫码能力的型号(Air8101 系列、Air1601/Air1602 等);
示例代码:camera.stream(camera.USB, app_id, 0, 1024, false, true, camera.SCAN_FMT_DM)

3.28 camera.SCAN_FMT_AZTEC

常量含义:扫码格式——Aztec Code,常用于交通票务、航空登机牌;
数据类型:number;
适用产品:带硬件扫码能力的型号(Air8101 系列、Air1601/Air1602 等);
示例代码:camera.stream(camera.USB, app_id, 0, 1024, false, true, camera.SCAN_FMT_AZTEC)

3.29 camera.SCAN_FMT_PDF417

常量含义:扫码格式——PDF417,常用于身份证、驾照、物流单据、美国邮政;
数据类型:number;
适用产品:带硬件扫码能力的型号(Air8101 系列、Air1601/Air1602 等);
示例代码:camera.stream(camera.USB, app_id, 0, 1024, false, true, camera.SCAN_FMT_PDF417)

3.30 camera.SCAN_FMT_MAXICODE

常量含义:扫码格式——MaxiCode,主要用于 UPS 快递包裹分拣;
数据类型:number;
适用产品:带硬件扫码能力的型号(Air8101 系列、Air1601/Air1602 等);
示例代码:camera.stream(camera.USB, app_id, 0, 1024, false, true, camera.SCAN_FMT_MAXICODE)

3.31 camera.SCAN_FMT_ALL

常量含义:扫码格式——全部码制都试一遍,是 camera.stream 扫码参数的默认值;
          码制开得越多,单帧解码耗时越长;明确知道只扫哪种码时,用上面单个常量更快;
数据类型:number;
适用产品:带硬件扫码能力的型号(Air8101 系列、Air1601/Air1602 等);
示例代码:camera.stream(camera.USB, app_id, 0, 1024, false, true, camera.SCAN_FMT_ALL)

下面 3.32 起的这组常量是 USB 摄像头(UVC)的标准控制选择子,只在使用 USB 摄像头、配合 camera.ctrl_plane_get / camera.ctrl_plane_set 时用到,源码注释标注这几组控制项当前仅 Air1601 系列可用(Air1602/Air1603 同一套固件、同一版本号下核心库一致)。其中 Camera Terminal(CT)类选择子在 0x01~0x14 之间;Processing Unit(PU)类选择子带 0x80 掩码,例如 camera.UVC_PU_BRIGHTNESS 的实际取值是 0x82,脚本里直接用常量,不要手写数值。

3.32 camera.UVC_CT_SCANNING_MODE

常量含义:USB 摄像头 Camera Terminal(CT)的“扫描模式”控制选择子,CT 控制号 0x01;扫描模式:隔行采集开关,1 表示开启,1 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_SCANNING_MODE);

3.33 camera.UVC_CT_AE_MODE

常量含义:USB 摄像头 Camera Terminal(CT)的“AE 模式”控制选择子,CT 控制号 0x02;AE 模式:手动/自动光圈/自动曝光/快门优先的组合位图,1 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_AE_MODE);

3.34 camera.UVC_CT_AE_PRIORITY

常量含义:USB 摄像头 Camera Terminal(CT)的“AE 优先级”控制选择子,CT 控制号 0x03;AE 优先级:优先保快门速度还是优先保光圈,1 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_AE_PRIORITY);

3.35 camera.UVC_CT_EXPOSURE_ABSOLUTE

常量含义:USB 摄像头 Camera Terminal(CT)的“绝对曝光时间”控制选择子,CT 控制号 0x04;绝对曝光时间:直接写曝光时长,单位 100us,4 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_EXPOSURE_ABSOLUTE);

3.36 camera.UVC_CT_EXPOSURE_RELATIVE

常量含义:USB 摄像头 Camera Terminal(CT)的“相对曝光时间”控制选择子,CT 控制号 0x05;相对曝光时间:在当前值上加减步进,1 字节有符号;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_EXPOSURE_RELATIVE);

3.37 camera.UVC_CT_FOCUS_ABSOLUTE

常量含义:USB 摄像头 Camera Terminal(CT)的“绝对对焦”控制选择子,CT 控制号 0x06;绝对对焦:镜头焦点位置,2 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_FOCUS_ABSOLUTE);

3.38 camera.UVC_CT_FOCUS_RELATIVE

常量含义:USB 摄像头 Camera Terminal(CT)的“相对对焦”控制选择子,CT 控制号 0x07;相对对焦:方向+步数+速度,只有定焦(非变焦)镜头可用;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_FOCUS_RELATIVE);

3.39 camera.UVC_CT_FOCUS_AUTO

常量含义:USB 摄像头 Camera Terminal(CT)的“自动对焦”控制选择子,CT 控制号 0x08;自动对焦开关,1 表示开启,1 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_FOCUS_AUTO);

3.40 camera.UVC_CT_IRIS_ABSOLUTE

常量含义:USB 摄像头 Camera Terminal(CT)的“绝对光圈”控制选择子,CT 控制号 0x09;绝对光圈:光圈位置/步进值,2 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_IRIS_ABSOLUTE);

3.41 camera.UVC_CT_IRIS_RELATIVE

常量含义:USB 摄像头 Camera Terminal(CT)的“相对光圈”控制选择子,CT 控制号 0x0A;相对光圈:在当前值上加减步进,1 字节有符号;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_IRIS_RELATIVE);

3.42 camera.UVC_CT_ZOOM_ABSOLUTE

常量含义:USB 摄像头 Camera Terminal(CT)的“绝对变焦”控制选择子,CT 控制号 0x0B;绝对变焦:变焦位置(物方焦距,单位 mm),2 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_ZOOM_ABSOLUTE);

3.43 camera.UVC_CT_ZOOM_RELATIVE

常量含义:USB 摄像头 Camera Terminal(CT)的“相对变焦”控制选择子,CT 控制号 0x0C;相对变焦:方向+步数+速度,3 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_ZOOM_RELATIVE);

3.44 camera.UVC_CT_PANTILT_ABSOLUTE

常量含义:USB 摄像头 Camera Terminal(CT)的“绝对云台”控制选择子,CT 控制号 0x0D;绝对云台:Pan/Tilt 绝对角度,各 4 字节共 8 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_PANTILT_ABSOLUTE);

3.45 camera.UVC_CT_PANTILT_RELATIVE

常量含义:USB 摄像头 Camera Terminal(CT)的“相对云台”控制选择子,CT 控制号 0x0E;相对云台:Pan/Tilt 方向+步数+速度,8 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_PANTILT_RELATIVE);

3.46 camera.UVC_CT_ROLL_ABSOLUTE

常量含义:USB 摄像头 Camera Terminal(CT)的“绝对旋转”控制选择子,CT 控制号 0x0F;绝对旋转:绕光轴角度的绝对值,2 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_ROLL_ABSOLUTE);

3.47 camera.UVC_CT_ROLL_RELATIVE

常量含义:USB 摄像头 Camera Terminal(CT)的“相对旋转”控制选择子,CT 控制号 0x10;相对旋转:绕光轴方向+步数,2 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_ROLL_RELATIVE);

3.48 camera.UVC_CT_PRIVACY

常量含义:USB 摄像头 Camera Terminal(CT)的“隐私遮挡”控制选择子,CT 控制号 0x11;隐私遮挡开关,1 表示遮挡、不出画面,1 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_PRIVACY);

3.49 camera.UVC_CT_FOCUS_SIMPLE

常量含义:USB 摄像头 Camera Terminal(CT)的“简易对焦”控制选择子,CT 控制号 0x12;简易对焦:0 释放、1 锁定,UVC 1.5 新增;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_FOCUS_SIMPLE);

3.50 camera.UVC_CT_WINDOW

常量含义:USB 摄像头 Camera Terminal(CT)的“窗口控制”控制选择子,CT 控制号 0x13;窗口控制:AE/AF 作用的窗口位置与尺寸,UVC 1.5 新增;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_WINDOW);

3.51 camera.UVC_CT_ROI

常量含义:USB 摄像头 Camera Terminal(CT)的“感兴趣区域”控制选择子,CT 控制号 0x14;感兴趣区域(ROI):AE/AF 生效的矩形区域,UVC 1.5 新增;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_CT_ROI);

3.52 camera.UVC_PU_BACKLIGHT

常量含义:USB 摄像头 Processing Unit(PU)的“背光补偿”控制选择子,PU 控制号 0x01,常量实际取值为 0x81(0x80|0x01);背光补偿:逆光下提升暗部亮度,2 字节有符号;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_BACKLIGHT);

3.53 camera.UVC_PU_BRIGHTNESS

常量含义:USB 摄像头 Processing Unit(PU)的“亮度”控制选择子,PU 控制号 0x02,常量实际取值为 0x82(0x80|0x02);亮度:画面整体明暗,2 字节有符号;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_BRIGHTNESS);

3.54 camera.UVC_PU_CONTRAST

常量含义:USB 摄像头 Processing Unit(PU)的“对比度”控制选择子,PU 控制号 0x03,常量实际取值为 0x83(0x80|0x03);对比度:明暗反差,2 字节无符号;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_CONTRAST);

3.55 camera.UVC_PU_GAIN

常量含义:USB 摄像头 Processing Unit(PU)的“增益”控制选择子,PU 控制号 0x04,常量实际取值为 0x84(0x80|0x04);增益:图像信号放大倍数,2 字节无符号;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_GAIN);

3.56 camera.UVC_PU_POWER_LINE_FREQUENCY

常量含义:USB 摄像头 Processing Unit(PU)的“工频防闪烁”控制选择子,PU 控制号 0x05,常量实际取值为 0x85(0x80|0x05);工频防闪烁:0 禁用、1 50Hz、2 60Hz、3 自动;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_POWER_LINE_FREQUENCY);

3.57 camera.UVC_PU_HUE

常量含义:USB 摄像头 Processing Unit(PU)的“色相”控制选择子,PU 控制号 0x06,常量实际取值为 0x86(0x80|0x06);色相:色调偏移,2 字节有符号;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_HUE);

3.58 camera.UVC_PU_SATURATION

常量含义:USB 摄像头 Processing Unit(PU)的“饱和度”控制选择子,PU 控制号 0x07,常量实际取值为 0x87(0x80|0x07);饱和度:色彩浓淡,2 字节无符号;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_SATURATION);

3.59 camera.UVC_PU_SHARPNESS

常量含义:USB 摄像头 Processing Unit(PU)的“锐度”控制选择子,PU 控制号 0x08,常量实际取值为 0x88(0x80|0x08);锐度:边缘增强强度,2 字节无符号;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_SHARPNESS);

3.60 camera.UVC_PU_GAMMA

常量含义:USB 摄像头 Processing Unit(PU)的“伽马校正”控制选择子,PU 控制号 0x09,常量实际取值为 0x89(0x80|0x09);伽马校正:取值=gamma×100,2 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_GAMMA);

3.61 camera.UVC_PU_WB_TEMPERATURE

常量含义:USB 摄像头 Processing Unit(PU)的“白平衡色温”控制选择子,PU 控制号 0x0A,常量实际取值为 0x8A(0x80|0x0A);白平衡色温:直接写色温,单位 K,2 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_WB_TEMPERATURE);

3.62 camera.UVC_PU_WB_TEMPERATURE_AUTO

常量含义:USB 摄像头 Processing Unit(PU)的“白平衡自动(色温模式)”控制选择子,PU 控制号 0x0B,常量实际取值为 0x8B(0x80|0x0B);白平衡自动(色温模式)开关,1 表示自动,1 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_WB_TEMPERATURE_AUTO);

3.63 camera.UVC_PU_WB_COMPONENT

常量含义:USB 摄像头 Processing Unit(PU)的“分量白平衡”控制选择子,PU 控制号 0x0C,常量实际取值为 0x8C(0x80|0x0C);分量白平衡:蓝/红增益各 2 字节,共 4 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_WB_COMPONENT);

3.64 camera.UVC_PU_WB_COMPONENT_AUTO

常量含义:USB 摄像头 Processing Unit(PU)的“分量白平衡自动”控制选择子,PU 控制号 0x0D,常量实际取值为 0x8D(0x80|0x0D);分量白平衡自动开关,1 表示自动,1 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_WB_COMPONENT_AUTO);

3.65 camera.UVC_PU_DIGITAL_MULTIPLIER

常量含义:USB 摄像头 Processing Unit(PU)的“数字倍率”控制选择子,PU 控制号 0x0E,常量实际取值为 0x8E(0x80|0x0E);数字倍率:数码变焦/数字增益倍数,2 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_DIGITAL_MULTIPLIER);

3.66 camera.UVC_PU_DIGITAL_MULTIPLIER_LIMIT

常量含义:USB 摄像头 Processing Unit(PU)的“数字倍率上限”控制选择子,PU 控制号 0x0F,常量实际取值为 0x8F(0x80|0x0F);数字倍率上限:约束数字倍率的最大值;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_DIGITAL_MULTIPLIER_LIMIT);

3.67 camera.UVC_PU_HUE_AUTO

常量含义:USB 摄像头 Processing Unit(PU)的“色相自动”控制选择子,PU 控制号 0x10,常量实际取值为 0x90(0x80|0x10);色相自动校正开关,1 表示自动,1 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_HUE_AUTO);

3.68 camera.UVC_PU_ANALOG_VIDEO_STANDARD

常量含义:USB 摄像头 Processing Unit(PU)的“模拟视频制式”控制选择子,PU 控制号 0x11,常量实际取值为 0x91(0x80|0x11);模拟视频制式:NTSC/PAL/SECAM,仅模拟输入设备有效;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_ANALOG_VIDEO_STANDARD);

3.69 camera.UVC_PU_ANALOG_LOCK_STATUS

常量含义:USB 摄像头 Processing Unit(PU)的“模拟信号锁定状态”控制选择子,PU 控制号 0x12,常量实际取值为 0x92(0x80|0x12);模拟信号锁定状态:只读,指示是否锁定到有效信号;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_ANALOG_LOCK_STATUS);

3.70 camera.UVC_PU_CONTRAST_AUTO

常量含义:USB 摄像头 Processing Unit(PU)的“对比度自动”控制选择子,PU 控制号 0x13,常量实际取值为 0x93(0x80|0x13);对比度自动开关,UVC 1.5 新增,1 字节;
数据类型:number;
适用产品:Air1601 / Air1602 / Air1603(USB UVC 摄像头);
注意事项:只在使用 USB 摄像头时配合 camera.ctrl_plane_get、camera.ctrl_plane_set 使用,脚本里直接用常量,不要手写数值;
示例代码:camera.ctrl_plane_get(app_id, camera.UVC_PU_CONTRAST_AUTO);

四、函数详解

4.1 camera.init(InitReg_or_cspi_id, cspi_speed, mode, is_msb, rx_bit, seq_type, is_ddr, only_y, scan_mode, w, h)

功能

  1. SPI 摄像头:

  2. 初始化摄像头,因为摄像头的初始化配置参数需要向摄像头对应的配置寄存器中写入参数,一般会有一两百个参数需要配置,所以我们制作了 gc0310、gc032a、bf30a2 这三款当前支持的摄像头参数配置表,并且将摄像头初始化参数的默认值已经写好,在使用这三个型号的摄像头时只需要 require 对应的配置表,并且调用对应的初始化函数(例如:gc0310Init())即可;

  3. USB、DVP 摄像头:

  4. 在 Air8101 系列上支持多路 USB 摄像头,在多路摄像头使用时需要注意摄像头初始化动作,详情可参考文档 8101 多摄像头使用指南;

注意事项

  • 如果对照片的大小有要求时,不要修改摄像头初始化时的像素参数,会造成摄像头初始化错误,初始化不会报错,但是回调会收不到任何信息。如需较小的照片结果请直接使用camera.capture()接口的裁切功能,直接输出裁切好的照片即可!

参数

InitReg_or_cspi_id

参数含义:摄像头参数根据摄像头接口分三种情况
         1、SPI摄像头:此处需填写使用的spi编号,如使用的是SPI1,则填1;
         2、USB摄像头:此处填写摄像头类型常量、分辨率和USB端口号;
         3、DVP摄像头:此处填写摄像头类型常量、分辨率;
数据类型:table/number;
取值范围:1、SPI摄像头(number):0-1;
         2、USB摄像头(table):camera.USB、分辨率和USB端口号;
         3、DVP摄像头(table):camera.DVP、分辨率;
是否必选:必须传入此参数;
注意事项:USB摄像头和DVP摄像头均以table形式传入,不需要配置后续参数;
         SPI摄像头只需要传入所使用的SPI线号,需要配置后续参数;
参数示例:--如下方所示,为DVP摄像头初始化传入的第一个参数;
         local camera_id = camera.DVP
         local dvp_camera_table = {
               id = camera_id,
               sensor_width = 1280,
               sensor_height = 720
               }
         local result = camera.init(dvp_camera_table)

         --如下方所示,为USB摄像头初始化传入的第一个参数;
         local camera_id = camera.USB
         local usb_camera_table = {
               id = camera_id,
               sensor_width = 1280,
               sensor_height = 720,
               usb_port = 1
               }
         local result = camera.init(usb_camera_table)

         --如下方所示,为SPI摄像头初始化传入的第一个参数;
         local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

cspi_speed

参数含义:摄像头SPI速率参数;
数据类型:number;
取值范围:24000000;
是否必选:必须传入此参数;
注意事项:gc0310和gc032a的最大输入时钟频率为24 MHz;
         所以默认输入24000000,其余摄像头需根据摄像的规格书决定;
参数示例:--如下方所示,第二参数为SOC和摄像头之间的通信速率为24MHz;
         local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

mode

参数含义:摄像头SPI工作模式;
数据类型:number;
取值范围:0-3;
是否必选:必须传入此参数;
注意事项:根据摄像头的SPI协议工作模式决定;
         gc032a/gc0310均是SPI工作模式1;
         bf30a2是SPI工作模式0;
参数示例:--如下方所示,第三参数为SOC的SPI工作模式为1;
         local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

is_msb

参数含义:SPI传输中的BIT顺序是否为MSB;
数据类型:number;
取值范围:0为否、1为是;
是否必选:必须传入此参数;
注意事项:参考摄像头规格书;
         gc032a/gc0310为1;
         bf30a2为0;
参数示例:--如下方所示,第四参数为以MSB最高有效位开始传输;
         local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

rx_bit

参数含义:摄像头SPI传输中单个时钟周期内能够接收的数据位数量;
数据类型:number;
取值范围:1、2、4;
是否必选:必须传入此参数;
注意事项:参考摄像头规格书;
         gc032a/gc0310为2;
         bf30a2为1;
参数示例:--如下方所示,第五参数为单个时钟周期内能够接收的数据位数量为2个bit;
         local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

seq_type

参数含义:摄像头SPI传输中的字节顺序;
数据类型:number;
取值范围:1为大端序,0为小端序;
是否必选:必须传入此参数;
注意事项:参考摄像头规格书;
         gc032a/gc0310为1;
         bf30a2为0;
参数示例:--如下方所示,第六参数为字节顺序以大端序传输;
         local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

is_ddr

参数含义:摄像头SPI-ddr模式;
数据类型:number;
取值范围:0x00010101;
是否必选:必须传入此参数;
注意事项:参考摄像头规格书,开始DDR模式后支持双边采样;
         可在单个时钟周期内能够接收2个数据位,gc032a/gc0310为0x00010101;
         bf30a2为0;
参数示例:--如下方所示,第七参数为开始SPI-ddr模式,双边采样;
         local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

only_y

参数含义:摄像头是否只采集亮度信息;
数据类型:number;
取值范围:0-1;
是否必选:必须传入此参数;
注意事项:应用于扫码模式,扫码时只需要采集Y分量,即亮度信息即可,不需要采集颜色信息;
         拍照模式此参数为0,扫描模式此参数为1;
参数示例:--如下方所示,第七参数为关闭只采集Y分量,即关闭扫描模式;
         local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

scan_mode

参数含义:是否为扫描模式;
数据类型:number;
取值范围:0-1;
是否必选:必须传入此参数;
注意事项:拍照模式传入0,扫描模式传入1,扫描模式时,only_y需要填1;
参数示例:--如下方所示,第八参数为非扫描模式,所以only_y也为0;
         local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

w

参数含义:摄像头分辨率宽度;
数据类型:number;
取值范围:参考摄像头规格书;
是否必选:必须传入此参数;
注意事项:各类摄像头分辨率不同,以gc032a/gc0310举例,他们的分辨率宽度均为640像素,所以传入640;
         bf30a2为的分辨率宽度为240,所以传入240;
参数示例:--如下方所示,第九参数为分辨率宽度640;
         local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

h

参数含义:摄像头分辨率高度;
数据类型:number;
取值范围:参考摄像头规格书;
是否必选:必须传入此参数;
注意事项:各类摄像头分辨率不同,以gc032a/gc0310举例,他们的分辨率高度均为480像素,所以传入480;
         bf30a2为的分辨率高度为320,所以传入320;
参数示例:--如下方所示,第十参数为分辨率宽度480;
         local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

返回值

local result = camera.init(InitReg_or_cspi_id, cspi_speed, mode, is_msb, rx_bit, seq_type, is_ddr, only_y, scan_mode, w, h)

会有一个返回值 result

result

参数含义:摄像头初始化结果;
数据类型:boolean or number;
取值范围:成功时返回摄像头ID,失败时返回false;
注意事项:摄像头执行时都是通过回调函数来通知结果,并且都是推送至初始化成功后返回的摄像头ID;
参数示例:--如下方所示,摄像头初始化成功后会返回摄像头ID给result,需要用这个ID注册回调;
         local result = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

例子

--如下方所示,为DVP摄像头初始化传入的第一个参数;
local camera_id = camera.DVP
local dvp_camera_table = {
      id = camera_id,
      sensor_width = 1280,
      sensor_height = 720
      }
local result = camera.init(dvp_camera_table)

--如下方所示,为USB摄像头初始化传入的第一个参数;
local camera_id = camera.USB
local usb_camera_table = {
      id = camera_id,
      sensor_width = 1280,
      sensor_height = 720,
      usb_port = 1
      }
local result = camera.init(usb_camera_table)

--如下方所示,为SPI摄像头初始化传入的第一个参数;
local id = camera.init(1,24000000,1,1,2,1,0x00010101,0,0,640,480)

4.2 camera.config(id, key, value)

功能

配置摄像头的单个参数,目前用于 H.264 编码相关的参数调整(QP 值、宏块位深、I/P 帧数量、参数生效等)。

源码注释标明该接口 2025.03.17 新增,当前仅 Air8101 可用;其它平台调用时底层返回“not support yet”,不会报错但也不起作用。参数改完一般要再调一次 camera.config(id, camera.CONF_H264_APPLY, 1) 让配置生效。

参数

id

参数含义:camera id;
数据类型:number;
取值范围:camera.init() 的返回值;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0;

key

参数含义:配置项 id;
数据类型:number;
取值范围:第三章里 CONF_H264 这一组常量,例如 camera.CONF_H264_QP_INIT、camera.CONF_H264_QP_I_MAX、camera.CONF_H264_QP_P_MAX、camera.CONF_H264_IMB_BITS、camera.CONF_H264_PMB_BITS,完整清单见 3.18~3.24;
是否必选:必须传入此参数;
注意事项:填了不支持的 key 时底层直接忽略;
参数示例:camera.CONF_H264_QP_INIT;

value

参数含义:配置项的取值;
数据类型:number;
取值范围:随 key 而定,QP 类一般 0~51,位深类一般 1~8;
是否必选:必须传入此参数;
注意事项:取值范围由编码器决定,超出范围时编码器按自己的上限截断,不会报错;
参数示例:16;

返回值

local result = camera.config(id, key, value)

result

含义说明:0 表示配置成功,-1 表示当前平台不支持;
数据类型:number;
取值范围:0 或 -1;
注意事项:源码注释写的是“当前无返回值”,但实际实现会把底层返回值 push 上来,按整数判断更稳妥;
返回示例:0;

示例

camera.config(0, camera.CONF_H264_QP_INIT, 16)
camera.config(0, camera.CONF_H264_QP_I_MAX, 16)
camera.config(0, camera.CONF_H264_QP_P_MAX, 8)
camera.config(0, camera.CONF_H264_IMB_BITS, 3)
camera.config(0, camera.CONF_H264_PMB_BITS, 1)
camera.config(0, camera.CONF_H264_APPLY, 1) --参数生效

4.3 camera.on(id , event , func)

功能

注册摄像头事件回调

注意事项

初始化摄像头成功后,所有摄像头事件均是由回调函数触发,所以在初始化成功后需马上注册回调,及时接收到摄像头执行任务后的结果;

参数

id

参数含义:摄像头初始化后返回的摄像头ID号;
数据类型:number;
取值范围:0-1;
是否必选:必须传入此参数;
注意事项:camera.init()后的返回值;
         可以赋值变量后后续所有camera函数均使用该变量传入,避免造成ID错误配置错误问题;
参数示例:--如下方所示,注册ID为1的摄像头相关回调事件;
         local function camera_event(id, str)
             if type(str) == 'string' then
                log.info("扫码结果", str)
             elseif str == false then
                log.error("摄像头没有数据")
             else
                log.info("摄像头数据", str)
                sys.publish("CAPTURE_DONE", true)
             end
         end
         camera.on(1, "scanned", camera_event(id, str))

event

参数含义:摄像头事件topic;
数据类型:string;
取值范围:"scanned";
是否必选:必须传入此参数;
注意事项:所有摄像头事件均是推送至"scanned"这个topic里,通过判断这个topic所携带的ID和数据即可;
参数示例:--如下方所示,注册ID为1的摄像头相关回调事件
         --判断触发回调时所携带的ID和数据并做出对应的处理;
         local function camera_event(id, str)
             if type(str) == 'string' then
                log.info("扫码结果", str)
             elseif str == false then
                log.error("摄像头没有数据")
             elseif str == true or type(str) == 'number' then
                log.info("摄像头数据", str)
                sys.publish("CAPTURE_DONE", true)
             end
         end
         camera.on(1, "scanned", camera_event(id, str))
         --摄像头会出现四种事件
         false   摄像头没有正常工作,检查硬件和软件配置;
         true    拍照模式下拍照成功并保存完成,可以读取照片文件数据进一步处理,比如读出数据上传;
         number  拍照完成后的照片文件大小;
         string  扫码完成后的扫码结果;

func

参数含义:摄像头回调函数;
数据类型:function;
取值范围:0;
是否必选:必须传入此参数;
注意事项:处理底层推送的摄像头事件所携带的id和数据,参考event的实际事件;
参数示例:--如下方所示,第三个参数是处理各种EVENT事件的回调函数;
         local function camera_event(id, str)
             if type(str) == 'string' then
                log.info("扫码结果", str)
             elseif str == false then
                log.error("摄像头没有数据")
             elseif str == true or type(str) == 'number' then
                log.info("摄像头数据", str)
                sys.publish("CAPTURE_DONE", true)
             end
         end
         camera.on(1, "scanned", camera_event(id, str))

返回值

无

例子

--如下方所示,注册ID为1的摄像头相关回调事件
--判断触发回调时所携带的ID和数据并做出对应的处理;
local function camera_event(id, str)
    if type(str) == 'string' then
       log.info("扫码结果", str)
    elseif str == false then
       log.error("摄像头没有数据")
    elseif str == true or type(str) == 'number' then
       log.info("摄像头数据", str)
       sys.publish("CAPTURE_DONE", true)
    end
end
camera.on(1, "scanned", camera_event(id, str))
--摄像头会出现四种事件
false   摄像头没有正常工作,检查硬件和软件配置;
true    拍照模式下拍照成功并保存完成,可以读取照片文件数据进一步处理,比如读出数据上传;
number  拍照完成后的照片文件大小;
string  扫码完成后的扫码结果;

4.4 camera.start(id)

功能

开始指定的摄像头,在初始化完摄像头后如果并不是马上需要拍照,可以先调用 camera.stop()暂停摄像头,拍照前再调用 camera.start()打开即可;

参数

id

参数含义:摄像头初始化后返回的摄像头ID号;
数据类型:number;
取值范围:0-1;
是否必选:必须传入此参数;
注意事项:camera.init()后的返回值;
         可以赋值变量后,后续所有camera函数均使用该变量传入,避免造成ID错误配置错误问题;
参数示例:--如下方所示,打开ID为1的摄像头,并将打开结果赋值给result;
         local result = camera.start(1)

返回值

local result = camera.start(id)

会有一个返回值 result

result

参数含义:摄像头打开的结果;
数据类型:boolean;
取值范围:成功时返回true,失败时返回false;
注意事项:合宙官方的配置表中有执行camera.start(),不需要额外执行;
参数示例:--如下方所示,摄像头打开成功后返回true;
         local result = camera.start(1)

例子

camera.start(0)

4.5 camera.stop(id)

功能

暂停指定的 camera;

注意事项

是暂停不是关闭,暂停后可直接调用 camera.start()再开启摄像头拍照或者扫描,不需要再初始化;

合宙官方摄像头配置表内已经调用了 camera.start(),如果调用接口 camera.init 初始化后不,需要立马拍照需及时调用 camera.stop()暂停摄像头,避免造成资源浪费;

参数

id

参数含义:摄像头初始化后返回的摄像头ID号;
数据类型:number;
取值范围:0-1;
是否必选:必须传入此参数;
注意事项:camera.init()后的返回值;
         可以赋值变量后后续所有camera函数均使用该变量传入,避免造成ID错误配置错误问题;
参数示例:--如下方所示,暂停ID为1的摄像头,并将暂停结果赋值给result;
         local result = camera.stop(1)

返回值

local result = camera.stop(id)

会有一个返回值 result

result

参数含义:摄像头暂停的结果;
数据类型:boolean;
取值范围:成功时返回true,失败时返回false;
注意事项:合宙官方的配置表中有执行camera.start(),如果不是马上需要拍照或扫描,需要及时暂停;
参数示例:--如下方所示,摄像头暂停成功后返回true;
         local result = camera.stop(1)

例子

camera.stop(0)

4.6 camera.close(id)

功能

关闭指定的 camera,释放相应的 IO 资源

注意事项

Air780 系列、Air700 系列、Air8000 系列:

SPI 摄像头会占用 2 路 I2C、1 路 UART 和 2 路 onewire,在 SPI 摄像头启动时无法复用,所以摄像头业务执行完毕后可以调用 camera.close()关闭摄像头,释放 IO 资源;

Air8101 系列:

DVP 摄像头会占用 1 路 UART、1 路 I2C、6 路 PWM 并且同样管脚可复用一路 SPI 或一路以太网,DVP 摄像头启用时无法复用,所以摄像头业务执行完毕后可以调用 camera.close()关闭摄像头,释放 IO 资源;

参数

id

参数含义:摄像头初始化后返回的摄像头ID号;
数据类型:number;
取值范围:0-1;
是否必选:必须传入此参数;
注意事项:camera.init()后的返回值;
         可以赋值变量后后续所有camera函数均使用该变量传入,避免造成ID错误配置错误问题;
参数示例:--如下方所示,关闭ID为1的摄像头,并将关闭结果赋值给result;
         local result = camera.close(1)

返回值

local result = camera.close(id)

会有一个返回值 result

result

参数含义:摄像头关闭的结果;
数据类型:boolean;
取值范围:成功时返回true,失败时返回false;
注意事项:摄像头业务完成后可关闭SPI摄像头,释放IO资源复用其他业务;
参数示例:--如下方所示,摄像头关闭成功后返回true;
         local result = camera.close(1)

例子

camera.close(0)

4.7 camera.capture(id, save_path, quality, x, y, w, h)

功能

摄像头初始化成功后执行拍照或扫描或录像业务;

可根据参数直接在这个接口里完成照片的裁切动作;

注意事项

执行拍照任务前一定要调用 camera.start()接口将摄像头打开;

如需较小的照片结果请直接使用camera.capture()接口的裁切功能,计算好接口中的x、y、w、h参数,直接输出裁切好的照片即可!

参数

id

参数含义:摄像头初始化后返回的摄像头ID号;
数据类型:number;
取值范围:0-1;
是否必选:必须传入此参数;
注意事项:camera.init()后的返回值;
         可以赋值变量后后续所有camera函数均使用该变量传入,避免造成ID错误配置错误问题;
参数示例:--如下方所示,ID为1的摄像头执行一次拍照任务;
         local result = camera.capture(1, "/capture.jpg", 80)

save_path

参数含义:执行完成拍照或录像任务后的文件保存路径;
数据类型:string/zbuff/nil;
取值范围:0;
是否必选:否;
注意事项:这个参数一般存在3种情况
         1、将文件保存在模块内存中,在模块运行过程中会有内存占满风险,如果没有做好内存管理,将有可能会造成内存不够,导致拍照执行成功,但是没有照片文件的情况;
         2、将文件保存在外挂SD卡或者FLASH里;
         3、使用ZBUFF存储结果,这种方式可以主动判断ZBUFF空间的大小来确保拍照后照片文件有足够地方存储,避免因空间不够导致的拍照执行成功,但是没有照片文件的情况;
         为确保拍照任务能够正确执行并返回结果,请使用ZBUFF存储照片文件再写至内存、外挂FLASH或执行联网上传;
         当作为录像功能使用时文件尾缀必须为.mp4,例如"/sd/video.mp4"。
参数示例:--如下方所示,参数二是将拍照结果保存至/capture.jpg路径下;
         local result = camera.capture(1, "/capture.jpg", 80)
         local result = camera.capture(1, "/sd/video.mp4")

quality

参数含义:jpeg压缩质量;
数据类型:number;
取值范围:50-95;
是否必选:必须传入此参数;
注意事项:jpeg压缩质量,请使用 50 - 95 之间的数值,超出范围会导致质量过高,拍照执行失败;
         数值越大,照片质量越好,但是照片的整体质量是通过配置表的参数配置去优化的
         目前的官方配置表已经是最优配置,调整压缩质量效果已经微乎其微;
参数示例:--如下方所示,第三个参数为输出jpeg压缩质量为80的照片;
         local result = camera.capture(1, "/capture.jpg", 80)

x

参数含义:裁剪起始横坐标;
数据类型:number;
取值范围:根据所使用摄像头实际支持的像素尺寸决定;
是否必选:不填写则默认按照摄像头初始化时的像素原尺寸输出;
注意事项:X参数为从左开始的横向裁切宽度;
         例如X为10,则裁切掉左边10列像素;
参数示例:--如下方所示,第四个参数为输出的照片结果裁切掉左边10列像素;
         local result = camera.capture(1, "/capture.jpg", 80,10,15 , 310 , 465)

y

参数含义:裁剪起始纵坐标;
数据类型:number;
取值范围:根据所使用摄像头实际支持的像素尺寸决定;
是否必选:不填写则默认按照摄像头初始化时的像素原尺寸输出;
注意事项:y参数为从最下开始向上的纵向裁切高度;
         例如y为15,则裁切掉最下面15行像素;
参数示例:--如下方所示,第五个参数为输出的照片结果裁切掉下面15行像素;
         local result = camera.capture(1, "/capture.jpg", 80,10,15 , 310 , 465)

w

参数含义:裁剪后的宽度;
数据类型:number;
取值范围:根据所使用摄像头实际支持的像素尺寸决定;
是否必选:不填写则默认按照摄像头初始化时的像素原尺寸输出;
注意事项:w参数为从w像素列开始至摄像头初始化时配置的照片宽度裁切;
         例如w为310,则裁切掉310列以后的所有像素;
参数示例:--如下方所示,第六个参数为输出的照片结果裁切掉右边310列以后的所有像素;
         local result = camera.capture(1, "/capture.jpg", 80,10,15 , 310 , 465)

h

参数含义:裁剪后的高度;
数据类型:number;
取值范围:根据所使用摄像头实际支持的像素尺寸决定;
是否必选:不填写则默认按照摄像头初始化时的像素原尺寸输出;
注意事项:h参数为从h像素行开始至摄像头初始化时配置的照片高度裁切;
         例如h为465,则裁切掉465行以后的所有像素;
参数示例:--如下方所示,第七个参数为输出的照片结果裁切掉上边465列以后的所有像素;
         local result = camera.capture(1, "/capture.jpg", 80,10,15 , 310 , 465)
         local result = camera.capture(1, "/sd/video.mp4")

返回值

local result = camera.capture(1, "/capture.jpg", 80,10,15 , 310 , 465)

会有一个返回值 result

result

参数含义:拍照或扫描或录像的结果;
数据类型:boolean;
取值范围:成功时返回true,失败时返回false;
注意事项:该返回值只反馈拍照或扫码或录像是否成功执行;
         不携带拍照或扫描的文件,文件需要通过camera.on设置的回调函数接收;
参数示例:--如下方所示,拍照或扫描成功执行则返回true;
         local result = camera.capture(1, "/capture.jpg", 80,10,15 , 310 , 465)

例子

-- 保存到文件,质量为80
camera.capture(0, "/capture.jpg", 80)
-- 保存到内存文件系统
camera.capture(0, "/ram/123.jpg", 80)
-- 保存到zbuff,质量为80
camera.capture(0, buff, 80)
-- 拍一张经过裁切了左右10个像素列,上下15个像素行的照片
camera.capture(1, "/capture.jpg", 80,10,15 , 310 , 465)
-- 录制视频,保存到sd卡
camera.capture(1, "/sd/video.mp4")

4.8 camera.preview(id, mode)

功能

启停 camera 预览功能

注意事项

直接输出到 LCD 上,只有硬件支持 LCD 的 SoC 可以运行,启动预览前必须调用 lcd.int 等 api 初始化 LCD,预览时自动选择已经初始化过的 LCD;

参数

id

参数含义:摄像头初始化后返回的摄像头ID号;
数据类型:number;
取值范围:0-1;
是否必选:必须传入此参数;
注意事项:camera.init()后的返回值;
         可以赋值变量后后续所有camera函数均使用该变量传入,避免造成ID错误配置错误问题;
参数示例:--如下方所示,打开ID为1的摄像头预览,输出到LCD上;
         local result = camera.preview(1, true)

mode

参数含义:摄像头预览开关;
数据类型:boolean;
取值范围:打开填true,关闭则填false;
是否必选:必须传入此参数;
注意事项:默认开启摄像头预览,必须要在LCD初始化之后执行预览,否则不能输出;
参数示例:--如下方所示,第二参数为打开摄像头预览;
         local result = camera.preview(1, true)

返回值

local result = camera.preview(id, mode)

会有一个返回值 result

result

参数含义:摄像头预览打开的结果;
数据类型:boolean;
取值范围:成功时返回true,失败时返回false;
注意事项:必须在打开摄像头预览前执行LCD初始化,底层默认开启;
参数示例:--如下方所示,摄像头预览成功执行则返回true;
         local result = camera.preview(1, true)

例子

camera.preview(1, true)

4.9 camera.pwdn_pin(id, level)

功能

摄像头 PWDN 控制脚控制;

注意事项

该接口仅用于 Air72X 系列无法用 GPIO 控制 camera pwdn 脚的平台,手动控制 camera pwdn 脚拉高或者拉低;

参数

id

参数含义:摄像头初始化后返回的摄像头ID号;
数据类型:number;
取值范围:0-1;
是否必选:必须传入此参数;
注意事项:camera.init()后的返回值;
         可以赋值变量后后续所有camera函数均使用该变量传入,避免造成ID错误配置错误问题;
参数示例:--如下方所示,控制ID为1的摄像头;
         camera.pwdn_pin(1, 0)

level

参数含义:pwdn脚电平;
数据类型:number;
取值范围:1高电平,0低电平;
是否必选:必须传入此参数;
注意事项:拉高暂停摄像头,拉低开启摄像头;
参数示例:--如下方所示,第二个参数为拉低pwdn开启ID为1的摄像头;
         camera.pwdn_pin(1, 0)

返回值

无

例子

-- 拉低camera pwdn脚电平,开启摄像头
camera.pwdn_pin(camera_id, 0)

4.10 camera.reset_pin(id, level)

功能

重启摄像头;

注意事项

该接口仅用于 Air72X 系列无法用 GPIO 控制 camera reset 脚的平台,手动控制 camera reset 脚拉高或者拉低;

参数

id

参数含义:摄像头初始化后返回的摄像头ID号;
数据类型:number;
取值范围:0-1;
是否必选:必须传入此参数;
注意事项:camera.init()后的返回值;
         可以赋值变量后后续所有camera函数均使用该变量传入,避免造成ID错误配置错误问题;
参数示例:--如下方所示,控制ID为1的摄像头;
         camera.reset_pin(1, 0)

level

参数含义:reset脚电平;
数据类型:number;
取值范围:1高电平,0低电平;
是否必选:必须传入此参数;
注意事项:拉低重启摄像头,使用时保持拉高;
参数示例:--如下方所示,第二个参数拉低reset脚重启ID为1的摄像头;
         camera.reset_pin(1, 0)

返回值

无

例子

-- 拉低camera reset脚电平,重启摄像头
camera.reset_pin(camera_id, 1)

4.11 camera.stream(id, app_id, jump_frame_cnt, min_data_len, frame_callback_enable, scan_enable, decode_type)

功能

camera输出/停止数据流;

参数

id

参数含义:camera id USB设备就是camera.USB,其他的是camera.init返回;
数据类型:number;
取值范围:0-1 或 camera.USB;
注意事项:camera.init()后的返回值;
         可以赋值变量后后续所有camera函数均使用该变量传入,避免造成ID错误配置错误问题;
是否必选:必须传入此参数;
参数示例:--如下方所示,控制ID为camera.USB的摄像头;
         camera.stream(camera.USB, app_id) 

app_id

参数含义:app_id 如果是usb摄像头,则输入usb应用id,其他留空;
数据类型:number;
取值范围:usb回调函数返回值 0~255;
是否必选:非必须传入此参数;
参数示例:camera.stream(camera.USB, app_id) 

jump_frame_cnt

参数含义:跳帧,针对USB摄像头,跳过N帧后上报,一般情况正常传输是摄像头最高帧率,如果脚本处理不过来,可以跳过N帧上报;
数据类型:number;
取值范围:正整数,默认是0,即不跳;
是否必选:非必须传入此参数;
参数示例:--如下方所示,跳过1帧上报;
camera.stream(camera.USB, app_id, 1) 

min_data_len

参数含义:图像数据最小长度,针对USB摄像头ISO传输可能漏数据的情况,只有大于最小长度的图像帧会上报;
数据类型:number;
取值范围:正整数,默认是1KB;
是否必选:非必须传入此参数;
参数示例:--如下方所示,图像数据最小长度1KB;
camera.stream(camera.USB, app_id, 1, 1024) 

frame_callback_enable

参数含义:是否开启帧数据回调;
数据类型:boolean;
取值范围:true / false,默认 true(开启);
是否必选:非必须传入此参数;
注意事项:只想用硬件扫码、不需要在脚本里拿图像数据时传 false,
         能省掉每帧把数据拷到 Lua 层的时间和内存;
参数示例:--如下方所示,关闭帧数据回调;
         camera.stream(camera.USB, app_id, nil, nil, false)

scan_enable

参数含义:是否开启硬件扫码功能;
数据类型:boolean;
取值范围:true / false,默认 false(不开启);
是否必选:非必须传入此参数;
注意事项:开启后摄像头数据不再需要脚本处理,扫码结果通过
         camera.on(id, "scanned", 回调) 推送到脚本,回调参数是扫码得到的字符串;
参数示例:--如下方所示,关闭帧数据回调,开启扫码功能;
         camera.stream(camera.USB, app_id, nil, nil, false, true)

decode_type

参数含义:扫码时使用的解码器组合;
数据类型:number;
取值范围:camera.SCAN_FMT_1D / SCAN_FMT_QR / SCAN_FMT_DM / SCAN_FMT_AZTEC /
          SCAN_FMT_PDF417 / SCAN_FMT_MAXICODE / SCAN_FMT_ALL,可用按位或组合;
是否必选:非必须传入此参数,默认 camera.SCAN_FMT_ALL;
注意事项:解码器开得越多单帧耗时越长,明确只扫二维码时传 camera.SCAN_FMT_QR 可以明显提速;
参数示例:--如下方所示,只解二维码;
         camera.stream(camera.USB, app_id, nil, nil, false, true, camera.SCAN_FMT_QR)

返回值

local result = camera.stream(id, app_id, jump_frame_cnt, min_data_len, frame_callback_enable, scan_enable, decode_type)

会有一个返回值 result

result

参数含义:camera输出/停止数据流返回的结果;
数据类型:boolean;
取值范围:成功时返回true,失败时返回false;
参数示例:--如下方所示,camera输出/停止数据流成功则返回true;
         local result = camera.stream(camera.USB, app_id) 

例子

--默认不跳帧
camera.stream(camera.USB, app_id)
--跳过1帧上报
camera.stream(camera.USB, app_id, 1)    
--关闭帧数据回调,开启扫码,只解二维码
camera.stream(camera.USB, app_id, nil, nil, false, true, camera.SCAN_FMT_QR)

扫码结果怎么拿

camera.on(0, "scanned", function(id, str)
    -- str 就是扫到的内容,没扫到不会进这个回调
    log.info("扫码结果", id, str)
end)

4.12 camera.cache(id, app_id, buff0, buff1, buff2)

功能

配置camera输出数据流到用户指定的zbuff缓存区,需要输入2~3个zbuff,并通过camera.on设置的回调函数返回具体哪一个zbuff有数据 2026/4/5启用;

参数

id

参数含义:camera id USB设备就是camera.USB,其他的是camera.init返回;
数据类型:number;
取值范围:0-1 或 camera.USB;
注意事项:camera.init()后的返回值;
         可以赋值变量后后续所有camera函数均使用该变量传入,避免造成ID错误配置错误问题;
是否必选:必须传入此参数;
参数示例:--如下方所示,控制ID为camera.USB的摄像头;
         camera.stream(camera.USB, app_id) 

app_id

参数含义:usb应用id;
数据类型:number;
取值范围:usb回调函数返回值 0~255;
是否必选:必须传入此参数;
参数示例:camera.stream(camera.USB, app_id) 

buff0

参数含义:用户指定的zbuff缓存区;
数据类型:zbuff;
取值范围:暂无;
是否必选:必须传入此参数;
参数示例:buff0 = zbuff.create(1024*768*2)

buff1

参数含义:用户指定的zbuff缓存区;
数据类型:zbuff;
取值范围:暂无;
是否必选:必须传入此参数;
参数示例:buff1 = zbuff.create(1024*768*2)

buff2

参数含义:用户指定的zbuff缓存区;
数据类型:zbuff;
取值范围:暂无;
是否必选:非必须传入此参数;
参数示例:buff2 = zbuff.create(1024*768*2)

返回值

local result = camera.cache(id, app_id, buff0, buff1, buff2)

会有一个返回值 result

result

参数含义:配置camera输出数据流到用户指定的zbuff缓存区返回的结果;
数据类型:boolean;
取值范围:成功时返回true,失败时返回false;
参数示例:--如下方所示,配置camera输出数据流到用户指定的zbuff缓存区成功则返回true;
         local result = camera.cache(camera.USB, app_id, buff0, buff1, buff2) 

例子

buff0 = zbuff.create(1024*768*2)
buff1 = zbuff.create(1024*768*2)
buff2 = zbuff.create(1024*768*2)    --可以去掉,最少需要2个缓存
camera.cache(camera.USB, app_id, buff0, buff1, buff2)  

4.13 camera.get_usb_config(app_id, key, param1, param2)

功能

获取USB摄像头图像参数,根据不同的配置项的id和参数值组合,有不同的返回值组合;

参数

app_id

参数含义:usb应用id;
数据类型:number;
取值范围:usb回调函数返回值 0~255;
是否必选:必须传入此参数;
参数示例:
--1、查询USB摄像头数据流有多少种类型
--通常返回1~3, value2和value3是nil
result,value1 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT)

key

参数含义:配置项的id;
数据类型:number;
取值范围:目前只有camera.CONF_UVC_FORMAT,camera.CONF_UVC_RESOLUTION;
是否必选:必须传入此参数;
参数示例:
--1、查询USB摄像头数据流有多少种类型
--通常返回1~3, value2和value3是nil
result,value1 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT)

param1

参数含义:参数1;
数据类型:number;
取值范围:param1在1~组合1的返回值里选;
是否必选:非必须传入此参数;
参数示例:
--1、查询USB摄像头数据流有多少种类型
--通常返回1~3, value2和value3是nil
result,value1 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT)
--2、查询USB摄像头某种数据流有多少种图像类型,param1在1~组合1的返回值里选
--通常返回数据流类型(0 原始图像,1 mjpg,2 h264), 图像类型数量1~12, value3是nil
result,value1,value2 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT, 1)    --数据流1的数据流类型,及包含的图像类型数量

param2

参数含义:参数2;
数据类型:number;
取值范围:在1~组合2的返回值图像类型数量里选;
是否必选:非必须传入此参数;
参数示例:
--1、查询USB摄像头数据流有多少种类型
--通常返回1~3, value2和value3是nil
result,value1 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT)
--2、查询USB摄像头某种数据流有多少种图像类型,param1在1~组合1的返回值里选
--通常返回数据流类型(0 原始图像,1 mjpg,2 h264), 图像类型数量1~12, value3是nil
result,value1,value2 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT, 1)    --数据流1的数据流类型,及包含的图像类型数量
--3、查询USB摄像头某种数据流下某种图像类型的具体参数,param1选0~2(0 原始图像,1 mjpg,2 h264), param2在1~组合2的返回值图像类型数量里选
--返回值分别为帧率,图像宽,图像高
result,fps,w,h = camera.get_usb_config(id, camera.CONF_UVC_RESOLUTION, 1, 3)    --数据流1第4种图像类型的具体值

返回值

local result ,value1 ,value2 ,value3= camera.get_usb_config(app_id, key, param1, param2)

最多有4个返回值 result ,value1 ,value2 ,value3

result

参数含义:获取USB摄像头图像参数返回的结果;
数据类型:boolean;
取值范围:成功时返回true,失败时返回false;
参数示例:
--1、查询USB摄像头数据流有多少种类型
--通常返回1~3, value2和value3是nil
result,value1 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT) 

value1

参数含义:根据不同的配置项的id和参数值组合,有不同的返回值组合;
数据类型:number;
取值范围:详细说明见下面例子说明;
参数示例:
--1、查询USB摄像头数据流有多少种类型
--通常返回1~3, value2和value3是nil
result,value1 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT) 

value2

参数含义:根据不同的配置项的id和参数值组合,有不同的返回值组合;
数据类型:number;
取值范围:详细说明见下面例子说明;
参数示例:
--1、查询USB摄像头数据流有多少种类型
--通常返回1~3, value2和value3是nil
result,value1 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT)
--2、查询USB摄像头某种数据流有多少种图像类型,param1在1~组合1的返回值里选
--通常返回数据流类型(0 原始图像,1 mjpg,2 h264), 图像类型数量1~12, value3是nil
result,value1,value2 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT, 1)    --数据流1的数据流类型,及包含的图像类型数量

value3

参数含义:根据不同的配置项的id和参数值组合,有不同的返回值组合;
数据类型:number;
取值范围:详细说明见下面例子说明;
参数示例:
--1、查询USB摄像头数据流有多少种类型
--通常返回1~3, value2和value3是nil
result,value1 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT)
--2、查询USB摄像头某种数据流有多少种图像类型,param1在1~组合1的返回值里选
--通常返回数据流类型(0 原始图像,1 mjpg,2 h264), 图像类型数量1~12, value3是nil
result,value1,value2 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT, 1)    --数据流1的数据流类型,及包含的图像类型数量
--3、查询USB摄像头某种数据流下某种图像类型的具体参数,param1选0~2(0 原始图像,1 mjpg,2 h264), param2在1~组合2的返回值图像类型数量里选
--返回值分别为帧率,图像宽,图像高
result,fps,w,h = camera.get_usb_config(id, camera.CONF_UVC_RESOLUTION, 1, 3)    --数据流1第4种图像类型的具体值

例子

-- 本函数于 2026.4.5 新增, 当前仅Air1601可用
--配置项的id和参数值组合,及返回如下,第一个返回值固定是成功、失败,不再表述,从第二个返回值开始描述
--1、查询USB摄像头数据流有多少种类型
--通常返回1~3, value2和value3是nil
result,value1 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT)
--2、查询USB摄像头某种数据流有多少种图像类型,param1在1~组合1的返回值里选
--通常返回数据流类型(0 原始图像,1 mjpg,2 h264), 图像类型数量1~12, value3是nil
result,value1,value2 = camera.get_usb_config(id, camera.CONF_UVC_FORMAT, 1)    --数据流1的数据流类型,及包含的图像类型数量
--3、查询USB摄像头某种数据流下某种图像类型的具体参数,param1选0~2(0 原始图像,1 mjpg,2 h264), param2在1~组合2的返回值图像类型数量里选
--返回值分别为帧率,图像宽,图像高
result,fps,w,h = camera.get_usb_config(id, camera.CONF_UVC_RESOLUTION, 1, 3)    --数据流1第4种图像类型的具体值
-- 打印所有支持的数据类型
local res, format_num, format_index, frame_num, frame_index, type, fps, w, h
res, format_num= camera.get_usb_config(camera_id, camera.CONF_UVC_FORMAT)
log.info("总共有", format_num, "种数据流格式")
for format_index = 1, format_num, 1 do
    res, type, frame_num = camera.get_usb_config(camera_id, camera.CONF_UVC_FORMAT, format_index)
    log.info("数据流序号", format_index, "数据流格式", type, "总共有", frame_num, "图像格式")
    for frame_index = 1, frame_num, 1 do
        res, fps, w, h = camera.get_usb_config(camera_id, camera.CONF_UVC_RESOLUTION, format_index, frame_index)
        log.info("图像格式序号", frame_index, "图像格式", type, "帧率", fps, "图像宽度", w, "图像高度", h)
    end
end  

4.14 camera.set_usb_config(app_id, key, param1, param2)

功能

配置USB摄像头图像参数,根据不同的配置项的id和参数值组合,有不同的设置效果

参数

app_id

参数含义:usb应用id;
数据类型:number;
取值范围:usb回调函数返回值 0~255;
是否必选:必须传入此参数;
参数示例:--设置USB摄像头使用的数据流和图像类型序号
        --配置USB摄像头使用数据流1下第6种图像类型
        result = camera.set_usb_config(id, camera.CONF_UVC_RESOLUTION, 1, 5)

key

参数含义:配置项的id;
数据类型:number;
取值范围:目前只有camera.CONF_UVC_RESOLUTION;
是否必选:必须传入此参数;
参数示例:--设置USB摄像头使用的数据流和图像类型序号
        --配置USB摄像头使用数据流1下第6种图像类型
        result = camera.set_usb_config(id, camera.CONF_UVC_RESOLUTION, 1, 5)

param1

参数含义:参数1 设置USB摄像头使用的数据流类型;
数据类型:number;
取值范围:0 原始图像,1 mjpg,2 h264;
是否必选:非必须传入此参数;
参数示例:--设置USB摄像头使用的数据流和图像类型序号
        --配置USB摄像头使用数据流1下第6种图像类型
        result = camera.set_usb_config(id, camera.CONF_UVC_RESOLUTION, 1, 5)

param2

参数含义:参数2 图像类型数量;
数据类型:number;
取值范围:图像类型数量1~12
是否必选:非必须传入此参数;
参数示例:--设置USB摄像头使用的数据流和图像类型序号
        --配置USB摄像头使用数据流1下第6种图像类型
        result = camera.set_usb_config(id, camera.CONF_UVC_RESOLUTION, 1, 5)

返回值

local result = camera.set_usb_config(app_id, key, param1, param2)

会有一个返回值 result

result

参数含义:配置USB摄像头图像参数返回的结果;
数据类型:boolean;
取值范围:成功时返回true,失败时返回false;
参数示例:--设置USB摄像头使用的数据流和图像类型序号
        --配置USB摄像头使用数据流1下第6种图像类型
        result = camera.set_usb_config(id, camera.CONF_UVC_RESOLUTION, 1, 5)

例子

-- 本函数于 2026.4.5 新增, 当前仅Air1601可用
--配置项的id和参数值组合如下
--1、设置USB摄像头使用的数据流和图像类型序号
--配置USB摄像头使用数据流1下第6种图像类型
result = camera.set_usb_config(id, camera.CONF_UVC_RESOLUTION, 1, 5)

4.15 camera.ctrl_plane_get(app_id, param)

功能

读取 USB 摄像头标准控制界面(UVC 的 Camera Terminal / Processing Unit)里的某个控制项,一次返回该项的当前值、默认值、范围和支持状态。亮度、对比度、曝光、对焦这类“摄像头自身的调节项”都走这个接口,和 camera.get_usb_config 拿的是两回事:后者取的是数据流格式(分辨率、帧率、编码类型)。

源码注释标明 2026.10.23 新增,当前仅 Air1601 可用,需要 USB 主机模式 + 支持 UVC 控制界面的摄像头。

参数

app_id

参数含义:usb 应用 id;
数据类型:number;
取值范围:usb.on 回调里给的 app_id;
是否必选:必须传入此参数;
注意事项:传错 app_id 时所有返回值都按“不支持”处理,不会报错;
参数示例:1;

param

参数含义:控制项 id;
数据类型:number;
取值范围:第三章 3.32~3.70 的 UVC 控制项常量(UVC_CT 系列和 UVC_PU 系列),例如 camera.UVC_PU_BRIGHTNESS;
是否必选:必须传入此参数;
注意事项:不能用第三章之外的自定义数值,底层只认这些选择子;
参数示例:camera.UVC_PU_BRIGHTNESS;

返回值

local ok, can_get, can_set, auto_lock, is_range, cur, def, min, max, res = camera.ctrl_plane_get(app_id, param)

ok

含义说明:该项参数是否读取成功;
数据类型:boolean;
取值范围:true 或 false;
注意事项:为 false 时后面的返回值都不可信,按默认值 0 填充;
返回示例:true;

can_get

含义说明:该项参数是否支持读取;
数据类型:boolean;
取值范围:true 或 false;
注意事项:暂无;
返回示例:true;

can_set

含义说明:该项参数是否支持写入;
数据类型:boolean;
取值范围:true 或 false;
注意事项:为 false 时调用 camera.ctrl_plane_set 会失败;
返回示例:true;

auto_lock

含义说明:该项参数当前是否被自动模式锁定,锁定后无法写入;
数据类型:boolean;
取值范围:true 或 false;
注意事项:为 true 时先关掉对应的自动模式(例如 camera.UVC_PU_WB_TEMPERATURE_AUTO)再写;
返回示例:false;

is_range

含义说明:该项参数是否是取值范围型;
数据类型:boolean;
取值范围:true 或 false;
注意事项:只有为 true 时后面的 min、max、res 才有意义;位图型(复合)参数会返回 false;
返回示例:true;

cur

含义说明:当前值;
数据类型:number;
取值范围:随控制项而定;
注意事项:暂无;
返回示例:128;

def

含义说明:默认值;
数据类型:number;
取值范围:随控制项而定;
注意事项:暂无;
返回示例:128;

min

含义说明:最小值;
数据类型:number;
取值范围:随控制项而定;
注意事项:is_range 为 false 时为 0;
返回示例:0;

max

含义说明:最大值;
数据类型:number;
取值范围:随控制项而定;
注意事项:is_range 为 false 时为 0;
返回示例:255;

res

含义说明:步进值;
数据类型:number;
取值范围:随控制项而定;
注意事项:is_range 为 false 时为 0;写值尽量按步进对齐;
返回示例:1;

示例

-- 读亮度:当前值、范围一次拿全
local ok, can_get, can_set, auto_lock, is_range, cur, def, minval, maxval, res =
    camera.ctrl_plane_get(app_id, camera.UVC_PU_BRIGHTNESS)
log.info("uvc", "亮度", ok, can_get, can_set, is_range, cur, def, minval, maxval, res)

注意事项

  1. 这是标准的 UVC 控制项,能不能读、能不能写取决于摄像头本身,不是所有摄像头都实现了全部 CT/PU 项;
  2. 写着色温、曝光这类参数前,建议先看 auto_lock,自动模式开着的时候写入会被忽略;
  3. 参数在摄像头插拔后会重置,重新枚举之后建议再读一遍;

4.16 camera.ctrl_plane_set(app_id, param, value)

功能

写入 USB 摄像头标准控制界面里的某个控制项,例如设置亮度、对比度、饱和度、色温、曝光时间。2026.10.23 新增,当前仅 Air1601 可用。

参数

app_id

参数含义:usb 应用 id;
数据类型:number;
取值范围:usb.on 回调里给的 app_id;
是否必选:必须传入此参数;
注意事项:需与 camera.ctrl_plane_get 用同一个 app_id;
参数示例:1;

param

参数含义:控制项 id;
数据类型:number;
取值范围:第三章 3.32~3.70 的 UVC 控制项常量(UVC_CT 系列和 UVC_PU 系列),例如 camera.UVC_PU_BRIGHTNESS;
是否必选:必须传入此参数;
注意事项:建议先用 camera.ctrl_plane_get 确认 can_set 为 true;
参数示例:camera.UVC_PU_BRIGHTNESS;

value

参数含义:要写入的值;
数据类型:number;
取值范围:一般取 camera.ctrl_plane_get 返回的 min~max 之间、按 res 对齐的值;
是否必选:必须传入此参数;
注意事项:超出范围时由摄像头自行截断;被自动模式锁定时写入不生效;
参数示例:150;

返回值

local result = camera.ctrl_plane_set(app_id, param, value)

result

含义说明:写入成功返回 true,失败返回 false;
数据类型:boolean;
取值范围:true 或 false;
注意事项:不支持写、被自动模式锁定、值超范围、摄像头掉线都会返回 false;
返回示例:true;

示例

-- 先确认能写、且没被自动模式锁定,再写亮度
local ok, can_get, can_set, auto_lock = camera.ctrl_plane_get(app_id, camera.UVC_PU_BRIGHTNESS)
if ok and can_set and not auto_lock then
    camera.ctrl_plane_set(app_id, camera.UVC_PU_BRIGHTNESS, 150)
end

4.17 camera.ctrl_plane_refresh(app_id)

功能

重新向摄像头读取一遍全部 CT/PU 控制项的参数表。一般情况下不需要调用——摄像头枚举时底层会自动读一次;只有识别阶段出错、读到的参数明显不对(例如所有值都是 0、范围和当前值对不上)时,才用它强制刷新一次。2026.10.23 新增,当前仅 Air1601 可用。

参数

app_id

参数含义:usb 应用 id;
数据类型:number;
取值范围:usb.on 回调里给的 app_id;
是否必选:必须传入此参数;
注意事项:只在摄像头已经枚举完成、可以正常出流的状态下调用才有意义;
参数示例:1;

返回值

nil

示例

-- 控制项读出来不对时刷新一次,再重新读
camera.ctrl_plane_refresh(app_id)
local ok, can_get, can_set, auto_lock, is_range, cur = camera.ctrl_plane_get(app_id, camera.UVC_PU_BRIGHTNESS)
log.info("uvc", ok, cur)

4.18 camera.startRaw(id, w, h, buff)

功能

启动摄像头,把原始图像数据直接输出到用户自己的 zbuff 缓存区里。

输出 1 帧(1fps 的节奏)后会自动停止,并通过 camera.on 注册的回调把本次实际接收到的字节数回调上来。需要再出一帧就调用 camera.getRaw(id)。

参数

id

参数含义:camera id;
数据类型:number;
取值范围:camera.init() 的返回值;
是否必选:必须传入此参数;
参数示例:0;

w

参数含义:图像宽度;
数据类型:number;
取值范围:正整数,默认 320;
是否必选:可选;
注意事项:必须与摄像头实际输出分辨率一致,否则数据错位;
参数示例:320;

h

参数含义:图像高度;
数据类型:number;
取值范围:正整数,默认 240;
是否必选:可选;
注意事项:同上;
参数示例:240;

buff

参数含义:用于存放原始数据的缓存区;
数据类型:zbuff;
取值范围:容量必须不小于 w × h × 2 字节(RGB565 每像素 2 字节);
是否必选:必须传入此参数;
注意事项:容量不够会直接失败;缓冲区由脚本自己持有,不要中途释放;
参数示例:local buff = zbuff.create(320 * 240 * 2);

返回值

local result = camera.startRaw(id, w, h, buff)

result

含义说明:成功返回 true,失败返回 false;
数据类型:boolean;

示例

local buff = zbuff.create(320 * 240 * 2)

camera.on(0, "raw", function(id, len)
    -- len 是本次真正写进 buff 的字节数
    log.info("camera", "raw len", len)
end)

-- 启动一次原始数据输出,1 帧后自动停止
camera.startRaw(0, 320, 240, buff)

注意事项

  1. 每调用一次只出 1 帧,连续采集要在回调里反复调用 camera.getRaw(id);
  2. 这里拿到的是原始像素,没有 JPEG 压缩、也没有缩放,所以缓存区要按 w*h*2 足额申请;
  3. 只是要一张图存文件的话用 camera.capture 更省事,startRaw 适合自己做算法处理(如取色、找色块、算亮度)。

4.19 camera.getRaw(id)

功能

让上一次 camera.startRaw 配置好的摄像头再输出一帧原始数据到同一个缓存区。

参数

id

参数含义:camera id;
数据类型:number;
取值范围:camera.init() 的返回值,且必须已经成功调用过 camera.startRaw;
是否必选:必须传入此参数;
注意事项:没有前置的 startRaw 会直接返回 false;
参数示例:0;

返回值

local result = camera.getRaw(id)

result

含义说明:成功返回 true,失败返回 false;
数据类型:boolean;

示例

local buff = zbuff.create(320 * 240 * 2)

camera.on(0, "raw", function(id, len)
    log.info("camera", "raw len", len)
    -- 处理完这一帧,再要下一帧
    camera.getRaw(0)
end)

camera.startRaw(0, 320, 240, buff)

注意事项

  1. 宽度、高度、缓存区沿用 startRaw 时的设置,本接口没有参数可以改;
  2. 仍然是一调用出一帧,回调回来之后再调下一次,不要在回调外面死循环调用。

4.20 camera.video(id, w, h, out_path)

功能

把摄像头图像编码成视频流,从虚拟串口输出。

已废弃:源码注释明确写着“即将废弃,不要使用”。新项目请改用 camera.stream + airui.video 或 camera.capture 存文件的方式。这里保留说明只是为了旧代码能对得上。

参数

id
参数含义:camera id;
数据类型:number;
是否必选:必须传入此参数;
参数示例:0

w / h
参数含义:输出图像宽 / 高;
数据类型:number;
是否必选:可选,默认 320 / 240;
参数示例:320 / 240

out_path
参数含义:输出路径,目前只支持虚拟串口 0(uart.VUART_0);
数据类型:number;
是否必选:可选,默认 uart.VUART_0;
参数示例:uart.VUART_0

返回值

result
含义说明:成功返回 true,否则 false;
数据类型:boolean;

示例

camera.video(0, 320, 240, uart.VUART_0)

五、产品支持说明

不同产品的LuatOS固件,对camera核心库的支持情况如下:

1、Air780EX2/Air700ECP/Air780EPM/Air780EGP 1号、2号、105号固件支持;

2、Air700ECH/Air780EHM/EHV/EGH/EGG/EHU/EHN/Air8000系列 1-10/101-110号、13/113号、15/115号、16/116号固件支持;

3、Air8101系列 101号、102号、104号、106号固件支持;

4、Air1601 / Air1602 / Air1603 都支持(同一套固件代码,同一版本号下三个型号的核心库完全一致);

需要单独说明的是 USB 摄像头:camera.USB、camera.get_usb_config、camera.set_usb_config、camera.ctrl_plane_get/set/refresh 这些和 USB(UVC)摄像头相关的接口,源码注释标注为「当前仅 Air1601 可用」,其他型号的固件是否具备这些接口,以对应版本页的核心库列表和实测为准;EC7xx 系列的 camera 库对应的主要是 SPI、DVP 摄像头,走 USB 摄像头请选 160X 或 Air8101。

各产品固件支持核心库列表详细说明参考下面链接:

Air780EX2/Air700ECP/Air780EPM/Air780EGP固件支持列表

Air700ECH/Air780EHM/EHV/EGH/EGG/EHU/EHN固件支持列表

Air8000系列所有型号固件支持列表

Air8101系列所有型号固件支持列表

Air1601/Air1602固件支持列表

Air1603固件支持列表

搜索