HarmonyOS开发案例:【相机开发】

基本概念

相机是OpenHarmony多媒体进程提供的服务之一,提供了相机的录像、预览、拍照功能,支持多用户并发取流。

在进行应用的开发前,开发者应了解以下基本概念:

  • 视频帧

    视频流指的是将一系列图片数据按照固定时间间隔排列形成的数据流,每一张图片数据成为一帧,这样的一帧称为视频帧。

  • 帧速率(FPS,Frames Per Second)

    视频播放每秒钟刷新图片的速度,或是视频每秒的帧数,帧速率越高,视频的观感越流畅。

  • 分辨率

    每一帧的图片信息都是由像素点组成的,分辨率描述了一张图片中像素点的个数。例如1920*1080(1080P),是指图片宽1920像素,高1080像素。

运作机制

  • 多媒体服务进程

    多媒体服务作为系统服务,在系统启动时由Init进程拉起,并初始化和分配媒体硬件资源(内存/显示硬件/图像传感器/编解码器等)。初始化过程解析配置文件,确定了多媒体各个服务的能力和资源上限,通常由OEM厂商通过配置文件进行配置。相机服务在多媒体进程初始化时有以下配置项:

    • 内存池:所有媒体服务依赖于内存池中的内存轮转运行
    • 图像传感器:包括了传感器类型、分辨率、ISP等
    • 图像处理器:分辨率、码率、图像翻转等
    • 图像编码器:编码格式、码率、分辨率等
  • 关键类的解释

    应用通过持有下面4个类,配置和使用Camera的功能,包括了Camera类和它的三个异步回调类,三类回调分别对应了不同类型的异步处理场景,详见下表。

    表1 关键类的解释

    对象用途举例
    Camera对相机进行静态配置(通过配置类),触发相机基本功能拍照/录像/预览
    CameraDeviceCallback处理相机硬件状态变化可用/不可用
    CameraStateCallback处理camera自身状态变化创建/释放
    FrameStateCallback处理帧状态的变化拍照开始和结束/帧率发生变化
  • 流的传递

    Surface是多媒体传递音视频的基本数据结构,Camera一般作为Surface中数据的生产者,在不同的场景下有特定的消费者。

    相机的预览和录像输出均为视频流,拍照输出为图像帧,二者均通过Surface类进行传递。Surface类可以屏蔽进程内/跨进程的场景,进行多媒体信息流的传递。

    以录像为例,用户首先创建Recorder实例,并从Recorder中获取对应Surface,再将此Surface传递给Camera实例,此时Camera将作为生产者向Surface注入视频流,而Recorder作为消费者从Surface中取出视频流进行保存,用户的行为类似桥接,把二者通过Surface连接起来。

    类似的,用户也可以自行创建Surface传递给Camera实例,并实现消费者逻辑(例如通过网络传输视频流,或是将拍照的帧数据保存成图片文件)。

    图形图像模块也通过Surface从Camera获取流资源

鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。

搜狗高速浏览器截图20240326151547.png

小型系统图形图像框架介绍

概述

小型系统图形图像子系统是一套轻量级图形框架,框架包括轻量级 UI 控件、动画、事件、2D 图形库、字体布局引擎、多后端渲染和窗口管理等模块,主要用于运动手表、智能家居等小型带屏设备的图形 UI 显示。

OpenHarmony 中各 UI 之间的关系

当前对于 OpenHarmony 应用界面开发,你可能已经了解到几个不同的概念,比如 ArkUI 声明式开发范式、ArkUI 类 Web 开发范式等,那他们和当前小型系统图形图像框架之间是什么关系呢?

当前 [ace_engine]实现了标准系统的 ArkUI 声明式开发范式和 ArkUI 类 Web 开发范式两套开发框架;根据小型系统的特点 [ace_engine_lite]实现了轻量级的 ArkUI 类 Web 开发范式 lite 版本,其能力是 ArkUI 类 Web 开发范式的子集。

按照系统类型分类如下:

  • 标准系统:

    • ArkUI 声明式开发范式 (推荐)
    • ArkUI 类 Web 开发范式
  • 小型系统:

    • ArkUI 类 Web 开发范式 Lite
    • C++ (系统应用)

