查看: 157|回复: 1

HarmonyOS 6.1.1 相机延迟预览与影随人动实战解析

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在移动应用开发中,相机启动速度直接影响用户体验。传统相机配流模式存在时序死锁:Session配流必须等待UI层XComponent准备完毕(提供SurfaceId)后才能执行,导致物理初始化流水线闲置。HarmonyOS 6.1.1(API 24)Camera Kit通过延迟预览配流(Deferred Preview)和影随人动(AUTO_FRAMING)两项特性,打破这一局限。

一、延迟预览:UI与硬件的物理级解耦
核心接口为createDeferredPreviewOutput(profile: Profile): PreviewOutput,允许在无Surface的情况下创建合法预览管道。开发者可在后台Worker提前执行session.start(),将硬件热启动任务前移。当UI层XComponent就绪后,调用addDeferredSurface(surfaceId: string): void将Surface热插拔进已沸腾的管道,实现首帧瞬间出图。
该特性仅适用于PreviewOutput,不可用于PhotoOutput或VideoOutput,否则session.commitConfig()会抛出7400101异常。

二、影随人动:底层硬件级追踪
无需自行集成AI人脸库,开启AUTO_FRAMING后,相机会根据画面内人物位置和数量,自动利用冗余像素进行平滑裁剪与数码变焦,锁定目标主体。注意:在开启AUTO_FRAMING时,建议将OIS(光学防抖)设为AUTO模式,避免与硬件裁剪产生冲突。

三、实战:延迟配流安全实现
以下代码展示了如何通过结构化类型重叠安全调用Beta接口,实现空载管道预热与Surface热插拔。
  1. import { camera } from '@kit.CameraKit';
  2. interface CameraManagerExt {
  3.   createDeferredPreviewOutput?(profile: camera.Profile): camera.PreviewOutput;
  4. }
  5. interface PreviewOutputExt {
  6.   addDeferredSurface?(surfaceId: string): void;
  7. }
  8. async function igniteDeferredPipeline(manager: camera.CameraManager) {
  9.   const extManager = manager as CameraManagerExt;
  10.   if (!extManager.createDeferredPreviewOutput) {
  11.     // 旧设备回退逻辑
  12.     return;
  13.   }
  14.   const cameras = manager.getSupportedCameras();
  15.   const cameraInput = manager.createCameraInput(cameras[0]);
  16.   await cameraInput.open();
  17.   const profiles = manager.getSupportedOutputCapability(cameras[0], camera.SceneMode.NORMAL_VIDEO).previewProfiles;
  18.   const deferredOutput = extManager.createDeferredPreviewOutput(profiles[0]);
  19.   const session = manager.createSession(camera.SceneMode.NORMAL_VIDEO);
  20.   session.beginConfig();
  21.   session.addInput(cameraInput);
  22.   session.addOutput(deferredOutput);
  23.   await session.commitConfig();
  24.   await session.start();
  25.   // 此时硬件已在空转,UI仍黑屏
  26. }
  27. function attachSurfaceHotPlug(output: camera.PreviewOutput, surfaceId: string) {
  28.   const extOutput = output as PreviewOutputExt;
  29.   if (extOutput.addDeferredSurface) {
  30.     extOutput.addDeferredSurface(surfaceId);
  31.     // 首帧出图
  32.   }
  33. }
复制代码
注意:结构化类型转换必须使用精确的类型断言(as CameraManagerExt),不可用as unknown as,否则ArkTS 4.0严格语法检查会阻止编译。

四、避坑指南
1. 延迟装填仅限PreviewOutput,对PhotoOutput/VideoOutput无效,强行使用会导致参数错误异常。
2. 开启影随人动时,建议将OIS设为AUTO模式,避免软件防抖与硬件防抖冲突。
3. 结构化类型污染:在调用createDeferredPreviewOutput前,需通过条件判断确认方法存在,并严格按接口定义转型。

五、总结
HarmonyOS 6.1.1通过createDeferredPreviewOutput和addDeferredSurface实现了UI线程与硬件总线的物理级解耦,大幅缩短相机启动黑屏时间。影随人动与更开放的传感器信息(如Bayer排列)进一步释放硬件潜力,标志着相机框架从“可用”迈向“极致性能与极客自由度”。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: HarmonyOS 6.1.1 相机延迟预览与影随人动实战解析

楼主的实战解析很详细,特别是延迟预览中`createDeferredPreviewOutput`与`addDeferredSurface`的配合机制,把UI准备和硬件启动彻底解耦的思路非常巧妙。想请教一下,在开启影随人动时,如果画面中人物数量突然增加或快速移动,数码变焦的平滑度表现如何?有没有遇到过画面“跳变”的边界情况?另外,结构化类型转换在旧设备回退逻辑中,有没有推荐的更安全的兜底方式?感谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-4 13:51 , Processed in 0.024330 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部