百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

OpenHarmony Camera源码分析(开源相机opencamera)

moboyou 2025-07-23 17:46 4 浏览

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、简介

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

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

二、OpenHarmony相机子系统

(1)系统简介

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

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

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

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

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

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

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

(2)功能模块

会话管理模块

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

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

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

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

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

camera_standard\interfaces\inner_api\native\test目录下应用文件进行拍照、预览和录像功能的使用,进行源码分析。

拍照源码分析

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

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

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

① 创建采集会话

App侧先调用CameraManager的CreateCaptureSession接口。

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

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

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

调用Surface的CreateSurfaceAsConsumer接口。

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

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

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

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

③ 拍摄照片

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

通过streamCapture_调用到了HstreamCapture的Capture接口。

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

预览源码分析

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

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

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

① 创建预览输出

首先调用CameraManager的CreateCustomPreviewOutput接口。

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

②开始预览

首先调用CaptureSession的Start接口。

接着调用HCaptureSession的Start接口。

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

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

录像源码分析

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

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

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

①创建录像输出

首先调用CameraManager的CreateVideoOutput接口,在CameraManager会调用serviceProxy_变量的CreateVideoOutput.

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

②开始录像

首先调用VideoOutput的Start接口,接着会调用到streamRepeat_的Start接口。

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

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

三、总结

本文首先对相机预览、拍照和录像功能的应用层进行了代码分析,其次对框架层的流程进行了梳理,最后再对框架源码进行分析。

相关推荐

8个最好的WordPress缓存优化插件介绍2023

如果你的WordPress网站打开非常缓慢,它大大增加了访客离开的几率,毕竟没有多少人有这么多耐心。所以提高你的WordPress网站速度的一个好方法是使用WordPress的缓存插件。在这篇文章中,...

WordPress插件依赖症晚期:为什么你的网站装了50个插件还能跑?

最近接手一个"插件博物馆"级别的网站——装了58个插件,首页加载8秒,后台卡到连发布文章都要念佛经祈求不报错。客户还一脸天真:"可是每个插件都说自己能提升性能啊!"插件...

WordPress 网站缓存插件推荐:WP Rocket

WPRocket是WordPress的高级缓存插件。由于该插件仅是高级插件,因此非常注重高质量的支持。它背后的团队非常乐意帮助解决可能出现的任何疑问或问题。WPRocket的优点一键配置自...

(合集)小众但好用的WordPress插件

还在犹豫什么?好运的机会稍纵即逝!赶紧关注我,一起开启幸运之旅吧!祝您财运亨通,心想事成!(合集)小众但好用的WordPress插件WordPress插件江湖:一场“小众”与“大众”的暗战老王,一位浸...

WordPress外贸站插件大战:27个插件互相打架差点搞垮网站

今天遇到个奇葩问题,客户网站莫名其妙白屏了诡异现象:前台白屏,后台能进错误日志疯狂刷屏,1小时500MBCPU占用率飙到100%,服务器快冒烟了技术侦探过程:一查插件列表直接惊呆了!客户装了2...

WordPress外贸站插件选择:别让插件“增肥”了你的网站

上个星期,一个做跨境电商的客户找我,问他站点咋回事,后台慢得要死,每个页面都加载几秒钟。他已经装了10多个插件,包括好几个外贸常见的支付、SEO、表单、社交分享插件。我一看后台,发现他装的插件里大多功...

7个最好的WordPress数据库优化插件

每个WordPress网站都有数据库,它包含了你网站上的所有信息,从用户数据到评论、文章等等。随着你的网站的增长,它的数据库也在增长,在许多情况下,你最终会储存大量的信息,远远超出了它的用途。这可能会...

uniapp中使用ace在网页上做代码编辑器

A、安装npminstallace-buildsB、在uniapp中使用<template><viewclass="content"><...

视频下载工具,Downlodr软件体验(视频下载器android)

经常给大家分享软件,果核在后台也能收到很多朋友的许愿,想要找某一款软件,有没有更好的替代品等等,上周看到有朋友说想要一款下载器,用来下载油管上的内容。这类工具其实有挺多的,在网上搜索一下也能找到不少,...

2025年,几款视频制作软件让你轻松成为剪辑高手

在众多的视频制作软件中,万兴喵影以其强大的功能和易用性脱颖而出。它不仅支持多种格式的导入导出,还有丰富的模板与素材库,非常适合初学者和专业用户使用。除了万兴喵影,还有一些其他国外的视频制作软件也值得推...

为什么现在很多软件都基于Electron开发?

前段时间小白在聊到电脑内存这个玩意儿的时候,大部分小伙伴都表示:新电脑至少32GB运行内存起步。对于这个答案,小白并不否认。因为小白的电脑也是至少32GB起步的(但是因为兜里空空,所以没办法把常用的M...

前端黑科技:PWA,让网页像App一样好用

PWA是什么?想象一下:你的网页应用不用安装,却能像微信小程序一样秒开,还能离线使用、推送通知,甚至被用户添加到手机桌面——这就是PWA(渐进式Web应用)。Google在2016年推出的这项技术,让...

免费在线装柜软件哪家好用(在线装柜计算软件)

在出口行业,有一个常被忽视却影响巨大的环节——集装箱装柜规划。一旦方案失误,不仅导致出货延误、运输成本上升,甚至还可能造成货损或退运。对于习惯“凭经验装柜”的企业而言,货物越来越多样化、运输方式更加复...

PakePlus:开源免费,一键打包网页为桌面与移动应用的神器

软件介绍该开源项目的功能非常简单,就是可以直接将网页打包成不同平台的程序,可以是应用也可以是app,非常适合一些站长但是不会创建app的情况。不过使用该软件进行站点打包之前你需要拥有一个github账...

如何对dedeCMS的开源程序进行二次开发

二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能和效果,一般来说都不会改变原有系统的内核。为了让更多人了解二次开发,并更方便的了解DedeCMS的二次开发,下面将会...