0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony Camera源码工作的整个流程

OpenAtom OpenHarmony 来源:OpenAtom OpenHarmony 作者:郭岳峰 2022-09-02 10:05 次阅读

郭岳峰

深圳开鸿数字产业发展有限公司

OS内核开发工程师

一、简介

当前,开源在科技进步和产业发展中发挥着越来越重要的作用,OpenAtom OpenHarmony(简称“OpenHarmony”)赋予了开发者孕育创新的种子,也为数字化产业发展开辟了一片土壤。深开鸿是开源的坚定践行者,基于OpenHarmony聚焦智能物联网操作系统(KaihongOS)技术研发与持续创新。

OpenHarmony Camera是多媒体子系统中的一个重要模块,Camera提供了OpenHarmony相机的预览、拍照和录像等功能。作为深开鸿的一名OS系统开发工程师,我长期致力于OpenHarmony框架层的研发工作,在OpenHarmony相机模块的拍照、预览和录像方面积累了一些经验,我将围绕着这三个核心功能对OpenHarmony Camera源码进行详细的分析。

二、OpenHarmony相机子系统

(1)系统简介

相机组件支持相机业务的开发,开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发,最常见的操作如:预览、拍照和录像等。

366e82d2-29f7-11ed-ba43-dac502259ad0.png

架构图

相机框架中主要包含会话管理、设备输入和数据输出,设备的输入和数据的输出配置都是在采集会话中完成,会话管理模块管理相机设备输入和数据输出。应用层在调用相机功能时,首先需要创建采集会话,在配置会话的过程中会将创建的设备输入和数据输出添加到采集会话中。

相机框架中几个重要的概念

会话管理:对相机采集的生命周期、参数配置、输入和输出的管理。

设备输入:主要的输入设备是相机,对相机的输入参数进行设置,比如设置闪光灯模式等。

数据输出:相机的输出有拍照输出、预览输出和录像输出,分别对应三个不同的类,所以上层需要根据不同的场景创建出不同的数据输出。

36a5650e-29f7-11ed-ba43-dac502259ad0.png

相机底层功能图

相机驱动框架模型对上实现相机HDI接口,对下实现相机Pipeline模型,管理相机各个硬件设备。底层硬件提供了相机设备功能,比如相机的设备管理,包括相机设备枚举、相机设备能力查询、流的创建管理以及图像的捕获。

(2)功能模块

会话管理模块

会话管理模块的主要功能是配置会话的输入(设备输入)和输出(数据的输出),以及控制会话的开始和结束,主要接口有:

3cfbc25e-29f7-11ed-ba43-dac502259ad0.png

设备输入模块

相机输入主要是给会话设置设备的输入,设备输入模块可以设置和获取输入设备的参数,比如闪光灯模式、缩放比例、对焦模式等,主要接口有:

3d551ce6-29f7-11ed-ba43-dac502259ad0.png

数据输出模块

数据输出模块根据不同的场景分为拍照输出、预览输出和录像输出。其中拍照的输出是通过PhotoOutput的Capture接口来提供拍照功能,预览和录像则是通过StreamRepeat提供的接口实现。主要接口有:

3d9d4cf0-29f7-11ed-ba43-dac502259ad0.png

(3)功能特性或应用场景

相关功能接口:相机拍照、相机预览、相机录像。

相机的主要应用场景是拍照、预览和录像,以下针对这三个场景进行流程的分析。

3de10fe4-29f7-11ed-ba43-dac502259ad0.png

camera\_standardinterfacesinner_api ative est目录下应用文件进行拍照、预览和录像功能的使用,进行源码分析。

拍照源码分析

拍照功能根据camera\_capture.cpp文件中的main方法进行分析,以下列举了main方法中的主要调用步骤,并且在注释中介绍核心代码的功能。

3e0c10b8-29f7-11ed-ba43-dac502259ad0.png

在拍照过程中首先获取相机管理器实例并获得相机对象列表,然后创建并配置采集会话(其中包括配置相机输入、创建消费者Surface以及监听事件、配置拍照输出),最后拍摄照片,释放资源。

以下是拍照流程的时序图,流程只分析到CameraService,后续的操作是通过Camera的Service和HDI接口进行调用,最终调用到Camera的底层HDF实现。以下对几个核心代码进行具体分析。

3f561d06-29f7-11ed-ba43-dac502259ad0.png

① 创建采集会话App侧先调用CameraManager的CreateCaptureSession接口。

3fef8e8c-29f7-11ed-ba43-dac502259ad0.png

CameraManager中有一个serviceProxy\_变量,这个变量在CameraManager初始化的时候赋值。

405e17da-29f7-11ed-ba43-dac502259ad0.png

CameraManager中通过serviceProxy\_调用CreateCaptureSession,实际上是调用到HcameraService的CreateCaptureSession接口,新建了HCaptureSession对象,并通过CreateCaptureSession参数进行返回。

4164baee-29f7-11ed-ba43-dac502259ad0.png

② 创建消费者Surface并注册监听器以监听缓冲区更新

调用Surface的CreateSurfaceAsConsumer接口。

