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元数据(Metadata)是对相机返回的图像信息数据的描述和上下文,针对图像信息,提供的更详细的数据,如照片或视频中,识别人像的取景框坐标等信息。 10 11Metadata主要是通过一个TAG(Key),去找对应的Data,用于传递参数和配置信息,减少内存拷贝操作。 12 13## 开发步骤 14 15详细的API说明请参考[Camera API参考](../../reference/apis-camera-kit/capi-oh-camera.md)。 16 171. 导入NDK接口,导入方法如下。 18 19 ```c++ 20 // 导入NDK接口头文件。 21 #include "hilog/log.h" 22 #include "ohcamera/camera.h" 23 #include "ohcamera/camera_input.h" 24 #include "ohcamera/capture_session.h" 25 #include "ohcamera/photo_output.h" 26 #include "ohcamera/preview_output.h" 27 #include "ohcamera/video_output.h" 28 #include "ohcamera/camera_manager.h" 29 ``` 30 312. 在CMake脚本中链接相关动态库。 32 33 ```txt 34 target_link_libraries(entry PUBLIC 35 libace_napi.z.so 36 libohcamera.so 37 libhilog_ndk.z.so 38 ) 39 ``` 40 413. 调用OH_CameraManager_GetSupportedCameraOutputCapability()方法,获取当前设备支持的元数据类型metaDataObjectType,并通过OH_CameraManager_CreateMetadataOutput()方法创建元数据输出流。 42 43 ```c++ 44 Camera_MetadataOutput* CreateMetadataOutput(Camera_Manager* cameraManager, 45 Camera_OutputCapability* cameraOutputCapability) 46 { 47 Camera_MetadataOutput* metadataOutput = nullptr; 48 if (cameraOutputCapability->supportedMetadataObjectTypes == nullptr) { 49 return metadataOutput; 50 } 51 Camera_MetadataObjectType* metaDataObjectType = nullptr; 52 bool isSupported = false; 53 for (int index = 0; index < cameraOutputCapability->metadataProfilesSize; index++) { 54 if (cameraOutputCapability->supportedMetadataObjectTypes[index] != nullptr && 55 *cameraOutputCapability->supportedMetadataObjectTypes[index] == FACE_DETECTION) { 56 metaDataObjectType = *cameraOutputCapability->supportedMetadataObjectTypes; 57 isSupported = true; 58 break; 59 } 60 } 61 if (!isSupported || metaDataObjectType == nullptr) { 62 OH_LOG_ERROR(LOG_APP, "FACE_DETECTION is not supported."); 63 return metadataOutput; 64 } 65 66 Camera_ErrorCode ret = OH_CameraManager_CreateMetadataOutput(cameraManager, metaDataObjectType, &metadataOutput); 67 if (metadataOutput == nullptr || ret != CAMERA_OK) { 68 OH_LOG_ERROR(LOG_APP, "CreateMetadataOutput failed."); 69 } 70 return metadataOutput; 71 } 72 ``` 73 744. 调用start()方法输出metadata数据,接口调用失败时,会返回相应错误码。 75 76 ```c++ 77 Camera_ErrorCode StartMetadataOutput(Camera_MetadataOutput* metadataOutput) 78 { 79 Camera_ErrorCode ret = OH_MetadataOutput_Start(metadataOutput); 80 if (ret != CAMERA_OK) { 81 OH_LOG_ERROR(LOG_APP, "OH_MetadataOutput_Start failed."); 82 } 83 return ret; 84 } 85 ``` 86 875. 调用stop()方法停止输出metadata数据,接口调用失败会返回相应错误码。 88 89 ```c++ 90 Camera_ErrorCode StopMetadataOutput(Camera_MetadataOutput* metadataOutput) 91 { 92 Camera_ErrorCode ret = OH_MetadataOutput_Stop(metadataOutput); 93 if (ret != CAMERA_OK) { 94 OH_LOG_ERROR(LOG_APP, "OH_MetadataOutput_Stop failed."); 95 } 96 return ret; 97 } 98 ``` 99 100## 状态监听 101 102在相机应用开发过程中,可以随时监听metadata数据以及输出流的状态。 103 104- 通过注册监听获取metadata对象,监听事件固定为metadataObjectsAvailable。检测到有效metadata数据时,callback返回相应的metadata数据信息,metadataOutput创建成功时可监听。 105 ```c++ 106 void OnMetadataObjectAvailable(Camera_MetadataOutput* metadataOutput, 107 Camera_MetadataObject* metadataObject, uint32_t size) 108 { 109 OH_LOG_INFO(LOG_APP, "size = %{public}d", size); 110 } 111 ``` 112 113 > **说明:** 114 > 115 > 当前的元数据类型仅支持人脸检测(FACE_DETECTION)功能。元数据信息对象为识别到的人脸区域的矩形信息(Rect),包含矩形区域的左上角x坐标、y坐标和矩形的宽高数据。 116 117- 通过注册回调函数,获取监听metadata流的错误结果,callback返回metadata输出接口使用错误时返回的错误码,错误码类型参见[Camera_ErrorCode](../../reference/apis-camera-kit/capi-camera-h.md#camera_errorcode)。 118 119 ```c++ 120 void OnMetadataOutputError(Camera_MetadataOutput* metadataOutput, Camera_ErrorCode errorCode) 121 { 122 OH_LOG_INFO(LOG_APP, "OnMetadataOutput errorCode = %{public}d", errorCode); 123 } 124 ``` 125 126 ```c++ 127 MetadataOutput_Callbacks* GetMetadataOutputListener(void) 128 { 129 static MetadataOutput_Callbacks metadataOutputListener = { 130 .onMetadataObjectAvailable = OnMetadataObjectAvailable, 131 .onError = OnMetadataOutputError 132 }; 133 return &metadataOutputListener; 134 } 135 Camera_ErrorCode RegisterMetadataOutputCallback(Camera_MetadataOutput* metadataOutput) 136 { 137 Camera_ErrorCode ret = OH_MetadataOutput_RegisterCallback(metadataOutput, GetMetadataOutputListener()); 138 if (ret != CAMERA_OK) { 139 OH_LOG_ERROR(LOG_APP, "OH_MetadataOutput_RegisterCallback failed."); 140 } 141 return ret; 142 } 143 ```