小型系统图形图像框架中的 [ui_lite] 和 [ace_engine_lite]、 [ace_engine]的代码实现关系如下图:

UI关系图

如何确定应用开发所需的 API 套件?对于标准系统,优先选择 ArkUI 声明式开发范式;对于小型系统,请优先考虑使用 ArkUI 类 Web 开发范式 lite。而在某些配置较低的设备上进行系统应用开发时,则可以考虑选择 C++ API,因为相比类 Web 范式,它具有更高的性能和更好的灵活性。

UI 控件

实现各种控件,如按钮、文本、进度条等各种基本控件。

提供列表、Swiper、图片序列帧等复杂控件。

布局

实现网格布局、灵活布局(如居中、左对齐、右对齐)。

布局为一次性布局。布局函数每运行一次,会计算一次控件的位置,但是控件位置由其他方式改变时(如拖动),其他相关联的控件位置不会自动发生变化,需要重新调用一次布局函数。

动画

框架支持自定义动画,所有动画由 AnimatorManager 管理,根据屏幕刷新事件,由 AnimatorManager 周期性调用回调函数处理修改属性变化,然后触发刷新重新绘制组件,达到组件动画效果。

提供动画的开始/停止、暂停/恢复、创建/销毁等各种操作 ,用于实现动画效果。

事件

Input 事件包括触摸屏触摸输入事件和物理按键输入事件,引擎每运行一次,InputManager 是管理所有输入设备的模块,GUI 引擎每运行一次,InputManager 会读取一次所有注册的硬件设备的输入,转化为各种事件供UI控件使用。

绘制

2D 图形绘制: 实现线、矩形、三角形、弧线的绘制操作。

图像绘制:实现各种类型图片的绘制能力,如 RGB565、RGB888、ARGB8888、PNG、JPG 格式。

字体绘制:支持矢量字体的实时绘制、布局排版。

实现原理

小型系统图形框架中,任务队列由屏幕刷新同步信号驱动。每个任务都是一个 task,并存放在任务队列中。周期性的屏幕刷新信号触发周期性回调,从而循环驱动任务队列中的 task 执行。输入事件、动画和渲染等操作均作为单独的 task 运行。

事件交互

当前图形框架支持触摸事件(PointerInputDevice)、按键事件(KeyInputDevice)、旋转表冠事件(RotateInputDevice)。

输入事件相关类图如上,每类输入事件根据自己特点,重写 InputDevice 基类的 Read 函数,读取对应的输入数据,然后根据输入数据生成对应的事件分发给 UI 控件,如 PointerInputDevice 读取触摸的坐标点,根据坐标点,从组件树查找当前坐标对应的控件,生成对应的点击、长按、拖拽事件,分发给对应控件。

动效框架

每一个自定义动画都需要继承自 Animator 类,实现 AnimatorCallback 的 Callback 接口。所有的 Animator 都由 AnimatorManager 统一管理。 Callback 接口入参为当前动画的 View,可以通过修改 View 对应的属性来产生动画效果,如坐标位置、颜色变换、缩放效果等。

渲染框架

  • 每一个窗口 Window 持有一个 RootView

  • RootView 为当前窗口的根节点,当前窗口所有控件都必须挂载在 RootView 下才能显示

  • UIView 为所有 View 的基类,每个 View 实现自己的 OnDraw 绘制函数

  • 每个 View 显示发生变化时,调用 Invalidate 函数,将当前区域标记为脏区域

  • RootView 统一管理当前窗口所有的脏区域信息

  • 每次刷新信号触发,会遍历绘制所有的 Window,每个 Window 从 RootView 开始先进行 Measure 布局,然后调用 Render 函数绘制,遍历绘制所有脏区域内的 View。

  • 相机运行流程

    1. Camera创建流程

      本进程通过CameraManager创建Camera实例,并从服务端绑定camera设备,创建成功后异步通知developer。类之间的时序图如下:

      图1 Camera创建时序图

      zh-cn_image_0000001200114819

    2. Camera录像/预览流程

      开发者首先通过CameraKit创建Camera,然后FrameConfig类对录像或者预览帧属性进行配置。录像/预览时序如下:

      图2 Camera录像/预览时序图

      zh-cn_image_0000001200115193

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/643521.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算中的过度授权:安全隐患与应对策略