41ba1c5a-29f7-11ed-ba43-dac502259ad0.png

创建ConsumerSurface对象,然后对该对象进行初始化操作,Init主要创建BufferQueue并初始化,使用BufferQueue作为参数创建出BufferQueue的Producer和Consumer,作为数据生产者和消费者。

42a90144-29f7-11ed-ba43-dac502259ad0.png

创建CaptureSurfaceListener对象。CaptureSurfaceListener继承IbufferConsumerListener抽象类,实现了OnBufferAvailable接口,capture成功后,在这个接口中通过surface的AcquireBuffer方法来获取帧数据,进行保存图片的处理。

43236c72-29f7-11ed-ba43-dac502259ad0.png

接下来是注册监听器,方法是调用ConsumerSurface的RegisterConsumerListener接口。

436d56ca-29f7-11ed-ba43-dac502259ad0.png

调用BufferQueueConsumer的RegisterConsumerListener接口,最终是调用到BufferQueue的RegisterConsumerListener接口。

43ac5898-29f7-11ed-ba43-dac502259ad0.png

43f5be02-29f7-11ed-ba43-dac502259ad0.png

③ 拍摄照片

调用PhotoOutput的Capture接口实现拍照功能。

449df5f4-29f7-11ed-ba43-dac502259ad0.png

通过streamCapture\_调用到了HstreamCapture的Capture接口。

44c51cb0-29f7-11ed-ba43-dac502259ad0.png

调用流程来到了StreamOperatorProxy的Capture接口,StreamOperatorProxy是HDI模块的client端,HDI模块的client通过IPC调用到HDI的server端进行具体的操作,这个属于底层调用模块,暂时不继续分析。

预览源码分析

预览功能根据camera\_capture.cpp文件中的main方法进行分析,以下列举了main方法中的主要调用步骤,并且注释中介绍核心代码的功能。

45149146-29f7-11ed-ba43-dac502259ad0.png

在预览过程中首先获取相机管理器实例并获得相机对象列表,然后创建并配置采集会话(其中包括配置相机输入、创建消费者Surface以及监听事件、配置预览输出),最后开始预览、停止预览、释放资源。

以下是预览流程的时序图,流程只分析到CameraService,后续的操作是通过Camera的Service和HDI接口进行调用,最终调用到Camera的底层HDF实现。由于预览和拍照流程有部分一致,我们只分析差异部分的流程。

4646df2e-29f7-11ed-ba43-dac502259ad0.png

① 创建预览输出

首先调用CameraManager的CreateCustomPreviewOutput接口。

4671a722-29f7-11ed-ba43-dac502259ad0.png

调用HcameraService的CreateCustomPreviewOutput的接口,这个接口中会创建HStreamRepeat对象,并将对象赋值给streamRepeat的参数,后续根据streamRepeat创建PreviewOutput对象返回,PreviewOutput作为预览的输出。

474e9ad8-29f7-11ed-ba43-dac502259ad0.png

②开始预览

首先调用CaptureSession的Start接口。

477f0c40-29f7-11ed-ba43-dac502259ad0.png

接着调用HCaptureSession的Start接口。

47ce4210-29f7-11ed-ba43-dac502259ad0.png

在HCaptureSession的调用中,调用HStreamRepeat的Start接口,HStreamRepeat在上述的创建预览输出时创建的对象,最终调用到HStreamRepeat的StartPreview接口。

48143856-29f7-11ed-ba43-dac502259ad0.png

48a590da-29f7-11ed-ba43-dac502259ad0.png

在StartPreview方法中调用streamOperator\_的Capture接口,第三个参数传入true,表示连续抓取数据。streamOperator\_的调用是在HDI中的操作,属于底层操作,暂不进行分析。

录像源码分析

录像功能根据camera\_video.cpp文件中的main方法进行分析,以下列举了main方法中的主要调用步骤,并且注释中介绍核心代码的功能。

48e35050-29f7-11ed-ba43-dac502259ad0.png

在录像过程中首先获取相机管理器实例并获得相机对象列表,然后创建并配置采集会话(其中包括配置相机输入、创建视频输出),最后进行视频的录制、暂停、恢复和停止。

以下是录像流程的时序图,流程只分析到了CameraService相关,后续的操作是通过Camera的Service和HDI接口进行调用,最终调用到Camera的底层HDF实现。录像流程跟上述流程基本一致,针对差异流程做相关的源码分析。

49ec71de-29f7-11ed-ba43-dac502259ad0.png

①创建录像输出

首先调用CameraManager的CreateVideoOutput接口,在CameraManager会调用serviceProxy\_变量的CreateVideoOutput.

4a5c2c36-29f7-11ed-ba43-dac502259ad0.png

serviceProxy\_最终会调用到HcameraService的CreateVideoOutput接口,在HcameraService中会创建HStreamRepeat对象,创建成功后会将该对象赋值给CreateVideoOutput的第二个参数streamRepeat,这个参数会在CameraManager中作为创建VideoOutput的参数。

4aab1a44-29f7-11ed-ba43-dac502259ad0.png

②开始录像

首先调用VideoOutput的Start接口,接着会调用到streamRepeat\_的Start接口。

