HDR 开了画面却忽明忽暗:HarmonyOS 7 VideoProcessor 状态监听与回退实战
菜谱视频打开 HDR 后,顶部按钮显示“已开启”,但切换视频或应用退后台再回来时画面亮度跳变;埋点只有按钮值,没有处理器状态,也无法判断是资源不支持、处理器忙还是已经回退。
本文交付:一套 VideoHdrCoordinator、状态到 UI 的映射、短视频预览与全屏播放两个案例,以及监听解绑检查表。。
图中的每条箭头都应对应一条可查询日志:输入、平台调用、状态映射、UI 或降级结果。只有 UI 变化而没有中间证据,后续仍然难以区分接口失败和页面逻辑错误。
两种行为不同的案例
案例一:列表短视频预览
滚动离开可见区就停止监听并回到 SDR,避免多个预览同时占用处理资源。
案例二:全屏步骤视频
保持用户选择,但以处理器状态为准展示“准备中、HDR、生效失败、已回退”,切源时重新绑定。
复现与验证
- 准备一段 HDR 候选视频和一段普通 SDR 视频。
- 记录按钮意图值、sourceId、getStatus 和回调状态。
- 快速切换视频、前后台切换并滚动预览列表。
- 确认旧 sourceId 的回调不会覆盖新视频。
- 解绑后检查监听数量归零,并验证 SDR 回退文案。
| 输入/场景 | 预期分支 | 验收信号 |
|---|---|---|
| 初始 SDR | off | 不显示已开启 |
| 请求 HDR | preparing | 显示准备中 |
| 处理器生效 | active | 显示 HDR |
| 资源不支持 | fallback | 保持可播放 |
| 快速切源 | 忽略旧回调 | 新源状态正确 |
| 离开页面 | offStatusChange | 无悬挂监听 |
官方依据与版本边界
官方变更页:https://developer.huawei.com/consumer/cn/doc/doccenter-release-notes/js-apidiff-mediakit-7003
- Media Kit 新增 videoProcessing 能力。
- VideoProcessor 可读取 getStatus。
- 可通过 onStatusChange/offStatusChange 管理状态监听。
- AI HDR 状态变化不能由按钮开关替代。
本文依据 HarmonyOS 7.0.0 Release(API 26)官方变更说明梳理接口,并对状态模型、分支选择和异常映射做了宿主侧 TypeScript 测试。当前本机 SDK 为 API 24,且没有连接 HDC 设备,因此不把示例描述为 API 26 编译通过、真机性能数据或上架审核结论。接入前请在 API 26 工程中按文末清单完成编译、设备与回归验证。
可复用的 ArkTS 集成片段
typeHdrUi='off'|'preparing'|'active'|'fallback'++exportclassVideoHdrCoordinator{+privateui:HdrUi='off'+privatesourceId=''++bind(processor:videoProcessing.VideoProcessor,sourceId:string){+this.sourceId=sourceId+constcurrent=processor.getStatus()+this.ui=this.mapStatus(current)+processor.onStatusChange((status)=>{+if(this.sourceId!==sourceId)return+this.ui=this.mapStatus(status)+AppStorage.setOrCreate('hdrUi',this.ui)+})+}++unbind(processor:videoProcessing.VideoProcessor){+processor.offStatusChange()+this.sourceId=''+this.ui='off'+}++privatemapStatus(status:number):HdrUi{+if(status===1)return'preparing'+if(status===2)return'active'+return'fallback'+}+}代码刻意把平台调用和业务状态分开:平台返回什么就记录什么,页面只消费稳定状态。接入时还应补齐项目的日志域、错误码类型和生命周期释放。
取舍与落地清单
UI 直接绑定开关值最简单,但会把“用户想开”误写成“处理器已生效”。状态机多了几种中间态,却能让播放、埋点和问题定位说同一种语言。
- 已用 API 26 工程编译,并记录 SDK 与设备版本
- 已覆盖“列表短视频预览”和“全屏步骤视频”两类行为
- 已记录成功、失败、降级三条路径的输入与结果
- 已核对监听、对象或任务的释放与幂等行为
- 已把本文宿主测试替换为项目自己的真机证据
小结
一套 VideoHdrCoordinator、状态到 UI 的映射、短视频预览与全屏播放两个案例,以及监听解绑检查表。。建议先在最小页面复现,再接入完整“中式美食”流程;先证明状态链正确,再谈动画、缓存或埋点优化。