云计算凭借其弹性、可扩展等优势,已经成为诸多企业组织拓展业务的重要基础设施之一。然而,与传统IT架构相比,云计算环境的安全管理也面临着新的挑战。过度授权 (Overprivileging) 便是云安全领域亟待解决的主要问题之一,本文将带领…

Fisher判别示例:鸢尾花(iris)数据(R)

先读取iris数据,再用程序包MASS(记得要在使用MASS前下载好该程序包)中的线性函数lda()作判别分析: data(iris) #读入数据 iris #展示数据 attach(iris) #用变量名绑定对应数据 library(MASS) #加载MASS程序包 ldlda(Species~…

Hive服务详解

Hive服务 HiveServer2、Hive Metastore 服务服务共同构成了 Hive 生态系统中的核心功能,分别负责管理元数据和提供数据查询服务,为用户提供了一个方便、高效的方式来访问和操作存储在 Hive 中的数据。 1. Hive 查询服务(HiveServer2&#xf…

蓝桥杯:日期问题(我的绝望题)

🎁个人主页:我们的五年 🔍系列专栏:每日一练 🌷追光的人,终会万丈光芒 目录 前言: 🌷1.问题描述: 1.问题描述: 2.输入格式: 3.输出格式&#…

CCS项目持续集成

​ 因工作需要,用户提出希望可以做ccs项目的持续集成,及代码提交后能够自动编译并提交到svn。调研过jenkins之后发现重新手写更有性价比,所以肝了几晚终于搞出来了,现在分享出来。 ​ 先交代背景: 1. 代码分两部分&am…

atlas 500容器(ubuntu20.04)搭建

1.docker 及环境搭建略 2.宿主机驱动安装略 3.宿主机中能正确使用npu-smi 4.docker 拉取略 5.docker 容器启动 docker run -itd --device/dev/davinci0 --device/dev/davinci_manager --device/dev/devmm_svm --device/dev/hisi_hdc -v /run/board_cfg.ini:/run/b…

自己写的爬虫小案例

网址:aHR0cDovL2pzc2NqZ3B0Lmp4d3JkLmdvdi5jbi8/dXJsPS92aWV3L3dvcmtpbmdVbml0L3dvcmtpbmdVbml0Lmh0bWw 这串代码能够爬取勘察单位企业的详细信息。 import requests import time import csv f open(勘察单位公司信息.csv,w,encodingutf-8,newline) csv_writer …

Laravel 6 - 第十一章 中间件

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

【iOS开发】(五)react Native路由和导航20240421-22

【iOS开发】(五)react Native 路由和导航Navigation 20240421 在(一)(二)中我们 Reactnative搭建了开发环境、学习了 基础语法、状态管理,JSX、组件、状态和生命周期以及样式布局等。 在(三)&a…

C++笔记:C++中的重载

重载的概念 一.函数重载 代码演示例子&#xff1a; #include<iostream> using namespace std;//函数名相同&#xff0c;在是每个函数的参数不相同 void output(int x) {printf("output int : %d\n", x);return ; }void output(long long x) {printf("outp…

24/04/24总结

异常: 1.异常是什么? 程序中可能出现的问题 2.异常体系的最上层父类是谁?异常分为几类? 父类:Exception。 异常分为两类:编译时异常、运行时异常 编译时异常和运行时异常的区别? 编译时异常:没有继承RuntimeException的异常&#xff0c;直接继承于Exception。 编译阶段就会…

Linux下的UDEV机制/守护进程

一. Udev机制概念引入 ( 需要在 etc/udev/rules.d/ 下创建设备的相关规则&#xff0c;不然有可能udev机制生成的设备文件不具备可读可写的权限&#xff0c;adb无法成功通过该设备文件访问设备 ) a. 创建文件夹 sudo vim Xiaomi-audroid.rules b. 添加规则 …