4ae89c84-29f7-11ed-ba43-dac502259ad0.png

最终由StartVideo接口来实现录像的功能。

4b11ad5e-29f7-11ed-ba43-dac502259ad0.png

调用streamOperator的Capture接口来进行录像,其中第二个参数captureInfoVideo是video相关的信息参数。

4b383942-29f7-11ed-ba43-dac502259ad0.png

三、总结

本文首先对相机预览、拍照和录像功能的应用层进行了代码分析,其次对框架层的流程进行了梳理,最后再对框架源码进行分析。希望通过本文能帮助开发者初步掌握OpenHarmony Camera源码工作的整个流程。

关于OpenHarmony多媒体子系统方面的内容,我已经发表过《如何通过OpenHarmony的音频模块实现录音变速功能》《如何通过OpenHarmony系统中集成的ffmpeg库和NAPI机制,实现更多的多媒体功能?》两篇文章,感兴趣的朋友可以点击阅读,希望大家通过学习能够掌握更多OpenHarmony多媒体子系统的工作原理

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源码
    +关注

    关注

    8

    文章

    653

    浏览量

    29540
  • Camera
    +关注

    关注

    0

    文章

    79

    浏览量

    20939
  • OpenHarmony
    +关注

    关注

    25

    文章

    3753

    浏览量

    16718

原文标题:OpenHarmony Camera源码分析

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    2K0300 OpenHarmony源码构建指南

    2K0300 OpenHarmony源码构建参考如下 2K0300先锋派OpenHarmony源码构建指南 2K0300 源码编译wiki
    发表于 02-05 09:36

    如何获取OpenHarmonyOS源码

    源码获取OpenHarmony介绍OpenHarmony是HarmonyOS的开源版,由华为捐赠给开放原子开源基金会(OpenAtom Foundation)开源。第一个开源版本支持在128KB
    发表于 09-10 18:03

    HarmonyOS学习之四:OpenHarmony源码下载及构成简介

    /manifest.git -b master二、源码目录说明OpenHarmony的主要源码的目录及说明如下:applications:应用程序样例,包括wifi-iot,camera
    发表于 11-26 09:42

    android camera驱动流程是怎样的?

    android camera驱动流程是怎样的?
    发表于 03-03 08:04

    OpenHarmony下载

    OpenHarmony官方认证后,贡献代码到OpenHarmony社区。修复OpenHarmony的问题。学习OpenHarmony源码
    发表于 03-09 18:36

    AP侧中网相关的PLMN业务源码流程解读

    搜网流程可以简单概括为 PLMN 选择、小区搜索、网络注册,而 PLMN 选择主要在 cp 侧完成,而 PLMN在 OpenHarmony 源码中(即 AP 侧)主要涉及到的业务就是搜网模块中
    发表于 03-24 15:48

    如何导入OpenHarmony源码

      Import Project适用于打开DevEco Device Tool创建的工程项目和获取的OpenHarmony源码。如果是打开OpenHarmony源码,在打开工程时,点击
    发表于 04-12 11:16

    OpenHarmony开发——系统源码编译

    背景随着OpenHarmony-v3.1的发布,越来越多的开发者将目光聚焦到OpenHarmony系统开发上。对于首次接触OpenHarmony的开发者来说,如何进行源码编译是一个大难
    发表于 08-30 10:08

    OpenHarmony Camera源码分析

    OpenHarmony Camera源码工作整个流程。关于
    发表于 09-06 11:21

    IP camera的开源系统

    Xilinx FPGA工程例子源码:IP camera的开源系统
    发表于 06-07 14:13 13次下载

    openharmony刷机教程 源码获取概述

    。许多人搞不懂openharmony如何用,下面小编带来openharmony刷机教程。 openharmony从代码仓库源码获取概述 首先注册码云gitee账号以及码云SSH公钥,之
    的头像 发表于 06-22 10:37 2872次阅读

    openharmony升级 openharmony源码获取

    openharmony源码获取 适合刚接触OpenHarmony不久、想进行快速开发的用户。能够在在HPM网站获取下载开源发行版,或者在开源发行版的基础上定制。之后用hpm-cli把相关的组件还有工具下载安装。 首先自己要安装好
    的头像 发表于 06-23 09:51 2060次阅读

    openharmony源码地址 openharmony编译运行

    一、Openharmony源码地址以及获取方式 开源代码仓库地址:https://openharmony.gitee.com 1:从镜像站点下载归档后的发行版压缩文件。 2:通过HPM包管理器获取
    的头像 发表于 06-23 10:49 2802次阅读

    openharmony源码解读

    如何获取OpenHarmony源码并说明OpenHarmony源码目录结构。OpenHarmony的代码以组件的形式开放,开发者可以通过如
    的头像 发表于 06-24 09:29 3878次阅读

    鸿蒙OpenHarmony【创建工程并获取源码

    在通过DevEco Device Tool创建OpenHarmony工程时,可自动下载相应版本的OpenHarmony源码
    的头像 发表于 04-19 21:40 444次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>【创建工程并获取<b class='flag-5'>源码</b>】