
OpenHarmony 3.2 Beta多媒体系列——视频录制
一、简介
媒体子系统为开发者提供了媒体相关的很多功能,本文针对其中的视频录制功能做个详细的介绍。首先,我将通过媒体子系统提供的视频录制Test代码作为切入点,给大家梳理一下整个录制的流程。
二、目录
foundation/multimedia/camera_framework
三、录制的总体流程
四、Native接口使用
在OpenAtom OpenHarmony(以下简称“OpenHarmony”)系统中,多媒体子系统通过N-API接口提供给上层JS调用,N-API相当于是JS和Native之间的桥梁,在OpenHarmony源码中,提供了C++直接调用视频录制功能的例子,foundation/multimedia/camera_framework/interfaces/inner_api/native/test目录中。本文章主要参考了camera_video.cpp文件中的视频录制流程。
首先根据camera_video.cpp的main方法,了解下视频录制的主要流程代码。
以上是视频录制的整体流程,其过程主要通过Camera模块支持的能力来实现,其中涉及几个重要的类:CaptureSession、CameraInput、VideoOutput。CaptureSession是整个过程的控制者,CameraInput和VideoOutput相当于是设备的输入和输出。
五、调用流程
后续主要针对上面的调用流程,梳理具体的调用流程,方便我们对了解视频录制的整理架构有一个更加深入的了解。
1. 创建CameraManager实例
通过CameraManager::GetInstance()获取CameraManager的实例,后续的一些接口都是通过该实例进行调用的。GetInstance使用了单例模式,在OpenHarmony代码中这种方式很常见。
2. 获取支持的相机设备列表
通过调用CameraManager的GetSupportedCameras()接口,获取设备支持的CameraDevice列表。跟踪代码可以发现serviceProxy_->GetCameras最终会调用到Camera服务端的对应接口。
3. 创建采集会话
下面是比较重要的环节,通过调用CameraManager的CreateCaptureSession接口创建采集会话。CameraManager创建采集会话,是通过serviceProxy_->CreateCaptureSession方式进行调用,这里涉及到了OpenHarmony中的IPC的调用,serviceProxy_是远端服务在本地的代理,通过这个代理可以调用到具体的服务端,这里是HCameraService。
代码最终来到HCameraService::CreateCaptureSession中,该方法中new了一个HCaptureSession对象,并且将该对象传递给了参数session,所以前面的captureSession对象就是这里new出来的HCaptureSession,前面的CameraManager的CreateCaptureSession()方法中将captureSession封装成CaptureSession对象返回给应用层使用。
4. 开始配置采集会话
调用CaptureSession的BeginConfig进行采集会话的配置工作。这个工作最终调用到被封装的HCaptureSession中。
5. 创建CameraInput
应用层通过camManagerObj->CreateCameraInput(cameraObjList[0])的方式进行CameraInput的创建,cameraObjList[0]就是前面获取支持设备的第一个。根据CameraDevice创建对应的CameraInput对象。
6. 开启CameraInput
调用了CameraInput的Open方法,进行输入设备的启动打开。
7. 添加CameraInput实例到采集会话中
通过调用captureSession的AddInput方法,将创建的CameraInput对象添加到采集会话的输入中,这样采集会话就知道采集输入的设备。
最终调用到HCaptureSession的AddInput方法,该方法中核心的代码是tempCameraDevices_.emplace_back(localCameraDevice),将需要添加的CameraDevice插入到tempCameraDevices_容器中。
8. 创建Video的Surface
通过Surface::CreateSurfaceAsConsumer创建Surface。
9. 创建VideoOutput实例
通过调用CameraManager的CreateVideoOutput来创建VideoOutput实例。
该方法中通过IPC的调用最终调用到了HCameraService的CreateVideoOutput(Surface->GetProducer(), format, streamRepeat)。
HCameraService的CreateVideoOutput方法中主要创建了HStreamRepeat,并且通过参数传递给前面的CameraManager使用,CameraManager通过传递的HStreamRepeat对象,进行封装,创建出VideoOutput对象。
10. 添加videoOutput到采集会话中,并且提交采集会话
该步骤类似添加CameraInput到采集会话的过程,可以参考前面的流程。
11. 开始录制
通过调用VideoOutput的Start进行录制的操作。
该方法中会调用到HStreamRepeat的Start方法。
核心的代码是streamOperator_->Capture,其中最后一个参数true,表示采集连续数据。
12. 录制结束,保存录制文件
六、总结
本文主要对OpenHarmony 3.2 Beta多媒体子系统的视频录制进行介绍,首先梳理了整体的录制流程,然后对录制过程中的主要步骤进行了详细地分析。视频录制主要分为以下几个步骤:
(1) 获取CameraManager实例。
(2) 创建采集会话CaptureSession。
(3) 创建CameraInput实例,并且将输入设备添加到CaptureSession中。
(4) 创建Video录制需要的Surface。
(5) 创建VideoOutput实例,并且将输出添加到CaptureSession中。
(6) 提交采集会话的配置。
(7) 调用VideoOutput的Start方法,进行视频的录制。
(8) 录制结束,保存录制的文件。
关于OpenHarmony 3.2 Beta多媒体系列开发,我之前还分享过
《OpenHarmony 3.2 Beta源码分析之MediaLibrary》
《OpenHarmony 3.2 Beta多媒体系列——音视频播放框架》
《OpenHarmony 3.2 Beta多媒体系列——音视频播放gstreamer》
这几篇文章,欢迎感兴趣的开发者进行阅读。
本文转载自OpenAtom OpenHarmony公众号,请点击阅读原文
