• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 预览(C/C++)
2<!--Kit: Camera Kit-->
3<!--Subsystem: Multimedia-->
4<!--Owner: @qano-->
5<!--Designer: @leo_ysl-->
6<!--Tester: @xchaosioda-->
7<!--Adviser: @zengyawen-->
8
9预览是启动相机后看见的画面,通常在拍照和录像前执行。
10
11## 开发步骤
12
13详细的API说明请参考[Camera API参考](../../reference/apis-camera-kit/capi-oh-camera.md)。
14
151. 导入NDK接口,接口中提供了相机相关的属性和方法,导入方法如下。
16
17   ```c++
18   // 导入NDK接口头文件。
19   #include "hilog/log.h"
20   #include "ohcamera/camera.h"
21   #include "ohcamera/camera_input.h"
22   #include "ohcamera/capture_session.h"
23   #include "ohcamera/photo_output.h"
24   #include "ohcamera/preview_output.h"
25   #include "ohcamera/video_output.h"
26   #include "ohcamera/camera_manager.h"
27   ```
28
292. 在CMake脚本中链接相关动态库。
30
31   ```txt
32   target_link_libraries(entry PUBLIC
33       libace_napi.z.so
34       libohcamera.so
35       libhilog_ndk.z.so
36   )
37   ```
38
393. 获取SurfaceId。
40
41    XComponent组件为预览流提供的SurfaceId,而XComponent的能力由UI提供,相关介绍可参考[XComponent组件参考](../../reference/apis-arkui/arkui-ts/ts-basic-components-xcomponent.md)。
42
434. 根据传入的SurfaceId,通过[OH_CameraManager_GetSupportedCameraOutputCapability()](../../reference/apis-camera-kit/capi-camera-manager-h.md#oh_cameramanager_getsupportedcameraoutputcapability)方法获取当前设备支持的预览能力。通过[OH_CameraManager_CreatePreviewOutput()](../../reference/apis-camera-kit/capi-camera-manager-h.md#oh_cameramanager_createpreviewoutput)方法创建预览输出流,其中,OH_CameraManager_CreatePreviewOutput()方法中的参数分别是cameraManager指针,previewProfiles数组中的第一项,步骤三中获取的surfaceId,以及返回的previewOutput指针。
44
45    ```c++
46    Camera_PreviewOutput* CreatePreviewOutput(char* previewSurfaceIdstr, Camera_Manager* cameraManager,
47        const Camera_Profile* previewProfile)
48    {
49        Camera_PreviewOutput* previewOutput = nullptr;
50        Camera_ErrorCode ret = OH_CameraManager_CreatePreviewOutput(cameraManager, previewProfile,
51            previewSurfaceIdstr, &previewOutput);
52        if (previewOutput == nullptr || ret != CAMERA_OK) {
53            OH_LOG_ERROR(LOG_APP, "OH_CameraManager_CreatePreviewOutput failed.");
54        }
55        return previewOutput;
56    }
57    ```
58
595. 使能。当session完成CommitConfig后通过调用[OH_CaptureSession_Start()](../../reference/apis-camera-kit/capi-capture-session-h.md#oh_capturesession_start)方法输出预览流,接口调用失败会返回相应错误码,错误码类型参见[Camera_ErrorCode](../../reference/apis-camera-kit/capi-camera-h.md#camera_errorcode)。
60
61   ```c++
62   Camera_ErrorCode SessionStart(Camera_CaptureSession* captureSession)
63   {
64       Camera_ErrorCode ret = OH_CaptureSession_Start(captureSession);
65       if (ret != CAMERA_OK) {
66           OH_LOG_ERROR(LOG_APP, "OH_CaptureSession_Start failed.");
67       }
68       return ret;
69   }
70   ```
71
726. 通过[OH_CaptureSession_Stop()](../../reference/apis-camera-kit/capi-capture-session-h.md#oh_capturesession_stop)方法停止预览流,接口调用失败会返回相应错误码,错误码类型参见[Camera_ErrorCode](../../reference/apis-camera-kit/capi-camera-h.md#camera_errorcode)。
73
74   ```c++
75   Camera_ErrorCode SessionStop(Camera_CaptureSession* captureSession)
76   {
77       Camera_ErrorCode ret = OH_CaptureSession_Stop(captureSession);
78       if (ret != CAMERA_OK) {
79           OH_LOG_ERROR(LOG_APP, "OH_CaptureSession_Stop failed.");
80       }
81       return ret;
82   }
83   ```
84
85## 状态监听
86
87在相机应用开发过程中,可以随时监听预览输出流状态,包括预览流启动、预览流结束、预览流输出错误。
88
89- 通过注册固定的frameStart回调函数获取监听预览启动结果,previewOutput创建成功时即可监听,预览第一次曝光时触发,有该事件返回结果则认为预览流已启动。
90
91  ```c++
92  void PreviewOutputOnFrameStart(Camera_PreviewOutput* previewOutput)
93  {
94      OH_LOG_INFO(LOG_APP, "PreviewOutputOnFrameStart");
95  }
96  ```
97
98- 通过注册固定的frameEnd回调函数获取监听预览结束结果,previewOutput创建成功时即可监听,预览完成最后一帧时触发,有该事件返回结果则认为预览流已结束。
99
100  ```c++
101  void PreviewOutputOnFrameEnd(Camera_PreviewOutput* previewOutput, int32_t frameCount)
102  {
103      OH_LOG_INFO(LOG_APP, "PreviewOutput frameCount = %{public}d", frameCount);
104  }
105  ```
106
107- 通过注册固定的error回调函数获取监听预览输出错误结果,callback返回预览输出接口使用错误时对应的错误码,错误码类型参见[Camera_ErrorCode](../../reference/apis-camera-kit/capi-camera-h.md#camera_errorcode)。
108
109  ```c++
110  void PreviewOutputOnError(Camera_PreviewOutput* previewOutput, Camera_ErrorCode errorCode)
111  {
112      OH_LOG_ERROR(LOG_APP, "PreviewOutput errorCode = %{public}d", errorCode);
113  }
114  ```
115  ```c++
116  PreviewOutput_Callbacks* GetPreviewOutputListener(void)
117  {
118      static PreviewOutput_Callbacks previewOutputListener = {
119          .onFrameStart = PreviewOutputOnFrameStart,
120          .onFrameEnd = PreviewOutputOnFrameEnd,
121          .onError = PreviewOutputOnError
122      };
123      return &previewOutputListener;
124  }
125  Camera_ErrorCode RegisterPreviewOutputCallback(Camera_PreviewOutput* previewOutput)
126  {
127      Camera_ErrorCode ret = OH_PreviewOutput_RegisterCallback(previewOutput, GetPreviewOutputListener());
128      if (ret != CAMERA_OK) {
129          OH_LOG_ERROR(LOG_APP, "OH_PreviewOutput_RegisterCallback failed.");
130      }
131      return ret;
132  }
133  ```