一、简介
当时,开源在科技进步和工业开展中发挥着越来越重要的作用,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相关的信息参数。
三、总结
本文首要对相机预览、摄影和录像功用的应用层进行了代码剖析,其次对结构层的流程进行了梳理,最终再对结构源码进行剖析。期望经过本文能帮助开发者开始把握OpenHarmony Camera源码作业的整个流程。关于OpenHarmony多媒体子体系方面的内容,我已经宣布过《怎么经过OpenHarmony的音频模块完成录音变速功用》《怎么经过OpenHarmony体系中集成的ffmpeg库和NAPI机制,完成更多的多媒体功用?》两篇文章,感兴趣的朋友能够点击阅览,期望我们经过学习能够把握更多OpenHarmony多媒体子体系的作业原理。