1# 智能拍摄跟踪开发指南 2<!--Kit: Mechanic Kit--> 3<!--Subsystem: Mechanic--> 4<!--Owner: @hobbycao--> 5<!--Designer: @saga2025--> 6<!--Tester: @zhaodengqi--> 7<!--Adviser: @foryourself--> 8 9从API version 20开始,支持使用机械设备管理。在视频录制和直播等应用场景中,开发者希望为拥有机械体配件设备的用户提供更丰富的拍摄体验,如人脸智能跟踪和自动构图等专业拍摄功能。 10 11智能拍摄跟踪,可以通过机械体配件设备实现人脸跟踪和物体追踪等自动化拍摄功能,提升拍摄质量和用户体验,帮助开发者构建出更智能、更高效的拍摄解决方案。 12 13## 接口介绍 14 15机械设备管理API的接口使用指导请参见[MechanicManager API参考](../reference/apis-mechanic-kit/js-apis-mechanicManager.md)。 16 17| 接口名 | 描述 | 18| -------------------------------------------------------------------- | -------------------------- | 19|on(type: 'attachStateChange', callback: Callback\<AttachStateChangeInfo>): void | 注册attachStateChange事件的回调监听,等待连接状态变化。<br>**说明**:从API version 20开始支持。| 20|off(type: 'attachStateChange', callback?: Callback\<AttachStateChangeInfo>): void | 取消注册attachStateChange事件的回调监听。<br>**说明**:从API version 20开始支持。| 21|getAttachedMechDevices(): MechInfo[] | 获取已连接的机械体设备列表。<br>**说明**:从API version 20开始支持。| 22|setCameraTrackingEnabled(isEnabled: boolean): void | 启用或禁用摄像头跟踪。<br>**说明**:从API version 20开始支持。| 23|getCameraTrackingEnabled(): boolean | 检查是否启用了摄像头跟踪。<br>**说明**:从API version 20开始支持。| 24|on(type: 'trackingStateChange', callback: Callback\<TrackingEventInfo>): void | 注册trackingStateChange事件的回调监听。<br>**说明**:从API version 20开始支持。| 25|off(type: 'trackingStateChange', callback?: Callback\<TrackingEventInfo>): void | 取消注册trackingStateChange事件的回调监听。<br>**说明**:从API version 20开始支持。| 26|setCameraTrackingLayout(trackingLayout: CameraTrackingLayout): void | 设置摄像头跟踪布局。<br>**说明**:从API version 20开始支持。| 27|getCameraTrackingLayout(): CameraTrackingLayout | 获取此机械设备摄像头跟踪布局。<br>**说明**:从API version 20开始支持。| 28|on(type: 'rotationAxesStatusChange', callback: Callback\<RotationAxesStateChangeInfo>): void | 注册rotationAxesStatusChange事件的回调监听。<br>**说明**:从API version 20开始支持。| 29|off(type: 'rotationAxesStatusChange', callback?: Callback\<RotationAxesStateChangeInfo>): void | 取消注册rotationAxesStatusChange事件的回调监听。<br>**说明**:从API version 20开始支持。| 30 31## 开发步骤 32 33### 开发准备 34 351. 一台支持MechanicKit协议的机械体配件设备。 36 372. 机械体配件设备与开发设备完成蓝牙连接。 38 39### 管理设备连接状态 40 41动态管理设备连接状态,确保设备连接或断开时应用能及时响应。 42 431. 导入机械设备管理模块文件。 44 45 ```ts 46 import mechanicManager from '@kit.MechanicKit'; 47 ``` 48 492. 获取已连接的机械设备列表。 50 51 ```ts 52 let savedMechanicIds: number[] = []; 53 54 try { 55 const devices = mechanicManager.getAttachedMechDevices(); 56 console.info('Connected devices:', devices); 57 58 devices.forEach(device => { 59 console.info(`Device ID: ${device.mechId}`); 60 console.info(`Device Name: ${device.mechName}`); 61 console.info(`Device Type: ${device.mechDeviceType}`); 62 63 //保存设备类型为GIMBAL_DEVICE的设备的MechId 64 if (device.mechDeviceType === mechanicManager.MechDeviceType.GIMBAL_DEVICE) { 65 savedMechanicIds.push(device.mechId); 66 console.info(`GIMBAL_TYPE device saved ID: ${device.mechId}`); 67 } else { 68 console.info(`Skip non-gimbal devices: ${device.mechId}`); 69 } 70 }); 71 72 console.info('List of saved gimbal device IDs:', savedMechanicIds); 73 } catch (err) { 74 console.error('Error getting attached devices:', err); 75 } 76 ``` 77 783. 监听设备连接状态变化。 79 80 ```ts 81 const attachStateChangeCallback = (info: mechanicManager.AttachStateChangeInfo) => { 82 if (info.state === mechanicManager.AttachState.ATTACHED) { 83 console.info('Device attached:', info.mechInfo); 84 // 处理设备连接逻辑 85 handleDeviceAttached(info.mechInfo); 86 } else if (info.state === mechanicManager.AttachState.DETACHED) { 87 console.info('Device detached:', info.mechInfo); 88 // 处理设备断开逻辑 89 handleDeviceDetached(info.mechInfo); 90 } 91 }; 92 93 // 注册监听 94 mechanicManager.on('attachStateChange', attachStateChangeCallback); 95 ``` 96 974. 处理设备连接和断开事件。 98 99 ```ts 100 function handleDeviceAttached(mechInfo: mechanicManager.MechInfo) { 101 console.info(`New device is connected: ${mechInfo.mechName} (ID: ${mechInfo.mechId})`); 102 savedMechanicIds.push(mechInfo.mechId); 103 // To do sth. 104 } 105 106 function handleDeviceDetached(mechInfo: mechanicManager.MechInfo) { 107 console.info(`Device disconnected: ${mechInfo.mechName} (ID: ${mechInfo.mechId})`); 108 savedMechanicIds.filter(id => id !== mechInfo.mechId); 109 // To do sth. 110 } 111 ``` 112 1135. 取消监听。 114 115 ```ts 116 // 取消特定回调的监听 117 mechanicManager.off('attachStateChange', attachStateChangeCallback); 118 ``` 119 120### 控制设备智能跟踪拍摄 121 122开启智能拍摄功能,机械体设备将自动识别人脸进行跟踪拍摄。 123 1241. 启用摄像头智能跟踪功能。 125 126 ```ts 127 try { 128 //检查前判断savedMechIds不为空 129 // 检查跟踪状态 130 const isEnabled = mechanicManager.getCameraTrackingEnabled(); 131 132 if (isEnabled == false) { 133 // 开启摄像头跟踪 134 mechanicManager.setCameraTrackingEnabled(true); 135 console.info('Camera tracking enabled'); 136 } 137 138 console.info('Is tracking currently enabled:', isEnabled); 139 } catch (err) { 140 console.error('Failed to enable camera tracking:', err); 141 } 142 ``` 143 1442. 监听跟踪变化。 145 146 ```ts 147 const trackingStateCallback = (eventInfo : mechanicManager.TrackingEventInfo) => { 148 switch (eventInfo.event) { 149 case mechanicManager.TrackingEvent.CAMERA_TRACKING_USER_ENABLED: 150 console.info('The user has enabled camera tracking'); 151 handleTrackingEnabled(); 152 break; 153 case mechanicManager.TrackingEvent.CAMERA_TRACKING_USER_DISABLED: 154 console.info('The user has disabled camera tracking'); 155 handleTrackingDisabled(); 156 break; 157 case mechanicManager.TrackingEvent.CAMERA_TRACKING_LAYOUT_CHANGED: 158 console.info('Tracking layout has changed'); 159 handleLayoutChanged(); 160 break; 161 } 162 }; 163 164 // 注册跟踪状态监听 165 mechanicManager.on('trackingStateChange', trackingStateCallback); 166 ``` 167 1683. 处理跟踪事件。 169 170 ```ts 171 function handleTrackingEnabled() { 172 console.info('Handling trace enable events'); 173 // 可以在此处更新UI状态 174 updateTrackingUI(true); 175 } 176 177 function handleTrackingDisabled() { 178 console.info('Handling trace disabled events'); 179 // 可以在此处更新UI状态 180 updateTrackingUI(false); 181 } 182 183 function handleLayoutChanged() { 184 try { 185 const newLayout = mechanicManager.getCameraTrackingLayout(); 186 console.info('New Tracking Layout:', newLayout); 187 // 根据新布局更新UI 188 updateLayoutUI(newLayout); 189 } catch (err) { 190 console.error('Failed to get new layout:', err); 191 } 192 } 193 194 function updateTrackingUI(enabled: boolean) { 195 // 更新UI显示跟踪状态 196 // To do sth. 197 console.info('Update tracking UI status:', enabled); 198 } 199 200 function updateLayoutUI(layout : mechanicManager.CameraTrackingLayout) { 201 // 更新UI显示布局状态 202 // To do sth. 203 console.info('Update layout UI:', layout); 204 } 205 ``` 206 2074. 取消监听。 208 209 ```ts 210 // 取消跟踪状态监听 211 mechanicManager.off('trackingStateChange', trackingStateCallback); 212 213 // 或者取消所有跟踪状态监听 214 mechanicManager.off('trackingStateChange'); 215 ``` 216 217### 调试验证 218 219为了确保机械设备管理功能正常工作,请按照以下步骤进行调试验证: 220 221**建立连接** 222 2231. 确保机械体配件设备与开发设备通过蓝牙成功配对并建立连接。 2242. 将开发设备正确放置在机械体配件设备上。 225 226**功能验证步骤** 227 2281. **设备列表查询**:调用 `getAttachedMechDevices` 接口查询当前已连接的机械体配件设备列表,验证设备是否正确识别。 2292. **智能拍摄跟踪**:调用 `setCameraTrackingEnabled` 启用摄像头智能跟踪功能,通过 `getCameraTrackingEnabled` 验证状态,测试机械体配件设备是否能跟随目标自动旋转。 230 231**验证结果说明** 232 233- 如果 `getAttachedMechDevices` 返回包含机械体配件设备信息的设备列表,表示设备识别正常。 234- 如果 `getCameraTrackingEnabled` 返回结果为真,表示智能拍摄跟踪启用成功。