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