# KylinCameraLisbs README 

## 概要
麒麟摄像头中间件是基于Qt开发的的C++动态库，支持摄像头数据采集，主流视频格式编解码，缩放显示，拍照，录像等功能。麒麟摄像头中间件通用性能优于cheese，降低了CPU占用率。
## 中间件架构
![中间件架构](./pic/摄像头中间件.png)
## 中间件简要说明
### VideoCapture
利用V4L2对摄像头数据进行实时采集，该模块能够遍历获取摄像头所有支持的格式、分辨率、帧率。也能够对摄像头格式、分辨率等进行设置。
### VideoDecoder
该模块主要功能是对数据格式进行转换和解码，能够解码MJPEG数据，能够将YUV数据转换成RGB数据，能够将YUV中各种格式相互转换。
### VideoEncoder
该模块主要将数据进行压缩编码成H264，再将数据封装成MP4格式。
### VideoDisplay
该模块主要将数据进行缩放和显示。
## KylinCamera类
### 主要结构体说明
#### 摄像头设备信息
```
struct V4l2DeviceInfo {
    char dev_path[16];//设备路径，如/dev/video0
    char dev_name[32];
    int fd;
    int cur_index;
    TypePixFormats fmt_supported[10];//摄像头所有支持的格式所有信息,如MJPEG和YUYV
    int fmt_size;
};
```
#### 视频格式所支持的分辨率和帧率
```
struct TypePixFormats {
    struct v4l2_fmtdesc fmt;//格式描述
    size_t frm_sizes_len;
    TypeFramesizes frm_sizes[10];所有分辨率和帧率
};
```
#### 分辨率和帧率
```
//
struct TypeFramesizes {
    struct v4l2_frmsizeenum frm_size; //分辨率
    size_t frm_ivals_len;
    struct v4l2_frmivalenum frm_ivals[10];//帧率
};
```
#### 摄像头设置信息
```
struct KylinCameraInfo {
    char devname[16];
    unsigned int format;
    unsigned int width;
    unsigned int height;
    int fps;
};
```
### 接口说明
KylinCamera类开放以下接口供开发者调用。
#### create
创建VideoDisplay指针，视频显示缩放窗口。
#### enum_device
遍历摄像头所支持的格式、分辨率、帧率。
#### fourcc
打印摄像头格式。
#### camera_capture_pause
摄像头采集暂停。
#### camera_capture_restore
摄像头采集恢复。
#### camera_set_param
设置摄像头参数，如格式，分辨率，帧率。
#### camera_get_param
获取设置好的摄像头参数。
#### camera_get_mode
获取摄像头模式，0：拍照，1：连拍，2：录像。
#### camera_take_photo
摄像头拍照。
#### camera_start_record
摄像头开始录像。
#### camera_stop_record
摄像头停止录像。

## 基于中间件开发过程
### 配置环境
#### 安装依赖
sudo apt install libx264-dev libgpac-dev libjpeg-turbo8-dev
#### 编译libyuv
由于麒麟系统源没有yuv，需要手动编译，git链接：
[linyuv](https://github.com/lemenkov/libyuv.git)
#### 编译
有的平台需要手动编译libjpeg-turbo，git链接：
[libjpeg-turbo](https://github.com/libjpeg-turbo/libjpeg-turbo.git)
### 搭建Qt工程
配置好头文件和库的路径，如下图：
![搭建1](./pic/搭建1.png)
### 开发流程
1. 遍历摄像头信息，设置摄像头参数；
2. 创建KylinCamera类；
3. 调用create创建VideoDisplay；
4. 将VideoDisplay添加到布局；
5. 最后可以调用摄像头接口实现摄像头软件开发；
![搭建2](./pic/搭建2.png)
具体参考CameraTest例子。
### FT-2000笔记本演示
基于中间件开发的摄像头软件，如下图：
![CameraTest](./pic/1.png)
cheese软件，如下图：
![cheese](./pic/2.png)
基于相同高分辨率下，基于中间件开发的摄像头软件cpu占用率优于cheese。
